From ff351b38d734bf6b7a9f211d21fb816505b52271 Mon Sep 17 00:00:00 2001 From: jlightner Date: Fri, 3 Apr 2026 08:21:51 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20run=20card=20collapse=20flicker=20?= =?UTF-8?q?=E2=80=94=20auto-expand=20only=20on=20first=20load,=20not=20on?= =?UTF-8?q?=20every=20re-render?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The load callback had expandedRunId in its dependency array, so collapsing (setting expandedRunId=null) triggered a reload which re-expanded it. Replaced with a useRef flag that fires once. --- frontend/src/pages/AdminPipeline.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/AdminPipeline.tsx b/frontend/src/pages/AdminPipeline.tsx index eb7d781..f80de1f 100644 --- a/frontend/src/pages/AdminPipeline.tsx +++ b/frontend/src/pages/AdminPipeline.tsx @@ -709,6 +709,7 @@ function RunList({ videoId, videoStatus }: { videoId: string; videoStatus: strin const [loading, setLoading] = useState(true); const [expandedRunId, setExpandedRunId] = useState(null); const [showLegacy, setShowLegacy] = useState(false); + const hasAutoExpanded = useRef(false); const load = useCallback(async (silent = false) => { if (!silent) setLoading(true); @@ -716,17 +717,18 @@ function RunList({ videoId, videoStatus }: { videoId: string; videoStatus: strin const res = await fetchPipelineRuns(videoId); setRuns(res.items); setLegacyCount(res.legacy_event_count); - // Auto-expand the latest run on first load - if (!silent && res.items.length > 0 && expandedRunId === null) { + // Auto-expand the latest run only on first load + if (!hasAutoExpanded.current && res.items.length > 0) { const firstRun = res.items[0]; if (firstRun) setExpandedRunId(firstRun.id); + hasAutoExpanded.current = true; } } catch { // silently fail } finally { if (!silent) setLoading(false); } - }, [videoId, expandedRunId]); + }, [videoId]); useEffect(() => { void load();