'use client'; import Link from 'next/link'; import { useState } from 'react'; import { PNum, StatusDot } from '@/components/ui/primitives'; import { adminFetch } from '@/lib/admin-fetch'; import { fmtDuration } from '@/lib/format'; import { Time } from '@/lib/time'; import type { AdminIncident } from '@/lib/types'; import { AdminPage, ErrorNote, Toast, btnCls, inputCls, useAdmin } from './shared'; export function IncidentsReview() { const [status, setStatus] = useState('all'); const { data, err, reload } = useAdmin<{ incidents: AdminIncident[] }>('/incidents', { status }); const [notes, setNotes] = useState>({}); const [msg, setMsg] = useState(null); const [actErr, setActErr] = useState(null); const review = async (i: AdminIncident, verdict: 'confirmed' | 'dismissed' | 'unreviewed') => { setActErr(null); try { await adminFetch(`/incidents/${encodeURIComponent(i.event_id)}`, { method: 'PATCH', body: { review: verdict, note: notes[i.event_id] ?? i.note ?? '' } }); setMsg(`${i.title}: ${verdict}`); reload(); } catch (e) { setActErr(String(e)); } finally { setTimeout(() => setMsg(null), 3000); } }; return ( setStatus(e.target.value)} className={inputCls} aria-label="Status filter"> {['all', 'active', 'resolved'].map((s) => ( ))} } >
    {(data?.incidents ?? []).map((i) => (
  • {i.title} {i.review ?? 'unreviewed'}

    {i.type} · {i.scope_label} ·

    {i.summary}