From df242014bcb9ff986c8fe27b9889c7d9e9d4fcdb Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 30 Dec 2025 19:20:48 -0500 Subject: [PATCH] Prevent stale fetches on filter change --- src/components/Map/usePostsEngine.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/Map/usePostsEngine.js b/src/components/Map/usePostsEngine.js index 14ab6bc..7a6cc27 100644 --- a/src/components/Map/usePostsEngine.js +++ b/src/components/Map/usePostsEngine.js @@ -376,6 +376,8 @@ export function usePostsEngine({ }) { const allPostsRef = useRef([]); const lastFetchRef = useRef({ center: null, radiusKm: null, filterKey: "", timeFilter: "", bounds: null }); + const pendingFilterRef = useRef(""); + const requestSeqRef = useRef(0); const delayedFetchRef = useRef(null); const moveDebounceRef = useRef(null); const analyticsDebounceRef = useRef(0); @@ -431,6 +433,7 @@ export function usePostsEngine({ useEffect(() => { const map = mapRef.current; replacePoolRef.current = true; + pendingFilterRef.current = `${mainFilter}|${subFilter}|${timeFilter}`; if (map) { map.__swForceFetchAt = Date.now(); setTimeout(() => { @@ -929,6 +932,7 @@ export function usePostsEngine({ // On filter/search changes: recompute + sync (NO clear-all rebuild) useEffect(() => { + if (pendingFilterRef.current) return; refreshVisibleAndMarkers(timeFilter); }, [timeFilter, mainFilter, subFilter, searchQuery, clusterFocus, refreshVisibleAndMarkers]); @@ -981,6 +985,8 @@ export function usePostsEngine({ const [lng, lat] = resolvedView.center; const radiusKm = resolvedView.radiusKm || 750; const filterKey = `${mainFilter}|${subFilter}`; + const currentKey = `${filterKey}|${timeFilter}`; + const reqId = ++requestSeqRef.current; let bounds = null; try { const b = mapObj.getBounds(); @@ -1060,7 +1066,7 @@ export function usePostsEngine({ sub_category: subCatParam || undefined, }); - if (cancelled) return; + if (cancelled || reqId !== requestSeqRef.current) return; const existing = replacePoolRef.current ? [] : allPostsRef.current || []; const byId = new Map(); @@ -1087,6 +1093,9 @@ export function usePostsEngine({ allPostsRef.current = prunePosts(Array.from(byId.values()), [lng, lat], MAX_POOL_POSTS, bounds); replacePoolRef.current = false; lastFetchRef.current = { center: [...resolvedView.center], radiusKm, filterKey, timeFilter, bounds }; + if (pendingFilterRef.current === currentKey) { + pendingFilterRef.current = ""; + } // Smooth update: sync markers/clusters + wall without clearing everything refreshVisibleAndMarkers(timeFilter);