import * as stylex from "@stylexjs/stylex"; import { formatBytes } from "@/lib/format"; import type { Health } from "@/lib/types"; import { colors } from "@/ui/tokens.stylex"; const styles = stylex.create({ stack: { display: "flex", flexDirection: "column", gap: "0.5rem", }, banner: { borderRadius: "0.25rem", borderWidth: 1, borderStyle: "solid", paddingInline: "1rem", paddingBlock: "0.5rem", fontSize: "0.875rem", lineHeight: "1.25rem", }, warn: { borderColor: colors.warnBorder, backgroundColor: colors.warnSurface, color: colors.warnText, }, critical: { borderColor: colors.dangerBorder, backgroundColor: colors.dangerSurface, color: colors.dangerText, }, }); function Banner({ tone, children }: { tone: "warn" | "critical"; children: React.ReactNode }) { return (

{children}

); } export default function HealthBanners({ health }: { health: Health }) { const banners: React.ReactNode[] = []; if (health.disk.state !== "ok") { banners.push( {health.disk.state === "critical" ? `Disk critically low: ${formatBytes(health.disk.free_bytes)} free. Blocklist updates and log flushes are stopped.` : `Disk space low: ${formatBytes(health.disk.free_bytes)} free.`} , ); } if (health.writer_failed) { banners.push( Query log writer failed; new queries are not being persisted. , ); } if (health.queries_dropped > 0) { banners.push( {health.queries_dropped.toLocaleString()} queries dropped from the log buffer. , ); } if (banners.length === 0) return null; return
{banners}
; }