'use client'; import { useState, useEffect } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Progress } from '@/components/ui/progress'; import { Badge } from '@/components/ui/badge'; import { Cpu, MemoryStick, HardDrive, Activity, Clock, Monitor } from 'lucide-react'; import { invoke } from '@tauri-apps/api/core'; import { GpuDashboard } from './GpuDashboard'; interface SystemStats { cpu_usage: number; ram_used: number; ram_total: number; ram_percent: number; gpu_name: string | null; uptime: number; processes_count: number; cpu_name: string; } export function HardwareDashboard() { const [stats, setStats] = useState(null); const [isLoading, setIsLoading] = useState(true); useEffect(() => { const loadStats = async () => { try { const data = await invoke('get_system_stats'); setStats(data); setIsLoading(false); } catch (error) { console.error('Failed to load system stats:', error); setIsLoading(false); } }; loadStats(); const interval = setInterval(loadStats, 1000); // Atualiza a cada 1 segundo return () => clearInterval(interval); }, []); if (isLoading || !stats) { return (
{/* Skeleton Cards */} {[1, 2, 3, 4].map((i) => (
))}
Carregando estatísticas do sistema...
); } const formatBytes = (bytes: number): string => { if (bytes === 0) return '0 B'; const k = 1024; const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`; }; const formatUptime = (seconds: number): string => { const days = Math.floor(seconds / 86400); const hours = Math.floor((seconds % 86400) / 3600); const minutes = Math.floor((seconds % 3600) / 60); if (days > 0) { return `${days}d ${hours}h ${minutes}m`; } else if (hours > 0) { return `${hours}h ${minutes}m`; } else { return `${minutes}m`; } }; const getCpuColor = (usage: number): string => { if (usage < 50) return 'bg-green-500'; if (usage < 80) return 'bg-yellow-500'; return 'bg-red-500'; }; const getRamColor = (percent: number): string => { if (percent < 60) return 'bg-blue-500'; if (percent < 85) return 'bg-yellow-500'; return 'bg-red-500'; }; return (
{/* CPU Card */}
CPU {stats.cpu_usage.toFixed(1)}%
{stats.cpu_name}
{/* RAM Card */}
Memória RAM {stats.ram_percent.toFixed(1)}%
{formatBytes(stats.ram_used)} / {formatBytes(stats.ram_total)} {formatBytes(stats.ram_total - stats.ram_used)} livre
{/* System Info Card */} Sistema
Uptime {formatUptime(stats.uptime)}
Processos {stats.processes_count.toLocaleString()}
{/* Visual RAM Usage */} Uso de Memória
Usado {stats.ram_percent.toFixed(1)}%
{formatBytes(stats.ram_used)} / {formatBytes(stats.ram_total)}
0% 100%
{/* GPU Dashboard - Substitui o card simples */}
); }