"use client"; import { useEffect, useState } from "react"; import { fetchOverview, fetchHistory, type ModuleStatus, type HistoryEntry } from "@/lib/api"; const POLL_INTERVAL_MS = 5000; export default function Page() { const [modules, setModules] = useState([]); const [error, setError] = useState(null); const [selected, setSelected] = useState(null); const [history, setHistory] = useState(null); const [historyError, setHistoryError] = useState(null); useEffect(() => { let cancelled = false; async function poll() { try { const data = await fetchOverview(); if (!cancelled) { setModules(data); setError(null); } } catch (e: any) { // Ein nicht antwortendes Backend darf die zuletzt bekannte Ansicht // nicht loeschen und die Seite nicht unbedienbar machen // (Akzeptanzkriterium 2) — nur eine Fehlermeldung anzeigen, alte // Daten bleiben sichtbar. if (!cancelled) { setError(e.message ?? "Unbekannter Fehler beim Laden der Uebersicht"); } } } poll(); const id = setInterval(poll, POLL_INTERVAL_MS); return () => { cancelled = true; clearInterval(id); }; }, []); async function openHistory(name: string) { setSelected(name); setHistoryError(null); try { const data = await fetchHistory(name); setHistory(data); } catch (e: any) { setHistoryError(e.message ?? "Verlauf konnte nicht geladen werden"); setHistory(null); } } const anyDown = modules.some((m) => m.status === "down"); return (

Systemstatus

{error && (

Uebersicht konnte gerade nicht aktualisiert werden: {error}. Zuletzt bekannter Stand wird weiter angezeigt.

)} {!error && anyDown && (

Mindestens ein Modul ist derzeit nicht erreichbar.

)}
    {modules.map((m) => (
  • {m.name}
    {m.status === "up" ? "Verfügbar" : "Nicht verfügbar"} {m.last_checked && ` — zuletzt geprüft ${new Date(m.last_checked).toLocaleString("de-DE")}`}
  • ))} {modules.length === 0 && !error &&
  • Lade Modulstatus…
  • }
{selected && (

Verlauf: {selected}

{historyError && (

{historyError}

)} {history && (
    {history.map((h, i) => (
  • {new Date(h.changed_at).toLocaleString("de-DE")} — {h.status === "up" ? "verfügbar" : "nicht verfügbar"}
  • ))} {history.length === 0 &&
  • Keine Statusänderungen bisher.
  • }
)}
)}
); }