From e6a1d14b091ccbdb3da04e99ec7c44f7dfdf8261 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Fri, 5 Jun 2026 16:08:34 +0800 Subject: [PATCH] fix: improve mobile terminal region tabs --- .../dashboard/ScanTerminalDashboard.tsx | 74 ++++++++++++------- .../scan-terminal/MobileRegionTabs.tsx | 5 +- .../__tests__/terminalGridPolicy.test.ts | 14 ++++ 3 files changed, 66 insertions(+), 27 deletions(-) diff --git a/frontend/components/dashboard/ScanTerminalDashboard.tsx b/frontend/components/dashboard/ScanTerminalDashboard.tsx index 034907f3..f5770296 100644 --- a/frontend/components/dashboard/ScanTerminalDashboard.tsx +++ b/frontend/components/dashboard/ScanTerminalDashboard.tsx @@ -861,24 +861,46 @@ function PolyWeatherTerminal({ () => buildContinentGroups(filteredRegionRows, isEn), [filteredRegionRows, isEn] ); + const mobileGroups = useMemo( + () => buildContinentGroups(rows, isEn), + [rows, isEn], + ); const [mobileTab, setMobileTab] = useState("active_signals"); const mobileActiveGroup = useMemo( - () => continentGroups.find((g) => g.key === mobileTab) || continentGroups[0], - [continentGroups, mobileTab] + () => mobileGroups.find((g) => g.key === mobileTab) || mobileGroups[0], + [mobileGroups, mobileTab], ); useEffect(() => { - if (continentGroups.length > 0 && !continentGroups.find((g) => g.key === mobileTab)) { - setMobileTab(continentGroups[0].key); + if (mobileGroups.length > 0 && !mobileGroups.find((g) => g.key === mobileTab)) { + setMobileTab(mobileGroups[0].key); } - }, [continentGroups, mobileTab]); + }, [mobileGroups, mobileTab]); + const mobileSelectedRowInActiveGroup = useMemo( + () => + selectedRow && mobileActiveGroup?.rows.some((row) => row.id === selectedRow.id) + ? selectedRow + : null, + [mobileActiveGroup?.rows, selectedRow], + ); const mobileChartRow = useMemo( () => - selectedRow || - mobileActiveGroup?.rows.slice(0, MOBILE_TERMINAL_CHARTS)[0] || + mobileSelectedRowInActiveGroup || + mobileActiveGroup?.rows[0] || filteredRegionRows[0] || null, - [filteredRegionRows, mobileActiveGroup?.rows, selectedRow], + [filteredRegionRows, mobileActiveGroup?.rows, mobileSelectedRowInActiveGroup], ); + const handleMobileSelectTab = useCallback((key: string) => { + setMobileTab(key); + if (selectedRegionKey !== "all") { + setSelectedRegionKey("all"); + } + const nextGroup = mobileGroups.find((group) => group.key === key); + const nextRow = nextGroup?.rows[0]; + if (nextRow) { + setSelectedRow(nextRow); + } + }, [mobileGroups, selectedRegionKey, setSelectedRegionKey, setSelectedRow]); useEffect(() => { if (!filteredRegionRows.length) return; if (!selectedRow || !filteredRegionRows.some((row) => row.id === selectedRow.id)) { @@ -967,16 +989,18 @@ function PolyWeatherTerminal({ <> {/* Mobile layout */}
- -
- {isEn - ? "Mobile renders one chart. Rotate to landscape to inspect the full terminal grid." - : "手机端仅渲染 1 个图表。建议横屏查看完整终端网格。"} +
+ +
+ {isEn + ? "Mobile renders one chart. Rotate to landscape for the full grid." + : "手机端仅渲染 1 个图表。建议横屏查看完整终端网格。"} +
{mobileChartRow && (
@@ -1001,16 +1025,16 @@ function PolyWeatherTerminal({ ))}
{/* Mobile Selected Row Detail */} - {selectedRow && ( + {mobileChartRow && (
-

{rowName(selectedRow)}

+

{rowName(mobileChartRow)}

{[ - ["Obs", temp(selectedRow.current_temp, selectedRow.temp_symbol)], - ["High", temp(selectedRow.current_max_so_far, selectedRow.temp_symbol)], - ["DEB", temp(selectedRow.deb_prediction, selectedRow.temp_symbol)], - ["Gap", temp(selectedRow.signed_gap ?? selectedRow.gap_to_target, selectedRow.temp_symbol)], - ["Edge", pct(selectedRow.edge_percent)], + ["Obs", temp(mobileChartRow.current_temp, mobileChartRow.temp_symbol)], + ["High", temp(mobileChartRow.current_max_so_far, mobileChartRow.temp_symbol)], + ["DEB", temp(mobileChartRow.deb_prediction, mobileChartRow.temp_symbol)], + ["Gap", temp(mobileChartRow.signed_gap ?? mobileChartRow.gap_to_target, mobileChartRow.temp_symbol)], + ["Edge", pct(mobileChartRow.edge_percent)], ["Market", "--"], ].map(([label, value]) => (
diff --git a/frontend/components/dashboard/scan-terminal/MobileRegionTabs.tsx b/frontend/components/dashboard/scan-terminal/MobileRegionTabs.tsx index 53868e74..5713abbd 100644 --- a/frontend/components/dashboard/scan-terminal/MobileRegionTabs.tsx +++ b/frontend/components/dashboard/scan-terminal/MobileRegionTabs.tsx @@ -15,7 +15,7 @@ export function MobileRegionTabs({ onSelectTab: (key: string) => void; }) { return ( -
+
{groups.map((g) => { const label = isEn ? g.labelEn : g.labelZh; const isActive = activeTab === g.key; @@ -23,9 +23,10 @@ export function MobileRegionTabs({