diff --git a/src/components/App/StatusBar.tsx b/src/components/App/StatusBar.tsx index 6d23dbc..4b211ba 100644 --- a/src/components/App/StatusBar.tsx +++ b/src/components/App/StatusBar.tsx @@ -20,43 +20,52 @@ export const StatusBar = ({ maxDataPoints = 60 }: StatusBarProps) => { null ); const [gpuMetrics, setGpuMetrics] = useState(null); - const { resolvedColorScheme: colorScheme } = usePreferencesStore(); + const { resolvedColorScheme: colorScheme, systemMonitoringEnabled } = + usePreferencesStore(); const { isVisible, setVisible } = useNotepadStore(); useEffect(() => { let isMounted = true; + let cleanupCpu: (() => void) | undefined; + let cleanupMemory: (() => void) | undefined; + let cleanupGpu: (() => void) | undefined; + let stopMonitoring: (() => void) | undefined; - const handleCpuMetrics = (metrics: CpuMetrics) => { - if (!isMounted) return; - setCpuMetrics(metrics); - }; + if (systemMonitoringEnabled) { + const handleCpuMetrics = (metrics: CpuMetrics) => { + if (!isMounted) return; + setCpuMetrics(metrics); + }; - const handleMemoryMetrics = (metrics: MemoryMetrics) => { - if (!isMounted) return; - setMemoryMetrics(metrics); - }; + const handleMemoryMetrics = (metrics: MemoryMetrics) => { + if (!isMounted) return; + setMemoryMetrics(metrics); + }; - const handleGpuMetrics = (metrics: GpuMetrics) => { - if (!isMounted) return; - setGpuMetrics(metrics); - }; + const handleGpuMetrics = (metrics: GpuMetrics) => { + if (!isMounted) return; + setGpuMetrics(metrics); + }; - const cleanupCpu = - window.electronAPI.monitoring.onCpuMetrics(handleCpuMetrics); - const cleanupMemory = - window.electronAPI.monitoring.onMemoryMetrics(handleMemoryMetrics); - const cleanupGpu = - window.electronAPI.monitoring.onGpuMetrics(handleGpuMetrics); - const stopMonitoring = window.electronAPI.monitoring.start(); + cleanupCpu = window.electronAPI.monitoring.onCpuMetrics(handleCpuMetrics); + cleanupMemory = + window.electronAPI.monitoring.onMemoryMetrics(handleMemoryMetrics); + cleanupGpu = window.electronAPI.monitoring.onGpuMetrics(handleGpuMetrics); + stopMonitoring = window.electronAPI.monitoring.start(); + } else { + setCpuMetrics(null); + setMemoryMetrics(null); + setGpuMetrics(null); + } return () => { isMounted = false; - cleanupCpu(); - cleanupMemory(); - cleanupGpu(); - stopMonitoring(); + cleanupCpu?.(); + cleanupMemory?.(); + cleanupGpu?.(); + stopMonitoring?.(); }; - }, [maxDataPoints]); + }, [maxDataPoints, systemMonitoringEnabled]); return ( { const [installDir, setInstallDir] = useState(''); - const { frontendPreference, setFrontendPreference } = usePreferencesStore(); + const { + frontendPreference, + setFrontendPreference, + systemMonitoringEnabled, + setSystemMonitoringEnabled, + } = usePreferencesStore(); const [frontendRequirements, setFrontendRequirements] = useState< Map >(new Map()); @@ -330,6 +336,22 @@ export const GeneralTab = ({ })()} + +
+ + System Performance + + + Monitor CPU, memory, and GPU usage in the status bar + + + setSystemMonitoringEnabled(event.currentTarget.checked) + } + /> +
); }; diff --git a/src/stores/preferences.ts b/src/stores/preferences.ts index f3a1ddb..5a023d3 100644 --- a/src/stores/preferences.ts +++ b/src/stores/preferences.ts @@ -8,9 +8,11 @@ interface PreferencesStore { frontendPreference: FrontendPreference; rawColorScheme: MantineColorScheme; resolvedColorScheme: ResolvedColorScheme; + systemMonitoringEnabled: boolean; setFrontendPreference: (preference: FrontendPreference) => void; setColorScheme: (scheme: MantineColorScheme) => Promise; + setSystemMonitoringEnabled: (enabled: boolean) => void; loadPreferences: () => Promise; } @@ -27,12 +29,18 @@ export const usePreferencesStore = create((set) => ({ frontendPreference: 'koboldcpp', rawColorScheme: 'auto', resolvedColorScheme: 'light', + systemMonitoringEnabled: true, setFrontendPreference: (preference: FrontendPreference) => { set({ frontendPreference: preference }); window.electronAPI.config.set('frontendPreference', preference); }, + setSystemMonitoringEnabled: (enabled: boolean) => { + set({ systemMonitoringEnabled: enabled }); + window.electronAPI.config.set('systemMonitoringEnabled', enabled); + }, + setColorScheme: async (scheme: MantineColorScheme) => { set({ rawColorScheme: scheme, @@ -42,17 +50,21 @@ export const usePreferencesStore = create((set) => ({ }, loadPreferences: async () => { - const [frontendPref, colorScheme] = await Promise.all([ + const [frontendPref, colorScheme, systemMonitoring] = await Promise.all([ window.electronAPI.config.get( 'frontendPreference' ) as Promise, window.electronAPI.app.getColorScheme(), + window.electronAPI.config.get( + 'systemMonitoringEnabled' + ) as Promise, ]); set({ frontendPreference: frontendPref || 'koboldcpp', rawColorScheme: colorScheme || 'auto', resolvedColorScheme: resolveColorScheme(colorScheme || 'auto'), + systemMonitoringEnabled: systemMonitoring ?? true, }); }, }));