"use client" import { Card } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Thermometer, CpuIcon, Zap, HardDrive, Network, FanIcon, PowerIcon, Battery, Cpu, MemoryStick, Cpu as Gpu, Loader2, Info, } from "lucide-react" import useSWR from "swr" import { useState } from "react" import { type HardwareData, type GPU, type PCIDevice, type StorageDevice, fetcher } from "../types/hardware" const formatMemory = (memoryKB: number | string): string => { const kb = typeof memoryKB === "string" ? Number.parseFloat(memoryKB) : memoryKB if (isNaN(kb)) return "N/A" // Convert KB to MB const mb = kb / 1024 // Convert to TB if >= 1024 GB if (mb >= 1024 * 1024) { const tb = mb / (1024 * 1024) return `${tb.toFixed(1)} TB` } // Convert to GB if >= 1024 MB if (mb >= 1024) { const gb = mb / 1024 return `${gb.toFixed(1)} GB` } // Keep in MB if < 1024 MB return `${mb.toFixed(0)} MB` } const formatClock = (clockString: string | number): string => { let mhz: number if (typeof clockString === "number") { mhz = clockString } else { // Extract numeric value from string like "1138.179107 MHz" const match = clockString.match(/([\d.]+)\s*MHz/i) if (!match) return clockString mhz = Number.parseFloat(match[1]) } if (isNaN(mhz)) return String(clockString) // Convert to GHz if >= 1000 MHz if (mhz >= 1000) { const ghz = mhz / 1000 return `${ghz.toFixed(2)} GHz` } // Keep in MHz if < 1000 MHz return `${mhz.toFixed(0)} MHz` } const getDeviceTypeColor = (type: string): string => { const lowerType = type.toLowerCase() if (lowerType.includes("storage") || lowerType.includes("sata") || lowerType.includes("raid")) { return "bg-orange-500/10 text-orange-500 border-orange-500/20" } if (lowerType.includes("usb")) { return "bg-purple-500/10 text-purple-500 border-purple-500/20" } if (lowerType.includes("network") || lowerType.includes("ethernet")) { return "bg-blue-500/10 text-blue-500 border-blue-500/20" } if (lowerType.includes("graphics") || lowerType.includes("vga") || lowerType.includes("display")) { return "bg-green-500/10 text-green-500 border-green-500/20" } return "bg-gray-500/10 text-gray-500 border-gray-500/20" } const getMonitoringToolRecommendation = (vendor: string): string => { const lowerVendor = vendor.toLowerCase() if (lowerVendor.includes("intel")) { return "To get extended GPU monitoring information, please install intel-gpu-tools or igt-gpu-tools package." } if (lowerVendor.includes("nvidia")) { return "For NVIDIA GPUs, real-time monitoring requires the proprietary drivers (nvidia-driver package). Install them only if your GPU is used directly by the host." } if (lowerVendor.includes("amd") || lowerVendor.includes("ati")) { return "To get extended GPU monitoring information, please install radeontop package." } return "To get extended GPU monitoring information, please install the appropriate GPU monitoring tools for your hardware." } export default function Hardware() { const { data: hardwareData, error } = useSWR("/api/hardware", fetcher, { refreshInterval: 5000, }) const [selectedGPU, setSelectedGPU] = useState(null) const [realtimeGPUData, setRealtimeGPUData] = useState(null) const [detailsLoading, setDetailsLoading] = useState(false) const [selectedPCIDevice, setSelectedPCIDevice] = useState(null) const [selectedDisk, setSelectedDisk] = useState(null) const [selectedNetwork, setSelectedNetwork] = useState(null) const [selectedUPS, setSelectedUPS] = useState(null) // Added state for UPS modal if (!hardwareData && !error) { return (

Loading hardware information...

) } if (error) { return (

Error loading hardware information

) } const handleGPUClick = async (gpu: GPU) => { setSelectedGPU(gpu) setDetailsLoading(true) setRealtimeGPUData(null) } const findPCIDeviceForGPU = (gpu: GPU): PCIDevice | null => { if (!hardwareData?.pci_devices || !gpu.slot) return null // Try to find exact match first (e.g., "00:02.0") let pciDevice = hardwareData.pci_devices.find((d) => d.slot === gpu.slot) // If not found, try to match by partial slot (e.g., "00" matches "00:02.0") if (!pciDevice && gpu.slot.length <= 2) { pciDevice = hardwareData.pci_devices.find( (d) => d.slot.startsWith(gpu.slot + ":") && (d.type.toLowerCase().includes("vga") || d.type.toLowerCase().includes("graphics") || d.type.toLowerCase().includes("display")), ) } return pciDevice || null } const hasRealtimeData = (): boolean => { if (!realtimeGPUData) return false // Esto permite mostrar datos incluso cuando la GPU está inactiva (valores en 0 o null) return realtimeGPUData.has_monitoring_tool === true } return (
{/* System Information - CPU & Motherboard */} {(hardwareData?.cpu || hardwareData?.motherboard) && (

System Information

{/* CPU Info */} {hardwareData?.cpu && Object.keys(hardwareData.cpu).length > 0 && (

CPU

{hardwareData.cpu.model && (
Model {hardwareData.cpu.model}
)} {hardwareData.cpu.cores_per_socket && hardwareData.cpu.sockets && (
Cores {hardwareData.cpu.sockets} × {hardwareData.cpu.cores_per_socket} ={" "} {hardwareData.cpu.sockets * hardwareData.cpu.cores_per_socket} cores
)} {hardwareData.cpu.total_threads && (
Threads {hardwareData.cpu.total_threads}
)} {hardwareData.cpu.l3_cache && (
L3 Cache {hardwareData.cpu.l3_cache}
)} {hardwareData.cpu.virtualization && (
Virtualization {hardwareData.cpu.virtualization}
)}
)} {/* Motherboard Info */} {hardwareData?.motherboard && Object.keys(hardwareData.motherboard).length > 0 && (

Motherboard

{hardwareData.motherboard.manufacturer && (
Manufacturer {hardwareData.motherboard.manufacturer}
)} {hardwareData.motherboard.model && (
Model {hardwareData.motherboard.model}
)} {hardwareData.motherboard.bios?.vendor && (
BIOS {hardwareData.motherboard.bios.vendor}
)} {hardwareData.motherboard.bios?.version && (
Version {hardwareData.motherboard.bios.version}
)} {hardwareData.motherboard.bios?.date && (
Date {hardwareData.motherboard.bios.date}
)}
)}
)} {/* Memory Modules */} {hardwareData?.memory_modules && hardwareData.memory_modules.length > 0 && (

Memory Modules

{hardwareData.memory_modules.length} installed
{hardwareData.memory_modules.map((module, index) => (
{module.slot}
{module.size && (
Size {formatMemory(module.size)}
)} {module.type && (
Type {module.type}
)} {module.speed && (
Speed {module.speed}
)} {module.manufacturer && (
Manufacturer {module.manufacturer}
)}
))}
)} {/* Thermal Monitoring */} {hardwareData?.temperatures && hardwareData.temperatures.length > 0 && (

Thermal Monitoring

{hardwareData.temperatures.length} sensors
{hardwareData.temperatures.map((temp, index) => { const percentage = temp.critical > 0 ? (temp.current / temp.critical) * 100 : (temp.current / 100) * 100 const isHot = temp.current > (temp.high || 80) const isCritical = temp.current > (temp.critical || 90) return (
{temp.name} {temp.current.toFixed(1)}°C
{temp.adapter && {temp.adapter}}
) })}
)} {/* GPU Information - Enhanced with on-demand data fetching */} {hardwareData?.gpus && hardwareData.gpus.length > 0 && (

Graphics Cards

{hardwareData.gpus.length} GPU{hardwareData.gpus.length > 1 ? "s" : ""}
{hardwareData.gpus.map((gpu, index) => { const pciDevice = findPCIDeviceForGPU(gpu) const fullSlot = pciDevice?.slot || gpu.slot return (
handleGPUClick(gpu)} className="cursor-pointer rounded-lg border border-border/30 bg-background/50 p-4 transition-colors hover:bg-background/80" >
{gpu.name} {gpu.vendor}
Type {gpu.type}
{fullSlot && (
PCI Slot {fullSlot}
)} {gpu.pci_driver && (
Driver {gpu.pci_driver}
)} {gpu.pci_kernel_module && (
Kernel Module {gpu.pci_kernel_module}
)}
) })}
)} {/* GPU Detail Modal - Shows immediately with basic info, then loads real-time data */} { setSelectedGPU(null) setRealtimeGPUData(null) }} > {selectedGPU && ( <> {selectedGPU.name} GPU Real-Time Monitoring

Basic Information

Vendor {selectedGPU.vendor}
Type {selectedGPU.type}
PCI Slot {findPCIDeviceForGPU(selectedGPU)?.slot || selectedGPU.slot}
{(findPCIDeviceForGPU(selectedGPU)?.driver || selectedGPU.pci_driver) && (
Driver {/* CHANGE: Added monitoring availability indicator */}
{findPCIDeviceForGPU(selectedGPU)?.driver || selectedGPU.pci_driver} {realtimeGPUData?.has_monitoring_tool === true && ( {realtimeGPUData?.driver_version ? `✓ v${realtimeGPUData.driver_version}` : "✓"} )}
)} {(findPCIDeviceForGPU(selectedGPU)?.kernel_module || selectedGPU.pci_kernel_module) && (
Kernel Module {findPCIDeviceForGPU(selectedGPU)?.kernel_module || selectedGPU.pci_kernel_module}
)}
{detailsLoading ? (

Loading real-time data...

) : realtimeGPUData?.has_monitoring_tool === true ? ( <>
Updating every 3 seconds

Real-Time Metrics

{realtimeGPUData.clock_graphics && (
Graphics Clock {formatClock(realtimeGPUData.clock_graphics)}
)} {realtimeGPUData.clock_memory && (
Memory Clock {formatClock(realtimeGPUData.clock_memory)}
)} {realtimeGPUData.power_draw && realtimeGPUData.power_draw !== "0.00 W" && (
Power Draw {realtimeGPUData.power_draw}
)} {realtimeGPUData.temperature !== undefined && realtimeGPUData.temperature !== null && (
Temperature {realtimeGPUData.temperature}°C
)}
{/* Engine Utilization (Intel/AMD) */} {(realtimeGPUData.engine_render !== undefined || realtimeGPUData.engine_blitter !== undefined || realtimeGPUData.engine_video !== undefined || realtimeGPUData.engine_video_enhance !== undefined) && (

Engine Utilization (Total)

{realtimeGPUData.engine_render !== undefined && (
Render/3D {typeof realtimeGPUData.engine_render === "number" ? `${realtimeGPUData.engine_render.toFixed(1)}%` : realtimeGPUData.engine_render}
)} {realtimeGPUData.engine_video !== undefined && (
Video {typeof realtimeGPUData.engine_video === "number" ? `${realtimeGPUData.engine_video.toFixed(1)}%` : realtimeGPUData.engine_video}
)} {realtimeGPUData.engine_blitter !== undefined && (
Blitter {typeof realtimeGPUData.engine_blitter === "number" ? `${realtimeGPUData.engine_blitter.toFixed(1)}%` : realtimeGPUData.engine_blitter}
)} {realtimeGPUData.engine_video_enhance !== undefined && (
VideoEnhance {typeof realtimeGPUData.engine_video_enhance === "number" ? `${realtimeGPUData.engine_video_enhance.toFixed(1)}%` : realtimeGPUData.engine_video_enhance}
)}
)} {/* CHANGE: Changed process name badge from blue to purple to match Intel/AMD */} {realtimeGPUData.processes && realtimeGPUData.processes.length > 0 && (

Active Processes ({realtimeGPUData.processes.length})

{realtimeGPUData.processes.map((proc: any, idx: number) => (
{proc.name}

PID: {proc.pid}

{proc.memory && ( {typeof proc.memory === "object" ? formatMemory(proc.memory.resident / 1024) : formatMemory(proc.memory)} )}
{proc.engines && Object.keys(proc.engines).length > 0 && (

Engine Utilization:

{Object.entries(proc.engines).map(([engineName, engineData]: [string, any]) => { const utilization = typeof engineData === "object" ? engineData.busy || 0 : engineData const utilizationNum = typeof utilization === "string" ? Number.parseFloat(utilization) : utilization if (utilizationNum === 0 || isNaN(utilizationNum)) return null return (
{engineName} {utilizationNum.toFixed(1)}%
) })}
)}
))}
)} {realtimeGPUData.processes && realtimeGPUData.processes.length === 0 && (

No active processes using the GPU

)} {/* Memory Info (NVIDIA) */} {realtimeGPUData.memory_total && (

Memory

Total {realtimeGPUData.memory_total}
Used {realtimeGPUData.memory_used}
Free {realtimeGPUData.memory_free}
{realtimeGPUData.utilization_memory !== undefined && (
Memory Utilization {realtimeGPUData.utilization_memory}%
)}
)} ) : (

Extended Monitoring Not Available

{getMonitoringToolRecommendation(selectedGPU.vendor)}

)}
)}
{/* PCI Devices - Changed to modal */} {hardwareData?.pci_devices && hardwareData.pci_devices.length > 0 && (

PCI Devices

{hardwareData.pci_devices.length} devices
{hardwareData.pci_devices.map((device, index) => (
setSelectedPCIDevice(device)} className="cursor-pointer rounded-lg border border-border/30 bg-background/50 p-3 transition-colors hover:bg-background/80" >
{device.type} {device.slot}

{device.device}

{device.vendor}

{device.driver && (

Driver: {device.driver}

)}
))}
)} {/* PCI Device Detail Modal */} setSelectedPCIDevice(null)}> {selectedPCIDevice?.device} PCI Device Information {selectedPCIDevice && (
Device Type {selectedPCIDevice.type}
PCI Slot {selectedPCIDevice.slot}
Device Name {selectedPCIDevice.device}
Vendor {selectedPCIDevice.vendor}
Class {selectedPCIDevice.class}
{selectedPCIDevice.driver && (
Driver {selectedPCIDevice.driver}
)} {selectedPCIDevice.kernel_module && (
Kernel Module {selectedPCIDevice.kernel_module}
)}
)}
{/* Power Consumption */} {hardwareData?.power_meter && (

Power Consumption

{hardwareData.power_meter.name}

{hardwareData.power_meter.adapter && (

{hardwareData.power_meter.adapter}

)}

{hardwareData.power_meter.watts.toFixed(1)} W

Current Draw

)} {/* Power Supplies */} {hardwareData?.power_supplies && hardwareData.power_supplies.length > 0 && (

Power Supplies

{hardwareData.power_supplies.length} PSUs
{hardwareData.power_supplies.map((psu, index) => (
{psu.name} {psu.status && ( {psu.status} )}

{psu.watts} W

Current Output

))}
)} {/* Fans */} {hardwareData?.fans && hardwareData.fans.length > 0 && (

System Fans

{hardwareData.fans.length} fans
{hardwareData.fans.map((fan, index) => { const isPercentage = fan.unit === "percent" || fan.unit === "%" const percentage = isPercentage ? fan.speed : Math.min((fan.speed / 5000) * 100, 100) return (
{fan.name} {isPercentage ? `${fan.speed.toFixed(0)} percent` : `${fan.speed.toFixed(0)} ${fan.unit}`}
{fan.adapter && {fan.adapter}}
) })}
)} {/* Power Supplies */} {/* This section was moved to be grouped with Power Consumption */} {/* UPS - Enhanced with detailed modal */} {hardwareData?.ups && Object.keys(hardwareData.ups).length > 0 && hardwareData.ups.model && (

UPS Status

{hardwareData.ups.model}
{hardwareData.ups.status}
{hardwareData.ups.battery_charge && (
Battery Charge {hardwareData.ups.battery_charge}
)} {hardwareData.ups.load_percent && (
Load {hardwareData.ups.load_percent}
)} {hardwareData.ups.time_left && (
Runtime
{hardwareData.ups.time_left}
)} {hardwareData.ups.line_voltage && (
Input Voltage
{hardwareData.ups.line_voltage}
)}
)} setSelectedUPS(null)}> {selectedUPS && ( <> {selectedUPS.model || selectedUPS.name} Comprehensive UPS Information
{/* Device Information */} {(selectedUPS.model || selectedUPS.manufacturer || selectedUPS.serial || selectedUPS.device_type) && (

Device Information

{selectedUPS.model && (
Model {selectedUPS.model}
)} {selectedUPS.manufacturer && (
Manufacturer {selectedUPS.manufacturer}
)} {selectedUPS.serial && (
Serial Number {selectedUPS.serial}
)} {selectedUPS.device_type && (
Device Type {selectedUPS.device_type}
)} {selectedUPS.firmware && (
Firmware {selectedUPS.firmware}
)}
)} {/* Status */} {(selectedUPS.status || selectedUPS.beeper_status || selectedUPS.test_result) && (

Status

{selectedUPS.status && (
UPS Status {selectedUPS.status}
)} {selectedUPS.beeper_status && (
Beeper Status {selectedUPS.beeper_status}
)} {selectedUPS.test_result && (
Test Result {selectedUPS.test_result}
)}
)} {/* Battery */} {(selectedUPS.battery_charge || selectedUPS.time_left || selectedUPS.battery_voltage || selectedUPS.battery_type) && (

Battery

{selectedUPS.battery_charge && (
Charge Level {selectedUPS.battery_charge}
)} {selectedUPS.battery_charge_low && (
Low Battery Threshold {selectedUPS.battery_charge_low}
)} {selectedUPS.time_left && (
Runtime Remaining {selectedUPS.time_left}
)} {selectedUPS.battery_runtime_low && (
Low Runtime Threshold {selectedUPS.battery_runtime_low}
)} {selectedUPS.battery_voltage && (
Battery Voltage {selectedUPS.battery_voltage}
)} {selectedUPS.battery_voltage_nominal && (
Nominal Voltage {selectedUPS.battery_voltage_nominal}
)} {selectedUPS.battery_type && (
Battery Type {selectedUPS.battery_type}
)} {selectedUPS.battery_mfr_date && (
Battery Manufacture Date {selectedUPS.battery_mfr_date}
)}
)} {/* Power */} {(selectedUPS.load_percent || selectedUPS.real_power || selectedUPS.apparent_power) && (

Power

{selectedUPS.load_percent && (
Load {selectedUPS.load_percent}
)} {selectedUPS.real_power && (
Real Power {selectedUPS.real_power}
)} {selectedUPS.realpower_nominal && (
Nominal Real Power {selectedUPS.realpower_nominal}
)} {selectedUPS.apparent_power && (
Apparent Power {selectedUPS.apparent_power}
)} {selectedUPS.power_nominal && (
Nominal Apparent Power {selectedUPS.power_nominal}
)}
)} {/* Input/Output */} {(selectedUPS.input_voltage || selectedUPS.output_voltage || selectedUPS.input_frequency) && (

Input / Output

{selectedUPS.input_voltage && (
Input Voltage {selectedUPS.input_voltage}
)} {selectedUPS.input_voltage_nominal && (
Nominal Input Voltage {selectedUPS.input_voltage_nominal}
)} {selectedUPS.input_frequency && (
Input Frequency {selectedUPS.input_frequency}
)} {selectedUPS.input_transfer_high && (
Transfer High {selectedUPS.input_transfer_high}
)} {selectedUPS.input_transfer_low && (
Transfer Low {selectedUPS.input_transfer_low}
)} {selectedUPS.transfer_reason && (
Last Transfer Reason {selectedUPS.transfer_reason}
)} {selectedUPS.output_voltage && (
Output Voltage {selectedUPS.output_voltage}
)} {selectedUPS.output_voltage_nominal && (
Nominal Output Voltage {selectedUPS.output_voltage_nominal}
)} {selectedUPS.output_frequency && (
Output Frequency {selectedUPS.output_frequency}
)}
)} {/* Driver */} {(selectedUPS.driver_name || selectedUPS.driver_version) && (

Driver

{selectedUPS.driver_name && (
Driver Name {selectedUPS.driver_name}
)} {selectedUPS.driver_version && (
Driver Version {selectedUPS.driver_version}
)} {selectedUPS.driver_version_internal && (
Internal Version {selectedUPS.driver_version_internal}
)} {selectedUPS.driver_poll_freq && (
Poll Frequency {selectedUPS.driver_poll_freq}
)} {selectedUPS.driver_poll_interval && (
Poll Interval {selectedUPS.driver_poll_interval}
)}
)} {/* Configuration */} {(selectedUPS.delay_shutdown || selectedUPS.delay_start || selectedUPS.timer_shutdown) && (

Configuration

{selectedUPS.delay_shutdown && (
Shutdown Delay {selectedUPS.delay_shutdown}
)} {selectedUPS.delay_start && (
Start Delay {selectedUPS.delay_start}
)} {selectedUPS.timer_shutdown && (
Shutdown Timer {selectedUPS.timer_shutdown}
)} {selectedUPS.timer_reboot && (
Reboot Timer {selectedUPS.timer_reboot}
)}
)} {/* Raw Variables - Collapsible section with all UPS variables */} {selectedUPS.raw_variables && Object.keys(selectedUPS.raw_variables).length > 0 && (
All UPS Variables ({Object.keys(selectedUPS.raw_variables).length})
{Object.entries(selectedUPS.raw_variables).map(([key, value]) => (
{key} {value as string}
))}
)}
)}
{/* Network Summary - Clickable */} {hardwareData?.pci_devices && hardwareData.pci_devices.filter((d) => d.type.toLowerCase().includes("network")).length > 0 && (

Network Summary

{hardwareData.pci_devices.filter((d) => d.type.toLowerCase().includes("network")).length} interfaces
{hardwareData.pci_devices .filter((d) => d.type.toLowerCase().includes("network")) .map((device, index) => (
setSelectedNetwork(device)} className="cursor-pointer rounded-lg border border-border/30 bg-background/50 p-3 transition-colors hover:bg-background/80" >
{device.device} Ethernet

{device.vendor}

{device.driver && (

Driver: {device.driver}

)}
))}

Click on an interface for detailed information

)} {/* Network Detail Modal */} setSelectedNetwork(null)}> {selectedNetwork?.device} Network Interface Information {selectedNetwork && (
Device Type {selectedNetwork.type}
PCI Slot {selectedNetwork.slot}
Vendor {selectedNetwork.vendor}
Class {selectedNetwork.class}
{selectedNetwork.driver && (
Driver {selectedNetwork.driver}
)} {selectedNetwork.kernel_module && (
Kernel Module {selectedNetwork.kernel_module}
)}
)}
{/* Storage Summary - Clickable */} {hardwareData?.storage_devices && hardwareData.storage_devices.length > 0 && (

Storage Summary

{hardwareData.storage_devices.length} devices
{hardwareData.storage_devices.map((device, index) => (
setSelectedDisk(device)} className="cursor-pointer rounded-lg border border-border/30 bg-background/50 p-3 transition-colors hover:bg-background/80" >
{device.name} {device.type}
{device.size &&

{formatMemory(device.size)}

} {device.model && (

{device.model}

)} {device.driver && (

Driver: {device.driver}

)}
))}

Click on a device for detailed hardware information

)} {/* Disk Detail Modal */} setSelectedDisk(null)}> {selectedDisk?.name} Storage Device Hardware Information {selectedDisk && (
Device Name {selectedDisk.name}
{selectedDisk.type && (
Type {selectedDisk.type}
)} {selectedDisk.size && (
Capacity {formatMemory(selectedDisk.size)}
)} {selectedDisk.model && (
Model {selectedDisk.model}
)} {selectedDisk.family && (
Family {selectedDisk.family}
)} {selectedDisk.serial && (
Serial Number {selectedDisk.serial}
)} {selectedDisk.firmware && (
Firmware {selectedDisk.firmware}
)} {selectedDisk.interface && (
Interface {selectedDisk.interface}
)} {selectedDisk.driver && (
Driver {selectedDisk.driver}
)} {selectedDisk.rotation_rate && (
Rotation Rate {selectedDisk.rotation_rate}
)} {selectedDisk.form_factor && (
Form Factor {selectedDisk.form_factor}
)} {selectedDisk.sata_version && (
SATA Version {selectedDisk.sata_version}
)}
)}
) }