import { useMemo, useState } from "react"; import type { Alert, AlertTransition } from "@/api"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; type Props = { alerts: Alert[]; transitions: AlertTransition[]; alertsHealth: { available: boolean; reason?: string } | null; alertsStreamConnected: boolean; onRefresh: () => Promise; }; export function AlertsPage({ alerts, transitions, alertsHealth, alertsStreamConnected, onRefresh, }: Props) { const [severity, setSeverity] = useState("all"); const [status, setStatus] = useState("all"); const [kind, setKind] = useState("all"); const [transitionQ, setTransitionQ] = useState(""); const severities = useMemo( () => ["all", ...Array.from(new Set(alerts.map((a) => a.severity))).sort()], [alerts], ); const statuses = useMemo( () => ["all", ...Array.from(new Set(alerts.map((a) => a.status))).sort()], [alerts], ); const kinds = useMemo( () => ["all", ...Array.from(new Set(alerts.map((a) => a.kind))).sort()], [alerts], ); const filteredAlerts = useMemo( () => alerts.filter( (a) => (severity === "all" || a.severity === severity) && (status === "all" || a.status === status) && (kind === "all" || a.kind === kind), ), [alerts, severity, status, kind], ); const filteredTransitions = useMemo(() => { const q = transitionQ.trim().toLowerCase(); if (!q) return transitions; return transitions.filter( (t) => t.kind.toLowerCase().includes(q) || t.to_status.toLowerCase().includes(q) || t.message.toLowerCase().includes(q) || (t.agent_id || "").toLowerCase().includes(q), ); }, [transitions, transitionQ]); return (
Active Alerts
{!alertsStreamConnected &&
Alert stream disconnected
} {alertsHealth?.available === false && (
Alert results may be stale or unavailable {alertsHealth.reason ? `: ${alertsHealth.reason}` : ""}
)}

Showing {filteredAlerts.length} of {alerts.length}

{filteredAlerts.map((alert) => (
{alert.kind} {alert.agent_id ? ` (${alert.agent_id})` : ""} {alert.severity}
))} {!filteredAlerts.length && (
No active alerts
)}
Transition History {filteredTransitions.length} shown