import { useEffect, useState } from "react"; import { Box, Group, Popover, Progress, Stack, Text, UnstyledButton } from "@mantine/core"; import { useI18n } from "@homarr/translation/client"; import type { BeszelSystemRow } from "./types"; import { thresholdColor } from "./colors"; import { formatPercent, getProgressTrackSize } from "./format"; import classes from "./disk-usage.module.css"; interface DiskUsageProps { system: BeszelSystemRow; fontSize: string; progressSize: "xs" | "sm"; valueMiw: number; valueGap?: number; } const mountLabel = (path: string) => path === "/" ? "ROOT" : (path.split("/").filter(Boolean).at(-1) ?? path).toUpperCase(); const severityColor = (value: number) => `var(--mantine-color-${thresholdColor(value)}-6)`; export const DiskUsage = ({ system, fontSize, progressSize, valueMiw, valueGap = 6 }: DiskUsageProps) => { const t = useI18n("common"); const [opened, setOpened] = useState(false); const filesystems = Object.entries(system.extraFilesystems).filter(([path]) => path !== "/"); const filesystemUsageLabel = t("filesystemUsage", { count: filesystems.length + 1 }); const trackSize = getProgressTrackSize(progressSize); const dotSize = progressSize === "xs" ? 2 : 3; const dotGap = 2; useEffect(() => { if (filesystems.length === 0) setOpened(false); }, [filesystems.length]); return ( {formatPercent(system.disk)} {filesystems.length > 0 ? ( setOpened(true)} onMouseLeave={() => setOpened(false)} onBlur={() => setOpened(false)} onClick={() => setOpened(true)} style={{ display: "flex", alignItems: "center", flex: 1, cursor: "pointer", }} > {filesystems.map(([path, value]) => ( ))} {[["/", system.disk] as const, ...filesystems].map(([path, value]) => ( {mountLabel(path)} {formatPercent(value)} ))} ) : ( )} ); };