import { useTranslation } from "@termix/plugin-sdk/frontend"; import { Cpu, MemoryStick, HardDrive, Clock, Server } from "lucide-react"; import type { ProxmoxNodeStats } from "../types"; import { cn } from "./utils"; function Tile({ icon, label, percent, detail, sparkline, }: { icon: React.ReactNode; label: string; percent: number | null; detail?: string | null; sparkline?: number[]; }) { const clamped = percent === null ? null : Math.min(100, Math.max(0, percent)); const barColor = clamped === null ? "bg-muted-foreground/30" : clamped >= 90 ? "bg-red-500" : clamped >= 75 ? "bg-yellow-500" : "bg-accent-brand"; return (
{icon} {label}
{clamped === null ? "N/A" : `${clamped.toFixed(0)}%`} {detail && ( {detail} )}
{sparkline && sparkline.length > 1 && }
); } function MiniSparkline({ data }: { data: number[] }) { const w = 100; const h = 20; const max = 100; const points = data .map((v, i) => { const x = (i / (data.length - 1)) * w; const y = h - (Math.min(100, Math.max(0, v)) / max) * h; return `${x.toFixed(1)},${y.toFixed(1)}`; }) .join(" "); return ( ); } export function NodeSummaryStrip({ node, histories, }: { node: ProxmoxNodeStats | undefined; histories: { cpu: number[]; memory: number[]; disk: number[] }; }) { const { t } = useTranslation(); return (
} label={t("proxmoxStats.cpuUsage")} percent={node?.cpu.percent ?? null} detail={ node?.cpu.cores != null ? t("proxmoxStats.cpuCores", { count: node.cpu.cores }) : undefined } sparkline={histories.cpu} /> } label={t("proxmoxStats.memoryUsage")} percent={node?.memory.percent ?? null} detail={ node?.memory.usedGiB != null && node?.memory.totalGiB != null ? `${node.memory.usedGiB.toFixed(1)} / ${node.memory.totalGiB.toFixed(1)} GiB` : undefined } sparkline={histories.memory} /> } label={t("proxmoxStats.diskUsage")} percent={node?.disk.percent ?? null} detail={ node?.disk.usedGiB != null && node?.disk.totalGiB != null ? `${node.disk.usedGiB.toFixed(1)} / ${node.disk.totalGiB.toFixed(1)} GiB` : undefined } sparkline={histories.disk} />
{t("proxmoxStats.uptime")}
{node?.uptime.formatted ?? "N/A"}
{node?.system.hostname ?? "-"} {node?.system.pveVersion ? ` ยท ${node.system.pveVersion}` : ""}
); }