"use client"; import { Globe, Timer } from "@phosphor-icons/react/ssr"; import type { Widget } from "@/lib/config/schema"; import { useWidgetSubscription } from "@/lib/ws/client"; import { SkeletonLines } from "@/components/widgets/Skeleton"; import { WidgetCard } from "@/components/widgets/WidgetCard"; import { StatusTag } from "@/components/widgets/StatusTag"; type HttpWidget = Extract; function statusTone(up: boolean | undefined, consecutiveFailures: number): "accent" | "down" | "degraded" | "neutral" { if (up === undefined) return "neutral"; if (up) return "accent"; return consecutiveFailures > 2 ? "down" : "degraded"; } export function HttpWidget({ widget, widgetId }: { widget: HttpWidget; widgetId: string }) { const result = useWidgetSubscription(widgetId); const data = result?.type === "http" ? result.data : null; const errorMessage = result?.type === "error" ? result.message : null; return (
{widget.name}
{data ? (data.up ? `${data.statusCode ?? "up"}` : "down") : "…"}
{errorMessage && {errorMessage}} {!result && !errorMessage && } {data && (
{data.latencyMs}ms latency {!data.up && data.error && {data.error}}
)}
); }