/* eslint-disable @typescript-eslint/no-explicit-any */ import type { ReactNode } from "react"; import type { AreaChartSeries } from "@mantine/charts"; import { AreaChart, LineChart } from "@mantine/charts"; import { Card, Center, Group, Loader, Stack, Text, useMantineColorScheme, useMantineTheme } from "@mantine/core"; import { useElementSize, useHover, useMergedRef } from "@mantine/hooks"; import type { TooltipProps, YAxisProps } from "recharts"; import { useRequiredBoard } from "@homarr/boards/context"; import type { TablerIcon } from "@homarr/ui"; import type { LabelDisplayModeOption } from ".."; export const CommonChart = ({ data, dataKey, series, title, icon: Icon, labelDisplayMode, tooltipProps, yAxisProps, lastValue, chartType = "line", }: { data: Record[]; dataKey: string; series: AreaChartSeries[]; title: ReactNode; icon: TablerIcon; labelDisplayMode: LabelDisplayModeOption; tooltipProps?: TooltipProps; yAxisProps?: Omit; lastValue?: string; chartType?: "line" | "area"; }) => { const { ref: elementSizeRef, height } = useElementSize(); const theme = useMantineTheme(); const scheme = useMantineColorScheme(); const board = useRequiredBoard(); const { hovered, ref: hoverRef } = useHover(); const ref = useMergedRef(elementSizeRef, hoverRef); const opacity = board.opacity / 100; const backgroundColor = scheme.colorScheme === "dark" ? `rgba(57, 57, 57, ${opacity})` : `rgba(246, 247, 248, ${opacity})`; const ChartComponent = chartType === "line" ? LineChart : AreaChart; const showIcon = labelDisplayMode === "icon" || labelDisplayMode === "textWithIcon"; const showText = labelDisplayMode === "text" || labelDisplayMode === "textWithIcon"; return ( {data.length > 1 && height > 40 && !hovered && ( {showIcon && 100 ? 20 : 14} stroke={1.5} />} {showText && ( 100 ? "md" : "xs"} fw={"bold"}> {title} )} {lastValue && ( 100 ? "md" : "xs"} lineClamp={1}> {lastValue} )} )} {data.length <= 1 ? (
100 ? "md" : "xs"} color={"rgba(94, 94, 94, 1)"} />
) : ( = 64} yAxisProps={yAxisProps} fillOpacity={chartType === "area" ? 0.3 : undefined} /> )}
); };