import type { WidgetData } from "@/widgets"; import type { Item } from "@/types"; import { cn } from "@/lib/utils"; import { t } from "@/i18n"; // Board tile for a monitored system: status dot + cpu/mem/disk mini bars. // config.systemId binds it; data comes from the system fetcher. export function SystemWidget({ item, data, error }: { item: Item; data: WidgetData | undefined; error: string | undefined; }) { const status = typeof data?.status === "string" ? data.status : undefined; const sysId = typeof item.config?.systemId === "string" ? item.config.systemId : ""; const cpu = typeof data?.cpu === "number" ? data.cpu : undefined; const memTotal = typeof data?.memTotal === "number" ? data.memTotal : 0; const memUsed = typeof data?.memUsed === "number" ? data.memUsed : 0; const diskTotal = typeof data?.diskTotal === "number" ? data.diskTotal : 0; const diskUsed = typeof data?.diskUsed === "number" ? data.diskUsed : 0; const memPct = memTotal > 0 ? (memUsed / memTotal) * 100 : undefined; const diskPct = diskTotal > 0 ? (diskUsed / diskTotal) * 100 : undefined; const bar = (pct: number | undefined, label: string) => ( {label} 90 ? "bg-down" : "bg-up")} style={{ width: `${Math.min(pct ?? 0, 100)}%` }} /> ); return ( e.stopPropagation()} > {typeof data?.name === "string" ? data.name : item.name} {error ? ( {t("widget.err")} ) : ( {bar(cpu, "cpu")} {bar(memPct, "mem")} {bar(diskPct, "dsk")} )} ); }