@@ -8,43 +8,86 @@ export default DesktopAppPage;
88
99export const getServerSideProps : GetServerSideProps < any > = async ( { res, locale = "en" } ) => {
1010 const octokit = new Octokit ( ) ;
11- const response = await octokit . request ( "GET /repos/{owner}/{repo}/releases/latest" , {
12- owner : "cohstats" ,
13- repo : "coh3-stats-desktop-app" ,
14- headers : {
15- "X-GitHub-Api-Version" : "2022-11-28" ,
16- } ,
17- } ) ;
1811
1912 console . log ( `SSR - /desktop-app` ) ;
2013
2114 let downloadURL = "https://github.com/cohstats/coh3-stats-desktop-app/releases/latest" ; // fallback in case request fails
2215 let downloadCount = 0 ;
2316 let version = "" ;
24- if ( response . status === 200 ) {
25- const assets = response . data . assets . filter ( ( asset : { browser_download_url : string } ) => {
26- if ( asset . browser_download_url . split ( "." ) . at ( - 1 ) === "sig" ) {
27- return false ;
28- } else if ( asset . browser_download_url . includes ( "full" ) ) {
29- return false ;
30- }
17+ let totalDownloadCount = 0 ;
3118
32- return true ;
19+ try {
20+ // Fetch last 20 releases - this includes the latest release
21+ const response = await octokit . request ( "GET /repos/{owner}/{repo}/releases" , {
22+ owner : "cohstats" ,
23+ repo : "coh3-stats-desktop-app" ,
24+ per_page : 100 ,
25+ headers : {
26+ "X-GitHub-Api-Version" : "2022-11-28" ,
27+ } ,
3328 } ) ;
34- if ( assets . length > 0 ) {
35- downloadCount = assets
36- . map ( ( asset : { download_count : any } ) => asset . download_count )
37- . reduce ( ( a : any , b : any ) => a + b ) ;
38- }
3929
40- version = "v" + response . data . tag_name ;
41- const msiAsset = assets . find (
42- ( asset : { browser_download_url : string } ) =>
43- asset . browser_download_url . split ( "." ) . at ( - 1 ) === "msi" ,
44- ) ;
45- if ( msiAsset ) {
46- downloadURL = msiAsset . browser_download_url ;
30+ if ( response . status === 200 && response . data . length > 0 ) {
31+ // Filter out draft releases
32+ const releases = response . data . filter ( ( release : { draft : boolean } ) => ! release . draft ) ;
33+
34+ if ( releases . length > 0 ) {
35+ // First release is the latest
36+ const latestRelease = releases [ 0 ] ;
37+
38+ // Get latest release info
39+ const latestAssets = latestRelease . assets . filter (
40+ ( asset : { browser_download_url : string } ) => {
41+ if ( asset . browser_download_url . split ( "." ) . at ( - 1 ) === "sig" ) {
42+ return false ;
43+ } else if ( asset . browser_download_url . includes ( "full" ) ) {
44+ return false ;
45+ }
46+ return true ;
47+ } ,
48+ ) ;
49+
50+ if ( latestAssets . length > 0 ) {
51+ downloadCount = latestAssets
52+ . map ( ( asset : { download_count : number } ) => asset . download_count )
53+ . reduce ( ( a : number , b : number ) => a + b ) ;
54+ }
55+
56+ version = "v" + latestRelease . tag_name ;
57+ const msiAsset = latestAssets . find (
58+ ( asset : { browser_download_url : string } ) =>
59+ asset . browser_download_url . split ( "." ) . at ( - 1 ) === "msi" ,
60+ ) ;
61+ if ( msiAsset ) {
62+ downloadURL = msiAsset . browser_download_url ;
63+ }
64+
65+ // Calculate total downloads across all releases
66+ totalDownloadCount = releases . reduce ( ( total : number , release : any ) => {
67+ const releaseAssets = release . assets . filter (
68+ ( asset : { browser_download_url : string } ) => {
69+ if ( asset . browser_download_url . split ( "." ) . at ( - 1 ) === "sig" ) {
70+ return false ;
71+ } else if ( asset . browser_download_url . includes ( "full" ) ) {
72+ return false ;
73+ }
74+ return true ;
75+ } ,
76+ ) ;
77+
78+ const releaseDownloads = releaseAssets . reduce (
79+ ( sum : number , asset : { download_count : number } ) => sum + asset . download_count ,
80+ 0 ,
81+ ) ;
82+
83+ return total + releaseDownloads ;
84+ } , 0 ) ;
85+ }
4786 }
87+ } catch ( error ) {
88+ console . error ( "Failed to fetch releases:" , error ) ;
89+ // If fetching releases fails, use fallback values
90+ totalDownloadCount = 0 ;
4891 }
4992
5093 res . setHeader (
@@ -56,6 +99,7 @@ export const getServerSideProps: GetServerSideProps<any> = async ({ res, locale
5699 props : {
57100 downloadURL,
58101 downloadCount,
102+ totalDownloadCount,
59103 version,
60104 ...( await serverSideTranslations ( locale , [ "common" , "desktopapp" ] ) ) ,
61105 } ,
0 commit comments