import { useState } from 'react'; import { useNavigate } from '@tanstack/react-router'; import { useGlobalEvents } from '../api/hooks'; import { DataTable, type Column } from '../components/DataTable'; import { LoadingSpinner } from '../components/ui'; import type { GlobalEvent } from '../api/hooks'; const SEVERITIES = ['low', 'moderate', 'high', 'critical']; const severityColors: Record = { critical: 'bg-red-900/40 text-red-400 border-red-700/50', high: 'bg-orange-900/40 text-orange-400 border-orange-700/50', moderate: 'bg-yellow-900/40 text-yellow-400 border-yellow-700/50', low: 'bg-green-900/40 text-green-400 border-green-700/50', }; function SeverityBadge({ severity }: { severity: string }) { const cls = severityColors[severity] ?? 'bg-gray-800/40 text-gray-400 border-gray-700/50'; return ( {severity} ); } const columns: Column[] = [ { key: 'summary', header: 'Summary', render: (r) => {r.summary}, }, { key: 'event_types', header: 'Impact Types', render: (r) => (
{r.event_types.map((t) => ( {t.replace(/_/g, ' ')} ))}
), }, { key: 'severity', header: 'Severity', render: (r) => , }, { key: 'affected_regions', header: 'Regions', render: (r) => (
{r.affected_regions.slice(0, 4).map((reg) => ( {reg} ))} {r.affected_regions.length > 4 && +{r.affected_regions.length - 4}}
), }, { key: 'affected_sectors', header: 'Sectors', render: (r) => (
{r.affected_sectors.slice(0, 3).map((s) => ( {s} ))} {r.affected_sectors.length > 3 && +{r.affected_sectors.length - 3}}
), }, { key: 'created_at', header: 'Event Date', render: (r) => {new Date(r.created_at).toLocaleDateString()}, }, ]; export function GlobalEventsPage() { const navigate = useNavigate(); const [severity, setSeverity] = useState(''); const { data, isLoading, error } = useGlobalEvents({ severity: severity || undefined, limit: 100, }); if (isLoading) return ; if (error) return
Failed to load global events
; return (

Global Events

{SEVERITIES.map((s) => ( ))}
data={data ?? []} columns={columns} keyField="id" onRowClick={(row) => navigate({ to: '/macro/events/$id', params: { id: row.id } })} filterFn={(row, q) => { const lq = q.toLowerCase(); return row.summary.toLowerCase().includes(lq) || row.event_types.some((t) => t.toLowerCase().includes(lq)); }} />
); }