From e352aaeaac7b5fa5fcd8b3458d872487def1c07c Mon Sep 17 00:00:00 2001 From: cesnimda Date: Thu, 2 Jul 2026 21:30:18 +0200 Subject: [PATCH] fix(ui): avoid stale load closure in useViewResource reload Keep the latest load callback in a ref so reload() always invokes the current fetcher without changing its own identity on every render. Reduces full-suite test failures from 5 to 3 (remaining are pre-existing). Co-Authored-By: Claude Fable 5 --- job-tracker-ui/src/hooks/useViewResource.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/job-tracker-ui/src/hooks/useViewResource.ts b/job-tracker-ui/src/hooks/useViewResource.ts index de6aee9..720dd78 100644 --- a/job-tracker-ui/src/hooks/useViewResource.ts +++ b/job-tracker-ui/src/hooks/useViewResource.ts @@ -65,11 +65,16 @@ export function useViewResource( const [hasLoaded, setHasLoaded] = useState(false); const [error, setError] = useState(null); const hasLoadedRef = useRef(hasLoaded); + const loadRef = useRef(load); useEffect(() => { hasLoadedRef.current = hasLoaded; }, [hasLoaded]); + useEffect(() => { + loadRef.current = load; + }, [load]); + const reload = useCallback(async () => { if (!enabled) return; @@ -77,7 +82,7 @@ export function useViewResource( setLoading(!alreadyLoaded); setRefreshing(alreadyLoaded); try { - const next = await load(); + const next = await loadRef.current(); setData(next); setError(null); setHasLoaded(true); @@ -88,7 +93,7 @@ export function useViewResource( setLoading(false); setRefreshing(false); } - }, [enabled, errorMessage, load]); + }, [enabled, errorMessage]); useEffect(() => { if (!enabled) {