import { useEffect, useState } from 'react'; import { Box, Flex, ActionIcon, Tooltip, Badge, Group, useMantineTheme, useComputedColorScheme, } from '@mantine/core'; import { Settings } from 'lucide-react'; import { SettingsModal } from '@/components/settings/SettingsModal'; import { safeExecute } from '@/utils/logger'; import type { FrontendPreference, Screen } from '@/types'; import type { CpuMetrics, MemoryMetrics, GpuMetrics, } from '@/main/modules/monitoring'; interface StatusBarProps { maxDataPoints?: number; currentScreen: Screen | null; frontendPreference: FrontendPreference; onFrontendPreferenceChange: (preference: FrontendPreference) => void; } export const StatusBar = ({ maxDataPoints = 60, currentScreen, frontendPreference: _frontendPreference, onFrontendPreferenceChange, }: StatusBarProps) => { const [cpuMetrics, setCpuMetrics] = useState(null); const [memoryMetrics, setMemoryMetrics] = useState( null ); const [gpuMetrics, setGpuMetrics] = useState(null); const [settingsModalOpen, setSettingsModalOpen] = useState(false); const theme = useMantineTheme(); const colorScheme = useComputedColorScheme('light', { getInitialValueInEffect: true, }); useEffect(() => { let isMounted = true; const handleCpuMetrics = async (metrics: CpuMetrics) => { if (!isMounted) return; setCpuMetrics(metrics); }; const handleMemoryMetrics = async (metrics: MemoryMetrics) => { if (!isMounted) return; setMemoryMetrics(metrics); }; const handleGpuMetrics = async (metrics: GpuMetrics) => { if (!isMounted) return; setGpuMetrics(metrics); }; window.electronAPI.monitoring.onCpuMetrics(handleCpuMetrics); window.electronAPI.monitoring.onMemoryMetrics(handleMemoryMetrics); window.electronAPI.monitoring.onGpuMetrics(handleGpuMetrics); void window.electronAPI.monitoring.start(); return () => { isMounted = false; window.electronAPI.monitoring.removeCpuMetricsListener(); window.electronAPI.monitoring.removeMemoryMetricsListener(); window.electronAPI.monitoring.removeGpuMetricsListener(); window.electronAPI.monitoring.stop(); }; }, [maxDataPoints]); if (!cpuMetrics || !memoryMetrics) { return null; } return ( CPU: {cpuMetrics.usage.toFixed(1)}% RAM: {memoryMetrics.usage.toFixed(1)}% {gpuMetrics?.gpus.map((gpu, index) => ( GPU: {gpu.usage.toFixed(1)}% VRAM: {gpu.memoryUsage.toFixed(1)}% ))} setSettingsModalOpen(true)} aria-label="Open settings" style={{ borderRadius: '0.25rem', }} > { setSettingsModalOpen(false); const preference = await safeExecute( () => window.electronAPI.config.get( 'frontendPreference' ) as Promise, 'Failed to load frontend preference:' ); onFrontendPreferenceChange(preference || 'koboldcpp'); }} currentScreen={currentScreen || undefined} /> ); };