From 9c1d215cbb29c40c36c27788544c496e89686d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=BAlio=20Zanella?= Date: Mon, 15 Sep 2025 03:32:04 -0300 Subject: [PATCH] feat: implement dynamic server status display with loading and error handling --- src/components/minecraft/ServerStatus.tsx | 140 ++++++++++++++++------ 1 file changed, 101 insertions(+), 39 deletions(-) diff --git a/src/components/minecraft/ServerStatus.tsx b/src/components/minecraft/ServerStatus.tsx index 1491ddb..5778e6c 100644 --- a/src/components/minecraft/ServerStatus.tsx +++ b/src/components/minecraft/ServerStatus.tsx @@ -2,22 +2,52 @@ import { useState, useEffect } from "react"; import { FiCheckCircle, FiAlertTriangle, FiClock } from "react-icons/fi"; +import { fetchWithRetry } from "../../utils/fetchWithRetry"; -const serverRegions = [ - { - id: "aurora", - name: "Aurora", - location: "São Paulo, BR", - status: "online", - uptime: "99.98%", - ping: "6ms", - load: "Baixo", - }, -]; +interface ServerData { + name: string; + located: string; + server_isRunning: string; + server_status: string; + cpu: string; + ram: string; + uptime_days: number; + uptime_percentage: number; +} + +interface ApiResponse { + status: string; + totalServers: number; + server_status: Record; +} export default function ServerStatus() { + const [servers, setServers] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); const [currentTime, setCurrentTime] = useState(new Date()); + const fetchServerStatus = async () => { + try { + const response = await fetchWithRetry(`${process.env.NEXT_PUBLIC_API_URL}/v1/public/ServerStatus`); + if (!response.ok) throw new Error('Failed to fetch'); + const data: ApiResponse = await response.json(); + const serverList = Object.values(data.server_status); + setServers(serverList); + setLoading(false); + setError(null); + } catch (err) { + setError('Erro ao carregar status dos servidores'); + setLoading(false); + } + }; + + useEffect(() => { + fetchServerStatus(); + const interval = setInterval(fetchServerStatus, 60000); + return () => clearInterval(interval); + }, []); + useEffect(() => { const timer = setInterval(() => { setCurrentTime(new Date()); @@ -26,13 +56,33 @@ export default function ServerStatus() { return () => clearInterval(timer); }, []); - const formatTime = (date) => { + const formatTime = (date: Date) => { return date.toLocaleTimeString("pt-BR", { hour: "2-digit", minute: "2-digit", }); }; + if (loading) { + return ( +
+
+ Carregando status dos servidores... +
+
+ ); + } + + if (error) { + return ( +
+
+ {error} +
+
+ ); + } + return (
@@ -56,33 +106,45 @@ export default function ServerStatus() { - {serverRegions.map((region) => ( - - {region.name} - {region.location} - -
- {region.status === "online" ? ( - <> - - Online - - ) : ( - <> - - Manutenção - - )} -
- - {region.uptime} - {region.ping} - {region.load} - - ))} + {servers.map((server, index) => { + const status = server.server_isRunning === "running" ? "online" : "offline"; + const uptime = `${server.uptime_percentage}%`; + const ping = server.located.includes("BR") ? "6-16ms" : "N/A"; + const loadMap: Record = { + critical: "Alto", + high: "Médio", + low: "Baixo" + }; + const load = loadMap[server.server_status] || "Baixo"; + + return ( + + {server.name} + {server.located} + +
+ {status === "online" ? ( + <> + + Online + + ) : ( + <> + + Offline + + )} +
+ + {uptime} + {ping} + {load} + + ); + })}