"use client"; import { useEffect, useState } from "react"; type ServerStatus = { online: boolean; playersOnline: number | null; playersMax: number | null; version: string | null; checkedAt: string; error?: string; }; const loadingStatus: ServerStatus = { online: false, playersOnline: null, playersMax: null, version: null, checkedAt: "", }; export default function MinecraftStatus() { const [status, setStatus] = useState(loadingStatus); const [loading, setLoading] = useState(true); useEffect(() => { let alive = true; async function refreshStatus() { try { const response = await fetch("/api/minecraft/status", { cache: "no-store", }); const payload = (await response.json()) as ServerStatus; if (alive) { setStatus(payload); setLoading(false); } } catch { if (alive) { setStatus({ ...loadingStatus, checkedAt: new Date().toISOString(), error: "Impossible de récupérer le statut.", }); setLoading(false); } } } refreshStatus(); const interval = window.setInterval(refreshStatus, 60_000); return () => { alive = false; window.clearInterval(interval); }; }, []); const playerCount = status.playersOnline === null ? "-" : `${status.playersOnline}${status.playersMax ? ` / ${status.playersMax}` : ""}`; return (

Statut du serveur

Mis à jour automatiquement toutes les 60 secondes.

{status.error ? (

{status.error}

) : null}
); } type StatusItemProps = { label: string; value: string; tone?: "online" | "offline"; }; function StatusItem({ label, value, tone }: StatusItemProps) { return (
{label} {tone ?
); } function formatCheckedAt(value: string) { if (!value) { return "-"; } return new Intl.DateTimeFormat("fr-FR", { hour: "2-digit", minute: "2-digit", }).format(new Date(value)); }