"use client"; import type { EventRow } from "./types"; type Translator = (key: string, vars?: Record) => string; function secondsAgo(ts: string | undefined, locale: string, fallback: string) { if (!ts) return fallback; const diff = Math.floor((Date.now() - new Date(ts).getTime()) / 1000); const rtf = new Intl.RelativeTimeFormat(locale, { numeric: "auto" }); if (diff < 60) return rtf.format(-diff, "second"); if (diff < 3600) return rtf.format(-Math.floor(diff / 60), "minute"); return rtf.format(-Math.floor(diff / 3600), "hour"); } function severityClass(sev?: string) { const s = (sev ?? "").toLowerCase(); if (s === "critical") return "bg-red-500/15 text-red-300"; if (s === "warning") return "bg-yellow-500/15 text-yellow-300"; if (s === "info") return "bg-blue-500/15 text-blue-300"; return "bg-white/10 text-zinc-200"; } function sourceClass(src: EventRow["source"]) { if (src === "ingested") return "bg-white/10 text-zinc-200"; return "bg-white/10 text-zinc-200"; } function formatEventType(eventType: string | undefined, t: Translator) { if (!eventType) return ""; const key = `overview.event.${eventType}`; const label = t(key); return label === key ? eventType : label; } function formatSource(source: string | undefined, t: Translator) { if (!source) return ""; const key = `overview.source.${source}`; const label = t(key); return label === key ? source : label; } function formatSeverity(severity: string | undefined, t: Translator) { if (!severity) return ""; const key = `overview.severity.${severity}`; const label = t(key); return label === key ? severity.toUpperCase() : label; } export default function OverviewTimeline({ events, eventsLoading, locale, t, }: { events: EventRow[]; eventsLoading: boolean; locale: string; t: Translator; }) { if (eventsLoading && events.length === 0) { return (
{Array.from({ length: 4 }).map((_, idx) => (
))}
); } return (
{t("overview.timeline")}
{events.length} {t("overview.items")}
{events.length === 0 && !eventsLoading ? (
{t("overview.noEvents")}
) : (
{events.map((e) => (
{formatSeverity(e.severity, t)} {formatEventType(e.eventType, t)} {formatSource(e.source, t)} {e.requiresAck ? ( {t("overview.ack")} ) : null}
{e.machineName ? `${e.machineName}: ` : ""} {e.title}
{e.description ? (
{e.description}
) : null}
{secondsAgo(e.ts, locale, t("common.never"))}
))}
)}
); }