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}
);
}