From c065cdf7313190e00c9d44ae5999ceff1bdcdcf0 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 28 May 2026 07:46:53 -0500 Subject: [PATCH] stabilize chart options to stop ApexCharts updateOptions running on every stats tick --- web/src/components/graph/LineGraph.tsx | 50 +++++++++++++++--------- web/src/components/graph/SystemGraph.tsx | 25 +++++++----- 2 files changed, 48 insertions(+), 27 deletions(-) diff --git a/web/src/components/graph/LineGraph.tsx b/web/src/components/graph/LineGraph.tsx index b571bdfc25..c7d1b0f4e6 100644 --- a/web/src/components/graph/LineGraph.tsx +++ b/web/src/components/graph/LineGraph.tsx @@ -56,18 +56,25 @@ export function CameraLineGraph({ }); }, [t, timeFormat]); + const updateTimesRef = useRef(updateTimes); + useEffect(() => { + updateTimesRef.current = updateTimes; + }, [updateTimes]); + const formatTime = useCallback( (val: unknown) => { - return formatUnixTimestampToDateTime( - updateTimes[Math.round(val as number)], - { - timezone: config?.ui.timezone, - date_format: format, - locale, - }, - ); + const times = updateTimesRef.current; + const ts = times[Math.round(val as number)]; + if (isNaN(ts)) { + return ""; + } + return formatUnixTimestampToDateTime(ts, { + timezone: config?.ui.timezone, + date_format: format, + locale, + }); }, - [config?.ui.timezone, format, locale, updateTimes], + [config?.ui.timezone, format, locale], ); const options = useMemo(() => { @@ -211,18 +218,25 @@ export function EventsPerSecondsLineGraph({ }); }, [t, timeFormat]); + const updateTimesRef = useRef(updateTimes); + useEffect(() => { + updateTimesRef.current = updateTimes; + }, [updateTimes]); + const formatTime = useCallback( (val: unknown) => { - return formatUnixTimestampToDateTime( - updateTimes[Math.round(val as number) - 1], - { - timezone: config?.ui.timezone, - date_format: format, - locale, - }, - ); + const times = updateTimesRef.current; + const ts = times[Math.round(val as number) - 1]; + if (isNaN(ts)) { + return ""; + } + return formatUnixTimestampToDateTime(ts, { + timezone: config?.ui.timezone, + date_format: format, + locale, + }); }, - [config?.ui.timezone, format, locale, updateTimes], + [config?.ui.timezone, format, locale], ); const options = useMemo(() => { diff --git a/web/src/components/graph/SystemGraph.tsx b/web/src/components/graph/SystemGraph.tsx index c1ee47f710..f7610cf30f 100644 --- a/web/src/components/graph/SystemGraph.tsx +++ b/web/src/components/graph/SystemGraph.tsx @@ -61,6 +61,11 @@ export function ThresholdBarGraph({ }); }, [t, timeFormat]); + const updateTimesRef = useRef(updateTimes); + useEffect(() => { + updateTimesRef.current = updateTimes; + }, [updateTimes]); + const formatTime = useCallback( (val: unknown) => { const dateIndex = Math.round(val as number); @@ -69,16 +74,18 @@ export function ThresholdBarGraph({ if (dateIndex < 0) { timeOffset = 5 * Math.abs(dateIndex); } - return formatUnixTimestampToDateTime( - updateTimes[Math.max(1, dateIndex) - 1] - timeOffset, - { - timezone: config?.ui.timezone, - date_format: format, - locale, - }, - ); + const times = updateTimesRef.current; + const ts = times[Math.max(1, dateIndex) - 1] - timeOffset; + if (isNaN(ts)) { + return ""; + } + return formatUnixTimestampToDateTime(ts, { + timezone: config?.ui.timezone, + date_format: format, + locale, + }); }, - [config?.ui.timezone, format, locale, updateTimes], + [config?.ui.timezone, format, locale], ); const options = useMemo(() => {