import type react from "react"; import type { MantineColor, RingProgressProps } from "@mantine/core"; import { Box, Center, Grid, Group, RingProgress, Stack, Text, Title, useMantineColorScheme } from "@mantine/core"; import { IconDatabaseHeart, IconFileDescription, IconHeartbeat, IconTransform } from "@tabler/icons-react"; import { humanFileSize } from "@homarr/common"; import type { TdarrPieSegment, TdarrStatistics } from "@homarr/integrations"; import { useI18n } from "@homarr/translation/client"; const PIE_COLORS: MantineColor[] = ["cyan", "grape", "gray", "orange", "pink"]; interface StatisticsPanelProps { statistics: TdarrStatistics; } export function StatisticsPanel(props: StatisticsPanelProps) { const t = useI18n("widget.mediaTranscoding.panel.statistics"); const allLibs = props.statistics.pies.find((pie) => pie.libraryName === "All"); if (!allLibs) { return (
{t("empty")}
); } return ( {t("transcodes")} } label={t("transcodesCount", { value: props.statistics.totalTranscodeCount, })} /> } label={t("healthChecksCount", { value: props.statistics.totalHealthCheckCount, })} /> } label={t("filesCount", { value: props.statistics.totalFileCount, })} /> } label={t("savedSpace", { value: humanFileSize(Math.floor(allLibs.savedSpace)), })} /> {t("healthChecks")} {t("videoCodecs")} {t("videoContainers")} {t("videoResolutions")} ); } function toRingProgressSections(segments: TdarrPieSegment[]): RingProgressProps["sections"] { const total = segments.reduce((prev, curr) => prev + curr.value, 0); return segments.map((segment, index) => ({ value: (segment.value * 100) / total, tooltip: `${segment.name}: ${segment.value}`, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion color: PIE_COLORS[index % PIE_COLORS.length]!, // Ensures a valid color in the case that index > PIE_COLORS.length })); } interface StatBoxProps { icon: react.ReactNode; label: string; } function StatBox(props: StatBoxProps) { const { colorScheme } = useMantineColorScheme(); return ( ({ padding: theme.spacing.xs, border: "1px solid", borderRadius: theme.radius.md, borderColor: colorScheme === "dark" ? theme.colors.dark[5] : theme.colors.gray[1], })} > {props.icon} {props.label} ); }