import { useCallback, useEffect, useState } from "react"; import { api } from "@/api"; import type { PublicStatus } from "@/types"; import { cn } from "@/lib/utils"; import { t } from "@/i18n"; // Public status page — clean read-only view; refreshes every 30s. // Route: /status/:slug -> GET /api/status-pages/:slug/public. // status strings arrive as plain `string` — map with functions, not // open dictionaries, so the lookup type stays honest. function overallBanner(overall?: string) { if (overall === "down") return { label: t("statusPublic.outage"), cls: "bg-down" }; if (overall === "maintenance") return { label: t("statusPublic.underMaintenance"), cls: "bg-text-faint/60" }; if (overall === "up") return { label: t("statusPublic.operational"), cls: "bg-up" }; return { label: t("statusPublic.checking"), cls: "bg-text-faint/40" }; } function dotCls(status?: string) { if (status === "up") return "bg-up"; if (status === "down") return "bg-down"; if (status === "maintenance") return "bg-text-faint/60"; return "bg-text-faint/40"; } export function StatusPublicPage({ slug }: { slug: string }) { const [st, setSt] = useState(null); const [missing, setMissing] = useState(false); const load = useCallback(async () => { const { data, response } = await api.GET("/api/status-pages/{slug}/public", { params: { path: { slug } } }); if (response.status === 404) setMissing(true); if (data) setSt(data); }, [slug]); useEffect(() => { void load(); const t = setInterval(() => void load(), 30_000); return () => clearInterval(t); }, [load]); if (missing) return
{t("statusPublic.notFound")}
; if (!st) return
{t("common.loading")}
; const banner = overallBanner(st.overall); return (

{st.title}

{st.description ?

{st.description}

: null}
{banner.label}
{(st.monitors ?? []).length > 0 && (

{t("statusPublic.services")}

{(st.monitors ?? []).map((m) => (
{m.name} {m.uptime24h?.toFixed(1)}% {m.status}
))}
)} {(st.systems ?? []).length > 0 && (

{t("statusPublic.systems")}

{(st.systems ?? []).map((s) => (
{s.name} {s.status}
))}
)} {(st.maintenance ?? []).length > 0 && (

{t("statusPublic.maintenance")}

{(st.maintenance ?? []).map((w) => (
{w.title} {new Date(w.startsAt ?? "").toLocaleString()} → {new Date(w.endsAt ?? "").toLocaleString()}
))}
)} {(st.incidents ?? []).length > 0 && (

{t("statusPublic.incidents")}

{(st.incidents ?? []).map((inc) => (
{inc.title} {inc.status}
{(inc.updates ?? []).slice(-3).map((u) => (

{u.status} — {u.message}

))}
))}
)}

{t("statusPublic.footer")}

); }