import { useEffect, useState } from 'react'; import { Badge, Group, Tooltip, useComputedColorScheme } from '@mantine/core'; import type { CpuMetrics, MemoryMetrics, GpuMetrics, } from '@/main/modules/monitoring'; interface StatusBarProps { maxDataPoints?: number; } export const StatusBar = ({ maxDataPoints = 60 }: StatusBarProps) => { const [cpuMetrics, setCpuMetrics] = useState(null); const [memoryMetrics, setMemoryMetrics] = useState( null ); const [gpuMetrics, setGpuMetrics] = useState(null); 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]); return ( {cpuMetrics && memoryMetrics && ( <> CPU: {cpuMetrics.usage.toFixed(1)}% RAM: {memoryMetrics.usage.toFixed(1)}% )} {gpuMetrics?.gpus.map((gpu, index) => ( GPU{gpuMetrics.gpus.length > 1 ? ` ${index + 1}` : ''}:{' '} {gpu.usage.toFixed(1)}% VRAM{gpuMetrics.gpus.length > 1 ? ` ${index + 1}` : ''}:{' '} {gpu.memoryUsage.toFixed(1)}% ))} ); };