import { useParams, useNavigate } from '@tanstack/react-router'; import { useGlobalEvent } from '../api/hooks'; import { StatusBadge, ConfidenceBar, LoadingSpinner, Card } from '../components/ui'; import { DataTable, type Column } from '../components/DataTable'; import type { MacroImpactRecord } from '../api/hooks'; 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', }; const impactCols: Column[] = [ { key: 'ticker', header: 'Ticker', render: (r) => {r.ticker} }, { key: 'macro_impact_score', header: 'Impact Score', render: (r) => }, { key: 'impact_direction', header: 'Direction', render: (r) => }, { key: 'contributing_factors', header: 'Contributing Factors', render: (r) => (
{r.contributing_factors.map((f, i) => ( {f} ))}
), }, { key: 'confidence', header: 'Confidence', render: (r) => }, { key: 'computed_at', header: 'Computed', render: (r) => {new Date(r.computed_at).toLocaleString()} }, ]; export function GlobalEventDetailPage() { const { id } = useParams({ from: '/macro/events/$id' }); const navigate = useNavigate(); const { data: event, isLoading } = useGlobalEvent(id); if (isLoading || !event) return ; const sevCls = severityColors[event.severity] ?? 'bg-gray-800/40 text-gray-400 border-gray-700/50'; return (

Global Event

{event.severity} {event.estimated_duration.replace(/_/g, ' ')}

Summary

{event.summary}

Impact Types
{event.event_types.map((t) => ( {t.replace(/_/g, ' ')} ))}
Regions
{event.affected_regions.map((r) => ( {r} ))}
Sectors
{event.affected_sectors.map((s) => ( {s} ))}
Confidence
{event.key_facts && event.key_facts.length > 0 && (

Key Facts

    {event.key_facts.map((f, i) =>
  • {f}
  • )}
)}

Affected Companies ({event.impacts?.length ?? 0})

data={event.impacts ?? []} columns={impactCols} keyField="id" onRowClick={(row) => navigate({ to: '/companies/$id', params: { id: row.company_id } })} filterFn={(row, q) => row.ticker.toLowerCase().includes(q.toLowerCase())} />
); }