"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} ))}
); }