import { useEffect, useState } from "react"; import { DismissibleAlert, LoadingFrame, MetricCard, StatusBadge, adminErrorMessage, type ApiSettings } from "@govoplan/core-webui"; import { fetchOpsStatus, type OpsStatus } from "../../api/ops"; export default function OpsHealthWidget({ settings, refreshKey }: { settings: ApiSettings; refreshKey: number }) { const [status, setStatus] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); useEffect(() => { let cancelled = false; setLoading(true); setError(""); fetchOpsStatus(settings). then((next) => {if (!cancelled) setStatus(next);}). catch((err) => {if (!cancelled) setError(adminErrorMessage(err));}). finally(() => {if (!cancelled) setLoading(false);}); return () => {cancelled = true;}; }, [settings.apiBaseUrl, settings.apiKey, settings.accessToken, refreshKey]); const checks = status?.checks ?? []; const warningCount = checks.filter((item) => item.state === "warning").length; const errorCount = checks.filter((item) => item.state === "error").length; const ready = status?.readiness.ready ?? false; const workerMetrics = status?.summary.worker_metrics; const queueDepths = workerMetrics?.queue_depths ?? {}; const queuedTasks = Object.values(queueDepths).reduce((sum, value) => sum + value, 0); const missingQueues = workerMetrics?.missing_queues ?? []; const storageUsage = status?.summary.storage_metrics?.capacity_used_percent; return ( {error && {error}}
= 90 ? "danger" : storageUsage !== undefined && storageUsage >= 75 ? "warning" : "neutral"} detail="Managed Files backend capacity" />
{status?.readiness.blockers.length ?
{status.readiness.blockers.slice(0, 3).map((blocker) =>
{blocker.label} ยท {blocker.detail}
)}
:

No readiness blockers reported.

}
); }