diff --git a/AppImage/components/system-overview.tsx b/AppImage/components/system-overview.tsx index db397f1..6d2e09f 100644 --- a/AppImage/components/system-overview.tsx +++ b/AppImage/components/system-overview.tsx @@ -4,8 +4,9 @@ import { useState, useEffect } from "react" import { Card, CardContent, CardHeader, CardTitle } from "./ui/card" import { Progress } from "./ui/progress" import { Badge } from "./ui/badge" +import { Button } from "./ui/button" import { XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, AreaChart, Area } from "recharts" -import { Cpu, MemoryStick, Thermometer, Users, Activity, Server, Zap, AlertCircle } from "lucide-react" +import { Cpu, MemoryStick, Thermometer, Users, Activity, Server, Zap, AlertCircle, RefreshCw } from "lucide-react" interface SystemData { cpu_usage: number @@ -160,46 +161,55 @@ export function SystemOverview() { const [vmData, setVmData] = useState([]) const [chartData, setChartData] = useState(generateChartData()) const [loading, setLoading] = useState(true) - const [isDemo, setIsDemo] = useState(false) // Added demo mode state + const [isDemo, setIsDemo] = useState(false) + const [isRefreshing, setIsRefreshing] = useState(false) + const [lastUpdate, setLastUpdate] = useState(new Date()) + + const fetchData = async () => { + try { + setIsRefreshing(true) + + const [systemResult, vmResult] = await Promise.all([fetchSystemData(), fetchVMData()]) + + setSystemData(systemResult.data) + setVmData(vmResult.data) + setIsDemo(systemResult.isDemo || vmResult.isDemo) + setLastUpdate(new Date()) + + if (systemResult.data) { + setChartData(generateChartData(systemResult.data)) + } + } catch (err) { + console.error("[v0] Error fetching data:", err) + const fallbackData = generateDemoSystemData() + setSystemData(fallbackData) + setVmData(demVMData) + setChartData(generateChartData(fallbackData)) + setIsDemo(true) + setLastUpdate(new Date()) + } finally { + setLoading(false) + setIsRefreshing(false) + } + } + + const handleManualRefresh = () => { + fetchData() + } useEffect(() => { - const fetchData = async () => { - try { - setLoading(true) - - const [systemResult, vmResult] = await Promise.all([fetchSystemData(), fetchVMData()]) - - setSystemData(systemResult.data) - setVmData(vmResult.data) - setIsDemo(systemResult.isDemo || vmResult.isDemo) // Set demo mode if either fetch is demo - - if (systemResult.data) { - setChartData(generateChartData(systemResult.data)) - } - } catch (err) { - console.error("[v0] Error fetching data:", err) - const fallbackData = generateDemoSystemData() - setSystemData(fallbackData) - setVmData(demVMData) - setChartData(generateChartData(fallbackData)) - setIsDemo(true) - } finally { - setLoading(false) - } - } - fetchData() const interval = setInterval(() => { if (!isDemo) { fetchData() } else { - // In demo mode, just update with new random data const newDemoData = generateDemoSystemData() setSystemData(newDemoData) setChartData(generateChartData(newDemoData)) + setLastUpdate(new Date()) } - }, 5000) // Update every 5 seconds instead of 30 + }, 30000) return () => { clearInterval(interval) @@ -208,22 +218,27 @@ export function SystemOverview() { if (loading) { return ( -
-
-
Connecting to ProxMenux Monitor...
-
Fetching real-time system data
-
-
- {[...Array(4)].map((_, i) => ( - - -
-
-
-
-
-
- ))} +
+
+
+
+ +
+
Connecting to ProxMenux Monitor...
+
Fetching real-time system data
+
+
+ {[...Array(4)].map((_, i) => ( + + +
+
+
+
+
+
+ ))} +
) @@ -239,250 +254,276 @@ export function SystemOverview() { } const getTemperatureStatus = (temp: number) => { - if (temp < 60) return { status: "Normal", color: "bg-green-500/10 text-green-500 border-green-500/20" } - if (temp < 75) return { status: "Warm", color: "bg-yellow-500/10 text-yellow-500 border-yellow-500/20" } - return { status: "Hot", color: "bg-red-500/10 text-red-500 border-red-500/20" } + if (temp < 60) return { status: "Normal", color: "bg-emerald-500/10 text-emerald-400 border-emerald-500/20" } + if (temp < 75) return { status: "Warm", color: "bg-amber-500/10 text-amber-400 border-amber-500/20" } + return { status: "Hot", color: "bg-red-500/10 text-red-400 border-red-500/20" } } const tempStatus = getTemperatureStatus(systemData.temperature) return ( -
- {isDemo && ( - - -
- - - Demo Mode: Flask server not available. Showing simulated data for development. In the - AppImage, this will connect to the real Flask server. - -
-
-
- )} +
+
+
+
+

ProxMenux System Dashboard

+

Last updated: {lastUpdate.toLocaleTimeString()} • Auto-refresh every 30s

+
+ +
- {/* Key Metrics Cards */} -
- - - CPU Usage - - - -
{systemData.cpu_usage}%
- -

- {isDemo ? "Simulated data" : "Real-time data from Flask server"} -

-
-
+ {isDemo && ( + + +
+ + + Demo Mode: Flask server not available. Showing simulated data for development. In the + AppImage, this will connect to the real Flask server. + +
+
+
+ )} - - - Memory Usage - - - -
- {systemData.memory_used.toFixed(1)} GB -
- -

- {systemData.memory_usage.toFixed(1)}% of {systemData.memory_total} GB -

-
-
+
+ + + CPU Usage +
+ +
+
+ +
{systemData.cpu_usage}%
+ +

+ {isDemo ? "Simulated data" : "Real-time data from Flask server"} +

+
+
- - - Temperature - - - -
{systemData.temperature}°C
-
- - {tempStatus.status} - -
-

- {isDemo ? "Simulated temperature" : "Live temperature reading"} -

-
-
+ + + Memory Usage +
+ +
+
+ +
{systemData.memory_used.toFixed(1)} GB
+ +

+ {systemData.memory_usage.toFixed(1)}% of {systemData.memory_total} GB +

+
+
- - - Active VMs - - - -
{vmStats.running}
-
- - {vmStats.running} Running - - {vmStats.stopped > 0 && ( - - {vmStats.stopped} Stopped + + + Temperature +
+ +
+
+ +
{systemData.temperature}°C
+
+ + {tempStatus.status} - )} -
-

Total: {vmStats.total} VMs configured

-
-
-
+
+

+ {isDemo ? "Simulated temperature" : "Live temperature reading"} +

+ + - {/* Charts Section */} -
- - - - - CPU Usage (24h) - - - - - - - - - - - - - - + + + Active VMs +
+ +
+
+ +
{vmStats.running}
+
+ + {vmStats.running} Running + + {vmStats.stopped > 0 && ( + + {vmStats.stopped} Stopped + + )} +
+

Total: {vmStats.total} VMs configured

+
+
+
- - - - - Memory Usage (24h) - - - - - - - - - - - - - - - -
+
+ + + +
+ +
+ CPU Usage (24h) +
+
+ + + + + + + + + + + +
- {/* System Information */} -
- - - - - System Information - - - -
- Hostname: - {systemData.hostname} -
-
- Uptime: - {systemData.uptime} -
-
- Node ID: - {systemData.node_id} -
-
- Last Update: - - {new Date(systemData.timestamp).toLocaleTimeString()} - -
-
-
+ + + +
+ +
+ Memory Usage (24h) +
+
+ + + + + + + + + + + + +
+
- - - - - Active Sessions - - - -
- Web Console: - - 3 active - -
-
- SSH Sessions: - - 1 active - -
-
- API Calls: - 247/hour -
-
-
+
+ + + +
+ +
+ System Information +
+
+ +
+ Hostname: + + {systemData.hostname} + +
+
+ Uptime: + {systemData.uptime} +
+
+ Node ID: + + {systemData.node_id} + +
+
+ Status: + healthy +
+
+
- - - - - Power & Performance - - - -
- Power State: - - Running - -
-
- Load Average: - - {systemData.load_average.map((avg) => avg.toFixed(2)).join(", ")} - -
-
- Boot Time: - 2.3s -
-
-
+ + + +
+ +
+ Active Sessions +
+
+ +
+ Web Console: + 3 active +
+
+ SSH Sessions: + 1 active +
+
+ API Calls: + 247/hour +
+
+
+ + + + +
+ +
+ Power & Performance +
+
+ +
+ Power State: + Running +
+
+ Load Average: + + {systemData.load_average.map((avg) => avg.toFixed(2)).join(", ")} + +
+
+ Boot Time: + 2.3s +
+
+
+
)