import React, { useEffect, useState, useMemo } from 'react'; import { useSelector } from 'react-redux'; import StyledWrapper from './StyledWrapper'; import { IconCpu, IconDatabase, IconClock, IconServer, IconChevronDown, IconChartLine } from '@tabler/icons'; const getProcessOptions = (processes) => { return [ { value: 'cumulative', label: 'Cumulative (All Processes)' }, ...(processes ?? []).map((process) => ({ value: String(process.pid), label: `PID ${process.pid}${process.title ? ` - ${process.title}` : ''}${process.type ? ` (${process.type})` : ''}` })) ]; }; const Performance = () => { const { systemResources } = useSelector((state) => state.performance); const [selectedPid, setSelectedPid] = useState('cumulative'); useEffect(() => { const { ipcRenderer } = window; if (!ipcRenderer) { console.warn('IPC Renderer not available'); return; } const startMonitoring = async () => { try { await ipcRenderer.invoke('renderer:start-system-monitoring', 2000); } catch (error) { console.error('Failed to start system monitoring:', error); } }; const stopMonitoring = async () => { try { await ipcRenderer.invoke('renderer:stop-system-monitoring'); } catch (error) { console.error('Failed to stop system monitoring:', error); } }; startMonitoring(); return () => { stopMonitoring(); }; }, []); const formatBytes = (bytes) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }; const formatUptime = (seconds) => { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); const secs = Math.floor(seconds % 60); if (hours > 0) return `${hours}h ${minutes}m ${secs}s`; if (minutes > 0) return `${minutes}m ${secs}s`; return `${secs}s`; }; const SystemResourceCard = ({ icon: Icon, title, value, subtitle, color = 'default', trend }) => (
{title}
{value}
{subtitle &&
{subtitle}
} {trend && (
0 ? 'up' : trend < 0 ? 'down' : 'stable'}`}> {trend > 0 ? '+' : ''} {trend.toFixed(1)} %
)}
); // Get process options for dropdown const processOptions = useMemo(() => getProcessOptions(systemResources.processes), [systemResources.processes]); // Get selected process data const selectedProcess = useMemo(() => { if (selectedPid === 'cumulative') { return null; // Show cumulative view } const processes = systemResources.processes || []; return processes.find((p) => String(p.pid) === selectedPid) || null; }, [selectedPid, systemResources.processes]); // Reset to cumulative if selected PID no longer exists useEffect(() => { if (selectedPid !== 'cumulative' && !selectedProcess) { setSelectedPid('cumulative'); } }, [selectedPid, selectedProcess]); const renderCumulativeView = () => (

System Resources

80 ? 'danger' : systemResources.cpu > 60 ? 'warning' : 'success'} /> (500 * 1024 * 1024) ? 'danger' : 'default'} />
); const renderProcessView = (process) => { if (!process) return null; // Calculate uptime for individual process const processUptime = process.creationTime ? (new Date() - new Date(process.creationTime)) / 1000 : 0; return (

System Resources

80 ? 'danger' : process.cpu > 60 ? 'warning' : 'success'} /> (500 * 1024 * 1024) ? 'danger' : 'default'} />
); }; return (
{selectedPid === 'cumulative' ? renderCumulativeView() : renderProcessView(selectedProcess)}
); }; export default Performance;