diff --git a/AppImage/components/proxmox-dashboard.tsx b/AppImage/components/proxmox-dashboard.tsx index b6ac296..856895d 100644 --- a/AppImage/components/proxmox-dashboard.tsx +++ b/AppImage/components/proxmox-dashboard.tsx @@ -1,6 +1,6 @@ "use client" -import { useState } from "react" +import { useState, useEffect, useMemo, useCallback } from "react" import { Badge } from "./ui/badge" import { Button } from "./ui/button" import { Tabs, TabsContent, TabsList, TabsTrigger } from "./ui/tabs" @@ -21,27 +21,80 @@ interface SystemStatus { nodeId: string } +interface FlaskSystemData { + hostname: string + node_id: string + uptime: string + cpu_usage: number + memory_usage: number + temperature: number + load_average: number[] +} + export function ProxmoxDashboard() { const [systemStatus, setSystemStatus] = useState({ status: "healthy", - uptime: "15d 7h 23m", + uptime: "Loading...", lastUpdate: new Date().toLocaleTimeString(), - serverName: "proxmox-01", - nodeId: "pve-node-01", + serverName: "Loading...", + nodeId: "Loading...", }) const [isRefreshing, setIsRefreshing] = useState(false) + const [isServerConnected, setIsServerConnected] = useState(true) + const [componentKey, setComponentKey] = useState(0) + + const fetchSystemData = useCallback(async () => { + try { + const response = await fetch("http://localhost:8008/api/system") + if (!response.ok) { + throw new Error("Server not responding") + } + const data: FlaskSystemData = await response.json() + + // Determine health status based on system metrics + let status: "healthy" | "warning" | "critical" = "healthy" + if (data.cpu_usage > 90 || data.memory_usage > 90) { + status = "critical" + } else if (data.cpu_usage > 75 || data.memory_usage > 75) { + status = "warning" + } + + setSystemStatus({ + status, + uptime: data.uptime, + lastUpdate: new Date().toLocaleTimeString(), + serverName: data.hostname, + nodeId: data.node_id, + }) + setIsServerConnected(true) + } catch (error) { + console.error("Error fetching system data:", error) + setIsServerConnected(false) + setSystemStatus((prev) => ({ + ...prev, + status: "critical", + nodeId: "Server Offline", + uptime: "N/A", + lastUpdate: new Date().toLocaleTimeString(), + })) + } + }, []) + + useEffect(() => { + fetchSystemData() + const interval = setInterval(fetchSystemData, 5000) + return () => clearInterval(interval) + }, [fetchSystemData]) const refreshData = async () => { setIsRefreshing(true) - await new Promise((resolve) => setTimeout(resolve, 1000)) - setSystemStatus((prev) => ({ - ...prev, - lastUpdate: new Date().toLocaleTimeString(), - })) + await fetchSystemData() + setComponentKey((prev) => prev + 1) + await new Promise((resolve) => setTimeout(resolve, 500)) setIsRefreshing(false) } - const getStatusIcon = () => { + const statusIcon = useMemo(() => { switch (systemStatus.status) { case "healthy": return @@ -50,9 +103,9 @@ export function ProxmoxDashboard() { case "critical": return } - } + }, [systemStatus.status]) - const getStatusColor = () => { + const statusColor = useMemo(() => { switch (systemStatus.status) { case "healthy": return "bg-green-500/10 text-green-500 border-green-500/20" @@ -61,11 +114,11 @@ export function ProxmoxDashboard() { case "critical": return "bg-red-500/10 text-red-500 border-red-500/20" } - } + }, [systemStatus.status]) return (
-
+
@@ -81,27 +134,27 @@ export function ProxmoxDashboard() { />
-

ProxMenux Monitor

-

Proxmox System Dashboard

+

ProxMenux Monitor

+

Proxmox System Dashboard

- +
-
{systemStatus.nodeId}
+
{systemStatus.nodeId}
- - {getStatusIcon()} + + {statusIcon} {systemStatus.status} -
Uptime: {systemStatus.uptime}
+
Uptime: {systemStatus.uptime}