From b3496bed2ddc00be19c1dfcfddb396442c2b8cfa Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Tue, 26 May 2026 23:28:43 +0800 Subject: [PATCH] feat: add LiveTemperatureThresholdChart component with SSE-driven data synchronization and automated polling fallback --- .../LiveTemperatureThresholdChart.tsx | 32 ++++++++++++------- .../__tests__/ssePatchArchitecture.test.ts | 9 ++++++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/frontend/components/dashboard/scan-terminal/LiveTemperatureThresholdChart.tsx b/frontend/components/dashboard/scan-terminal/LiveTemperatureThresholdChart.tsx index 6a1df25b..0a0d365c 100644 --- a/frontend/components/dashboard/scan-terminal/LiveTemperatureThresholdChart.tsx +++ b/frontend/components/dashboard/scan-terminal/LiveTemperatureThresholdChart.tsx @@ -295,31 +295,33 @@ export function LiveTemperatureThresholdChart({ [data, series, viewMode], ); const visibleRange = zoomRange ?? autoWindowRange; + const visibleRangeKey = visibleRange ? `${visibleRange[0]}:${visibleRange[1]}` : "full"; const zoomedData = useMemo(() => { if (!visibleRange || data.length === 0) return data; const [start, end] = visibleRange; return data.slice(start, end + 1); - }, [data, visibleRange]); + }, [data, visibleRangeKey]); - useEffect(() => { + const nextTargetResolution = useMemo(() => { if (visibleRange && data.length > 0) { const zoomedData = data.slice(visibleRange[0], visibleRange[1] + 1); if (zoomedData.length > 0) { const startTs = zoomedData[0].ts; const endTs = zoomedData[zoomedData.length - 1].ts; if (endTs - startTs <= 2 * 60 * 60 * 1000) { - setTargetResolution("1m"); - } else { - setTargetResolution("10m"); + return "1m"; } - } else { - setTargetResolution("10m"); } - } else { - setTargetResolution("10m"); } - }, [visibleRange, data]); + return "10m"; + }, [data, visibleRangeKey]); + + useEffect(() => { + if (targetResolution !== nextTargetResolution) { + setTargetResolution(nextTargetResolution); + } + }, [targetResolution, nextTargetResolution]); const tzOffset = row?.tz_offset_seconds ?? 0; const settlementObs = useMemo(() => { @@ -786,7 +788,7 @@ export function LiveTemperatureThresholdChart({ )} {/* Chart */} -
+
{/* Interactive legend */}
{chartSeries.length > 1 && @@ -832,7 +834,13 @@ export function LiveTemperatureThresholdChart({ )}
- +