@@ -2,78 +2,91 @@ const CACHE_KEY = "hypermind-version-check";
22const CACHE_DURATION = 86400000 ;
33
44const getCurrentVersion = ( ) => {
5- return document . body . dataset . version || "no-version" ;
5+ return document . body . dataset . version || "no-version" ;
6+ } ;
7+
8+ const isNewer = ( latest , current ) => {
9+ if ( current === "no-version" ) return true ;
10+
11+ const l = latest . split ( "." ) . map ( Number ) ;
12+ const c = current . split ( "." ) . map ( Number ) ;
13+
14+ for ( let i = 0 ; i < 3 ; i ++ ) {
15+ if ( l [ i ] > ( c [ i ] || 0 ) ) return true ;
16+ if ( l [ i ] < ( c [ i ] || 0 ) ) return false ;
17+ }
18+ return false ;
619} ;
720
821const checkForNewVersion = async ( ) => {
9- try {
10- const cached = localStorage . getItem ( CACHE_KEY ) ;
11- if ( cached ) {
12- try {
13- const parsedCache = JSON . parse ( cached ) ;
14- const now = Date . now ( ) ;
15-
16- if ( now - parsedCache . timestamp < CACHE_DURATION ) {
17- if ( parsedCache . data ) {
18- showVersionNotification ( parsedCache . data ) ;
19- }
20- return ;
21- }
22- } catch ( e ) {
23- localStorage . removeItem ( CACHE_KEY ) ;
24- }
22+ try {
23+ const cached = localStorage . getItem ( CACHE_KEY ) ;
24+ if ( cached ) {
25+ try {
26+ const parsedCache = JSON . parse ( cached ) ;
27+ const now = Date . now ( ) ;
28+
29+ if ( now - parsedCache . timestamp < CACHE_DURATION ) {
30+ if ( parsedCache . data ) {
31+ showVersionNotification ( parsedCache . data ) ;
32+ }
33+ return ;
2534 }
35+ } catch ( e ) {
36+ localStorage . removeItem ( CACHE_KEY ) ;
37+ }
38+ }
2639
27- const response = await fetch ( "/api/github/latest-release" ) ;
28- if ( ! response . ok ) return ;
40+ const response = await fetch ( "/api/github/latest-release" ) ;
41+ if ( ! response . ok ) return ;
2942
30- const release = await response . json ( ) ;
43+ const release = await response . json ( ) ;
3144
32- const cacheData = {
33- data : release ,
34- timestamp : Date . now ( ) ,
35- } ;
36- localStorage . setItem ( CACHE_KEY , JSON . stringify ( cacheData ) ) ;
45+ const cacheData = {
46+ data : release ,
47+ timestamp : Date . now ( ) ,
48+ } ;
49+ localStorage . setItem ( CACHE_KEY , JSON . stringify ( cacheData ) ) ;
3750
38- showVersionNotification ( release ) ;
39- } catch ( error ) {
40- console . error ( "Error checking for new version:" , error ) ;
41- }
51+ showVersionNotification ( release ) ;
52+ } catch ( error ) {
53+ console . error ( "Error checking for new version:" , error ) ;
54+ }
4255} ;
4356
4457const showVersionNotification = ( release ) => {
45- if ( ! release || ! release . tag_name ) return ;
58+ if ( ! release || ! release . tag_name ) return ;
4659
47- const latestVersion = release . tag_name . replace ( / ^ v / , "" ) ;
48- const currentVersion = getCurrentVersion ( ) ;
60+ const latestVersion = release . tag_name . replace ( / ^ v / , "" ) ;
61+ const currentVersion = getCurrentVersion ( ) ;
4962
50- if ( latestVersion === currentVersion ) return ;
63+ if ( ! isNewer ( latestVersion , currentVersion ) ) return ;
5164
52- const dismissedKey = `hypermind-version-dismissed-${ release . tag_name } ` ;
53- if ( localStorage . getItem ( dismissedKey ) === "true" ) return ;
65+ const dismissedKey = `hypermind-version-dismissed-${ release . tag_name } ` ;
66+ if ( localStorage . getItem ( dismissedKey ) === "true" ) return ;
5467
55- const banner = document . getElementById ( "version-notification" ) ;
56- if ( ! banner ) return ;
68+ const banner = document . getElementById ( "version-notification" ) ;
69+ if ( ! banner ) return ;
5770
58- const versionText = banner . querySelector ( ".version-text" ) ;
59- const updateLink = banner . querySelector ( ".update-link" ) ;
60- const dismissBtn = banner . querySelector ( ".dismiss-btn" ) ;
71+ const versionText = banner . querySelector ( ".version-text" ) ;
72+ const updateLink = banner . querySelector ( ".update-link" ) ;
73+ const dismissBtn = banner . querySelector ( ".dismiss-btn" ) ;
6174
62- versionText . textContent = `New version ${ release . tag_name } available!` ;
63- updateLink . href = release . html_url ;
75+ versionText . textContent = `New version ${ release . tag_name } available!` ;
76+ updateLink . href = release . html_url ;
6477
65- dismissBtn . onclick = ( ) => {
66- banner . classList . remove ( "active" ) ;
67- localStorage . setItem ( dismissedKey , "true" ) ;
68- } ;
78+ dismissBtn . onclick = ( ) => {
79+ banner . classList . remove ( "active" ) ;
80+ localStorage . setItem ( dismissedKey , "true" ) ;
81+ } ;
6982
70- setTimeout ( ( ) => {
71- banner . classList . add ( "active" ) ;
72- } , 1000 ) ;
83+ setTimeout ( ( ) => {
84+ banner . classList . add ( "active" ) ;
85+ } , 1000 ) ;
7386} ;
7487
7588if ( document . readyState === "loading" ) {
76- document . addEventListener ( "DOMContentLoaded" , checkForNewVersion ) ;
89+ document . addEventListener ( "DOMContentLoaded" , checkForNewVersion ) ;
7790} else {
78- checkForNewVersion ( ) ;
91+ checkForNewVersion ( ) ;
7992}
0 commit comments