import { useTheme } from "@/context/theme-provider"; import { FrigateConfig } from "@/types/frigateConfig"; import { useCallback, useEffect, useMemo } from "react"; import Chart from "react-apexcharts"; import { isMobileOnly } from "react-device-detect"; import { MdCircle } from "react-icons/md"; import useSWR from "swr"; const GRAPH_COLORS = ["#5C7CFA", "#ED5CFA", "#FAD75C"]; type CameraLineGraphProps = { graphId: string; unit: string; dataLabels: string[]; updateTimes: number[]; data: ApexAxisChartSeries; }; export function CameraLineGraph({ graphId, unit, dataLabels, updateTimes, data, }: CameraLineGraphProps) { const { data: config } = useSWR("config", { revalidateOnFocus: false, }); const lastValues = useMemo(() => { if (!dataLabels || !data || data.length == 0) { return undefined; } return dataLabels.map( (_, labelIdx) => // @ts-expect-error y is valid data[labelIdx].data[data[labelIdx].data.length - 1]?.y ?? 0, ) as number[]; }, [data, dataLabels]); const { theme, systemTheme } = useTheme(); const formatTime = useCallback( (val: unknown) => { const date = new Date(updateTimes[Math.round(val as number)] * 1000); return date.toLocaleTimeString([], { hour12: config?.ui.time_format != "24hour", hour: "2-digit", minute: "2-digit", }); }, [config, updateTimes], ); const options = useMemo(() => { return { chart: { id: graphId, selection: { enabled: false, }, toolbar: { show: false, }, zoom: { enabled: false, }, }, colors: GRAPH_COLORS, grid: { show: false, }, legend: { show: false, }, dataLabels: { enabled: false, }, stroke: { width: 1, }, tooltip: { theme: systemTheme || theme, }, markers: { size: 0, }, xaxis: { tickAmount: isMobileOnly ? 3 : 4, tickPlacement: "on", labels: { rotate: 0, formatter: formatTime, }, axisBorder: { show: false, }, axisTicks: { show: false, }, }, yaxis: { show: true, labels: { formatter: (val: number) => Math.ceil(val).toString(), }, min: 0, }, } as ApexCharts.ApexOptions; }, [graphId, systemTheme, theme, formatTime]); useEffect(() => { ApexCharts.exec(graphId, "updateOptions", options, true, true); }, [graphId, options]); return (
{lastValues && (
{dataLabels.map((label, labelIdx) => (
{label}
{lastValues[labelIdx]} {unit}
))}
)}
); }