From 68cb21fc23b2b13a0645233755e69cc9fde3c2d1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 26 Dec 2025 01:34:25 -0500 Subject: [PATCH] Relax map bounds filter and add radius fallback --- src/components/Map/usePostsEngine.js | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/components/Map/usePostsEngine.js b/src/components/Map/usePostsEngine.js index e8de524..fd4208e 100644 --- a/src/components/Map/usePostsEngine.js +++ b/src/components/Map/usePostsEngine.js @@ -90,8 +90,8 @@ function filterByBounds(posts, map) { const ne = bounds.getNorthEast(); if (!sw || !ne) return posts; - const padLat = Math.abs(ne.lat - sw.lat) * 0.12; - const padLon = Math.abs(ne.lng - sw.lng) * 0.12; + const padLat = Math.abs(ne.lat - sw.lat) * 0.35; + const padLon = Math.abs(ne.lng - sw.lng) * 0.35; const minLat = sw.lat - padLat; const maxLat = ne.lat + padLat; const minLon = sw.lng - padLon; @@ -105,6 +105,20 @@ function filterByBounds(posts, map) { }); } +function filterByRadius(posts, center, radiusKm) { + if (!Array.isArray(posts) || posts.length === 0) return posts || []; + const [centerLon, centerLat] = center || []; + if (!Number.isFinite(centerLat) || !Number.isFinite(centerLon)) return posts || []; + const limit = Math.max(radiusKm || 0, 1); + return posts.filter((p) => { + const coords = getCoords(p); + if (!coords) return false; + const [lon, lat] = coords; + const dKm = haversineKm(centerLat, centerLon, lat, lon); + return dKm <= limit; + }); +} + function getPostTimeMs(p) { const raw = p?.created_at || p?.CreatedAt || p?.createdAt || p?.published_at; if (!raw) return 0; @@ -519,7 +533,10 @@ export function usePostsEngine({ (tf) => { const vAll = computeVisible(tf); const map = mapRef.current; - const vBounded = filterByBounds(vAll, map); + let vBounded = filterByBounds(vAll, map); + if (vBounded.length === 0 && viewParams?.center && viewParams?.radiusKm) { + vBounded = filterByRadius(vAll, viewParams.center, viewParams.radiusKm * 1.2); + } let v = vBounded; if (v.length > MAX_VISIBLE_POSTS) { const center = map?.getCenter?.(); @@ -552,7 +569,7 @@ export function usePostsEngine({ syncMarkers(v); }, - [computeVisible, syncMarkers, mapRef, ensureClusterLayers, updateClusterData, setClusterVisibility, splitForClusters, syncPriorityMarkers] + [computeVisible, syncMarkers, mapRef, ensureClusterLayers, updateClusterData, setClusterVisibility, splitForClusters, syncPriorityMarkers, viewParams] ); // On filter/search changes: recompute + sync (NO clear-all rebuild)