import { AlertTriangle, CheckCircle, Info } from 'lucide-react' import { DashboardFramePanel } from '@/components/dashboard/dashboard-frame-panel' import { Badge } from '@/components/reui/badge' import { Timeline, TimelineContent, TimelineHeader, TimelineIndicator, TimelineItem, TimelineSeparator, TimelineTitle, } from '@/components/reui/timeline' import { cn } from '@evobgp/ui/lib/utils' import { recentPlatformActivity } from '@/lib/metrics' import type { JobRow, PeerRow, RevisionRow, SpeakerRow } from '@/types/api' const KIND_META = { job: { icon: Info, className: 'text-info' }, revision: { icon: CheckCircle, className: 'text-success' }, network: { icon: AlertTriangle, className: 'text-warning' }, } as const function statusBadgeVariant(status: string) { const s = status.toLowerCase() if (['ok', 'success', 'completed', 'done'].includes(s)) return 'success-light' as const if (['running', 'queued', 'pending'].includes(s)) return 'info-light' as const if (['warning', 'mismatch'].includes(s)) return 'warning-light' as const if (['failed', 'error', 'cancelled'].includes(s)) return 'destructive-light' as const return 'outline' as const } export function DashboardActivityTimeline({ jobs, revisions, peers, speakers, loading, }: { jobs: JobRow[] revisions: RevisionRow[] peers: PeerRow[] speakers: SpeakerRow[] loading?: boolean }) { const items = recentPlatformActivity(jobs, revisions, peers, speakers, 6) return ( {loading ? (

Загрузка…

) : items.length === 0 ? (

Нет недавних событий

) : (
{items.map((item, index) => { const meta = KIND_META[item.kind] const Icon = meta.icon return ( {item.message}
{item.statusLabel ?? item.status}
) })}
)}
) }