1- import { Moon , Sun , X , Check , AlertCircle } from 'lucide-react'
2- import { useState } from 'react'
1+ import { Moon , Sun , X , Check , AlertCircle , Download } from 'lucide-react'
2+ import { useState , useEffect } from 'react'
33
44interface SettingsPanelProps {
55 darkMode : boolean
@@ -13,21 +13,48 @@ export function SettingsPanel({
1313 onClose,
1414} : SettingsPanelProps ) {
1515 const [ checkingUpdates , setCheckingUpdates ] = useState ( false )
16- const [ updateStatus , setUpdateStatus ] = useState < 'idle' | 'checking' | 'available' | 'uptodate' > ( 'idle' )
16+ const [ updateStatus , setUpdateStatus ] = useState < 'idle' | 'checking' | 'npm-available' | 'app-available' | 'uptodate' > ( 'idle' )
17+ const [ npmUpdates , setNpmUpdates ] = useState ( 0 )
18+ const [ appUpdateVersion , setAppUpdateVersion ] = useState < string | null > ( null )
19+ const [ lastChecked , setLastChecked ] = useState < Date | null > ( null )
20+
21+ useEffect ( ( ) => {
22+ window . electron . onUpdatesAvailable ( ( data : any ) => {
23+ if ( data . type === 'app' ) {
24+ setAppUpdateVersion ( data . version )
25+ setUpdateStatus ( 'app-available' )
26+ }
27+ } )
28+
29+ return ( ) => {
30+ window . electron . offUpdateReady ( )
31+ }
32+ } , [ ] )
1733
1834 async function handleCheckUpdates ( ) {
1935 setCheckingUpdates ( true )
2036 setUpdateStatus ( 'checking' )
37+ setLastChecked ( new Date ( ) )
2138
2239 try {
2340 const result = await window . electron . checkUpdates ( )
24- setUpdateStatus ( result ? 'available' : 'uptodate' )
41+
42+ if ( result . available ) {
43+ setNpmUpdates ( result . count )
44+ setUpdateStatus ( 'npm-available' )
45+ } else {
46+ setNpmUpdates ( 0 )
47+ setUpdateStatus ( 'uptodate' )
48+ }
2549
2650 setTimeout ( ( ) => {
2751 setCheckingUpdates ( false )
28- setTimeout ( ( ) => setUpdateStatus ( 'idle' ) , 3000 )
29- } , 1500 )
52+ if ( updateStatus === 'uptodate' ) {
53+ setTimeout ( ( ) => setUpdateStatus ( 'idle' ) , 2000 )
54+ }
55+ } , 500 )
3056 } catch ( err ) {
57+ console . error ( 'Check updates error:' , err )
3158 setCheckingUpdates ( false )
3259 setUpdateStatus ( 'idle' )
3360 }
@@ -77,6 +104,23 @@ export function SettingsPanel({
77104 < h3 className = "text-sm font-semibold text-slate-700 dark:text-slate-300 uppercase tracking-wide mb-4" >
78105 Updates
79106 </ h3 >
107+
108+ { appUpdateVersion && (
109+ < div className = "mb-4 p-4 bg-amber-50 dark:bg-amber-900 rounded-lg border border-amber-200 dark:border-amber-800" >
110+ < div className = "flex items-start gap-3" >
111+ < Download size = { 18 } className = "text-amber-600 dark:text-amber-400 flex-shrink-0 mt-0.5" />
112+ < div className = "flex-1" >
113+ < p className = "font-semibold text-amber-900 dark:text-amber-100" >
114+ App Update Available
115+ </ p >
116+ < p className = "text-sm text-amber-800 dark:text-amber-200 mt-1" >
117+ Version { appUpdateVersion } is downloading. Will install on next restart.
118+ </ p >
119+ </ div >
120+ </ div >
121+ </ div >
122+ ) }
123+
80124 < button
81125 onClick = { handleCheckUpdates }
82126 disabled = { checkingUpdates }
@@ -92,22 +136,30 @@ export function SettingsPanel({
92136 </ div >
93137 ) }
94138
95- { updateStatus === 'available' && (
139+ { updateStatus === 'npm- available' && (
96140 < div className = "mt-3 p-3 bg-amber-50 dark:bg-amber-900 rounded-lg flex items-center gap-2" >
97141 < AlertCircle size = { 16 } className = "text-amber-600 dark:text-amber-400 flex-shrink-0" />
98- < p className = "text-sm text-amber-900 dark:text-amber-100" > Update available</ p >
142+ < p className = "text-sm text-amber-900 dark:text-amber-100" >
143+ { npmUpdates } npm package{ npmUpdates !== 1 ? 's' : '' } available
144+ </ p >
99145 </ div >
100146 ) }
101147
102148 { updateStatus === 'uptodate' && (
103149 < div className = "mt-3 p-3 bg-green-50 dark:bg-green-900 rounded-lg flex items-center gap-2" >
104150 < Check size = { 16 } className = "text-green-600 dark:text-green-400 flex-shrink-0" />
105- < p className = "text-sm text-green-900 dark:text-green-100" > You are up to date</ p >
151+ < p className = "text-sm text-green-900 dark:text-green-100" > All up to date</ p >
106152 </ div >
107153 ) }
108154
109- < p className = "text-xs text-slate-500 dark:text-slate-500 mt-3" >
110- Automatically checks on startup. Updates install on next launch.
155+ { lastChecked && (
156+ < p className = "text-xs text-slate-500 dark:text-slate-500 mt-3" >
157+ Last checked: { lastChecked . toLocaleTimeString ( ) }
158+ </ p >
159+ ) }
160+
161+ < p className = "text-xs text-slate-500 dark:text-slate-500 mt-2" >
162+ App updates check automatically every 6 hours.
111163 </ p >
112164 </ div >
113165
0 commit comments