"use client"; import { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Progress } from "@/components/ui/progress"; import { Skeleton } from "@/components/ui/skeleton"; import { Users, Puzzle, HardDrive, Activity, Clock, Zap, TrendingUp, AlertTriangle, } from "lucide-react"; interface MonitoringData { system: { cpuPercent: number; totalMemMb: number; usedMemMb: number; loadAvg: number[]; uptime: number; }; server: { running: boolean; uptime?: number; startedAt?: string; }; timestamp: number; } interface StatsData { totalPlayers: number; onlinePlayers: number; enabledPlugins: number; totalPlugins: number; pendingBackups: number; recentAlerts: string[]; } function StatCard({ title, value, subtitle, icon: Icon, accent = "emerald", loading = false, }: { title: string; value: string | number; subtitle?: string; icon: React.ElementType; accent?: "emerald" | "blue" | "amber" | "red"; loading?: boolean; }) { const colors = { emerald: "text-emerald-500 bg-emerald-500/10", blue: "text-blue-500 bg-blue-500/10", amber: "text-amber-500 bg-amber-500/10", red: "text-red-500 bg-red-500/10", }; return ( {title} {loading ? ( ) : ( {value} )} {subtitle && ( {subtitle} )} ); } function formatUptime(seconds: number): string { const d = Math.floor(seconds / 86400); const h = Math.floor((seconds % 86400) / 3600); const m = Math.floor((seconds % 3600) / 60); if (d > 0) return `${d}d ${h}h ${m}m`; if (h > 0) return `${h}h ${m}m`; return `${m}m`; } export default function DashboardPage() { const [monitoring, setMonitoring] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const fetchMonitoring = async () => { try { const res = await fetch("/api/monitoring"); if (res.ok) setMonitoring(await res.json()); } finally { setLoading(false); } }; fetchMonitoring(); const interval = setInterval(fetchMonitoring, 5000); return () => clearInterval(interval); }, []); const memPercent = monitoring ? Math.round((monitoring.system.usedMemMb / monitoring.system.totalMemMb) * 100) : 0; return ( Dashboard Real-time overview of your Minecraft server {/* Status banner */} Server is {monitoring?.server.running ? "Online" : "Offline"} {monitoring?.server.running && monitoring.server.uptime && ( Up for {formatUptime(monitoring.server.uptime)} )} {/* Stat cards */} 85 ? "red" : memPercent > 60 ? "amber" : "emerald"} loading={loading} /> {/* Resource gauges */} CPU Usage {loading ? ( ) : ( <> {monitoring?.system.cpuPercent ?? 0}% 100% > )} Memory Usage {loading ? ( ) : ( <> {monitoring?.system.usedMemMb ?? 0} MB {monitoring?.system.totalMemMb ?? 0} MB > )} {/* Quick info */} Quick Actions {[ { label: "View Console", href: "/console", icon: "⌨️" }, { label: "Manage Players", href: "/players", icon: "👥" }, { label: "Plugins", href: "/plugins", icon: "🔌" }, { label: "Create Backup", href: "/backups", icon: "💾" }, ].map(({ label, href, icon }) => ( {icon} {label} ))} ); }
{title}
{value}
{subtitle}
Real-time overview of your Minecraft server