import type { MonitoringView, ServiceHealthView } from "@batch-cooking/shared"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { adminApiClient } from "../../../api/admin-client"; import "../admin-page.scss"; import "./monitoring-page.scss"; import { clockTime, POLL_INTERVAL_MS, statusModifier } from "./monitoring"; type MonitoringState = | { status: "loading" } | { status: "loaded"; data: MonitoringView } | { status: "error" }; /** * Microservice health board. Fetches `GET /admin/monitoring` on mount and * re-polls every {@link POLL_INTERVAL_MS} ms. One card per probed target * (Postgres, API, intent-service, LLM worker), coloured by status. */ export function MonitoringPage() { const { t } = useTranslation(); const [state, setState] = useState({ status: "loading" }); useEffect(() => { let cancelled = false; function load() { adminApiClient .getMonitoring() .then((data) => { if (!cancelled) setState({ status: "loaded", data }); }) .catch(() => { if (!cancelled) setState((prev) => (prev.status === "loaded" ? prev : { status: "error" })); }); } load(); const timer = setInterval(load, POLL_INTERVAL_MS); return () => { cancelled = true; clearInterval(timer); }; }, []); return (

{t("admin.monitoring.title")}

{t("admin.monitoring.lead")}

{state.status === "loading" && (

{t("admin.common.loading")}

)} {state.status === "error" && (

{t("admin.common.loadError")}

)} {state.status === "loaded" && ( <>

{t("admin.monitoring.lastChecked", { time: clockTime(state.data.generatedAt) })}

{state.data.services.map((service) => ( ))}
)}
); } function ServiceCard({ service }: { service: ServiceHealthView }) { const { t } = useTranslation(); return (
{service.latencyMs !== null && (
{t("admin.monitoring.latency")}
{service.latencyMs} ms
)} {service.detail && (
{t("admin.monitoring.detail")}
{service.detail}
)} {service.lastRunAt !== undefined && (
{t("admin.monitoring.lastRun")}
{service.lastRunAt ? clockTime(service.lastRunAt) : t("admin.monitoring.never")} {service.lastResult?.job ? ` · ${service.lastResult.job}` : ""} {service.lastResult?.ok === false ? ` · ${t("admin.monitoring.jobFailed")}` : ""}
)}
); }