import { X } from 'lucide-react'; import { useMemo, useState } from 'react'; import { getDomainColor, getSeverityColor } from '../../lib/command/utils'; import type { DomainId, SeverityLevel, TimelineEvent } from '../types'; interface TimelineProps { events: TimelineEvent[]; } const SEVERITY_OPTIONS: SeverityLevel[] = ['critical', 'high', 'medium', 'low', 'info']; const DOMAIN_OPTIONS: DomainId[] = [ 'aegis', 'vessels', 'szl', 'lyte', 'prism', 'terra', 'carlota', 'stephen', ]; const PAGE_SIZE = 8; export function Timeline({ events }: TimelineProps) { const [domainFilter, setDomainFilter] = useState(null); const [severityFilter, setSeverityFilter] = useState(null); const [page, setPage] = useState(1); const filtered = useMemo(() => { return events.filter((e) => { if (domainFilter && e.domain !== domainFilter) return false; if (severityFilter && e.severity !== severityFilter) return false; return true; }); }, [events, domainFilter, severityFilter]); const visible = filtered.slice(0, page * PAGE_SIZE); const hasMore = visible.length < filtered.length; const domainsPresent = useMemo(() => { const s = new Set(events.map((e) => e.domain as DomainId)); return DOMAIN_OPTIONS.filter((d) => s.has(d)); }, [events]); const clearFilters = () => { setDomainFilter(null); setSeverityFilter(null); setPage(1); }; const hasFilters = domainFilter !== null || severityFilter !== null; return (

Cross-Domain Feed

{hasFilters && ( )}
{domainsPresent.map((d) => { const active = domainFilter === d; const color = getDomainColor(d); return ( ); })}
{SEVERITY_OPTIONS.map((s) => { const active = severityFilter === s; const color = getSeverityColor(s); return ( ); })}
{visible.length === 0 ? (
No events match the current filters.
) : ( <> {visible.map((event) => (
{event.time} / {event.domain} / {event.severity}

{event.title}

{event.detail}

))} {hasMore && ( )} )}
); }