"use client"; import Link from "next/link"; import { useMemo, useState } from "react"; import { AlertTriangle, Check, CheckCheck } from "lucide-react"; import { SeverityBadge } from "@/components/ui/badge"; import { Select } from "@/components/ui/select"; import { useAlerts, useMarkAlertRead, useResolveAlert } from "@/hooks/use-alerts"; import { useCompanies } from "@/hooks/use-companies"; import { formatRelative } from "@/lib/format"; import { SEVERITY_LABELS, SEVERITY_LEVELS, type SeverityLevel } from "@/lib/types"; export default function AlertsPage() { const [companyId, setCompanyId] = useState(""); const [severity, setSeverity] = useState(""); const [unreadOnly, setUnreadOnly] = useState(false); const [showResolved, setShowResolved] = useState(false); const { data: companies } = useCompanies(); const { data: alerts, isLoading } = useAlerts({ company_id: companyId || undefined, severity: severity || undefined, read: unreadOnly ? false : undefined, resolved: showResolved ? undefined : false, }); const markRead = useMarkAlertRead(); const resolve = useResolveAlert(); const companyNameById = useMemo( () => new Map((companies ?? []).map((c) => [c.id, c.name])), [companies], ); const alertList = alerts ?? []; return (

Alerts

Meaningful changes detected across your monitored companies.

setSeverity(v as SeverityLevel | "")} placeholder="All severities" ariaLabel="Filter by severity" options={[ { value: "", label: "All severities" }, ...SEVERITY_LEVELS.map((s) => ({ value: s, label: SEVERITY_LABELS[s] })), ]} triggerClassName="px-3 py-1.5 text-sm" />
{isLoading ? (

Loading…

) : alertList.length === 0 ? (

No alerts match these filters.

) : (
    {alertList.map((alert) => (
  • {!alert.read && ( )} {alert.resolved && ( Resolved )}
    {alert.title}

    {companyNameById.get(alert.company_id) ?? "Unknown company"} ·{" "} {formatRelative(alert.created_at)} · {Math.round(alert.confidence * 100)}% confidence

    {!alert.read && ( )} {!alert.resolved && ( )}
  • ))}
)}
); }