diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..0d51722 --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2026-06-29 - Stale closures in external test hooks with useMemo Maps +**Learning:** When replacing array lookups with memoized Maps (`useMemo`) in React components, using the memoized Map within imperative external bindings (e.g., `window.__MAP_APP_TEST`) initialized outside the React render cycle can introduce stale closures. +**Action:** Retain original array lookups (e.g., `array.find()`) for specific external bindings and global test hooks, while upgrading render-cycle array lookups to Map dictionary lookups. \ No newline at end of file diff --git a/components/territory/territory-workspace.tsx b/components/territory/territory-workspace.tsx index 6d2ff49..e18d7be 100644 --- a/components/territory/territory-workspace.tsx +++ b/components/territory/territory-workspace.tsx @@ -570,13 +570,25 @@ export function TerritoryWorkspace({ orgSlug, initialDashboard, territoryConfig const mobileViewAutoSwitchedRef = useRef(initialPreferListView); const pins = data.pins; - const selectedPin = useMemo(() => pins.find((pin) => pin.id === selectedId) ?? null, [pins, selectedId]); + // ⚡ Bolt Optimization: Construct O(1) Map dictionary to prevent O(N*M) nested array lookups during React renders + const pinsById = useMemo(() => { + const map = new Map(); + for (const pin of pins) { + map.set(pin.id, pin); + } + return map; + }, [pins]); + const selectedPin = useMemo(() => { + if (!selectedId) return null; + return pinsById.get(selectedId) ?? null; + }, [pinsById, selectedId]); const routeStops = useMemo( () => routePlanningEnabled - ? routeStopIds.map((id) => pins.find((pin) => pin.id === id)).filter((pin): pin is TerritoryAccountPin => Boolean(pin)) + // ⚡ Bolt Optimization: Use Map lookup instead of Array.find inside .map + ? routeStopIds.map((id) => pinsById.get(id)).filter((pin): pin is TerritoryAccountPin => Boolean(pin)) : [], - [pins, routePlanningEnabled, routeStopIds], + [pinsById, routePlanningEnabled, routeStopIds], ); const mappablePinCount = useMemo(() => pins.filter(hasUsableCoordinates).length, [pins]); const activeFilterCount = Object.values(filters).filter(Boolean).length;