fix: stale closure in updateRouteForDay causes route to disappear on place click
useCallback captured tripStore at creation time (dep: [routeCalcEnabled]). If assignments were empty on first render (trip still loading), the callback would permanently see empty assignments and call setRoute(null) whenever invoked — e.g. when clicking a place triggers onSelectDay → updateRouteForDay. Fix: store tripStore in a ref updated on every render so the callback always reads the latest assignments without needing to be recreated.
This commit is contained in:
@@ -15,11 +15,14 @@ export function useRouteCalculation(tripStore: TripStoreState, selectedDayId: nu
|
|||||||
const [routeSegments, setRouteSegments] = useState<RouteSegment[]>([])
|
const [routeSegments, setRouteSegments] = useState<RouteSegment[]>([])
|
||||||
const routeCalcEnabled = useSettingsStore((s) => s.settings.route_calculation) !== false
|
const routeCalcEnabled = useSettingsStore((s) => s.settings.route_calculation) !== false
|
||||||
const routeAbortRef = useRef<AbortController | null>(null)
|
const routeAbortRef = useRef<AbortController | null>(null)
|
||||||
|
// Keep a ref to the latest tripStore so updateRouteForDay never has a stale closure
|
||||||
|
const tripStoreRef = useRef(tripStore)
|
||||||
|
tripStoreRef.current = tripStore
|
||||||
|
|
||||||
const updateRouteForDay = useCallback(async (dayId: number | null) => {
|
const updateRouteForDay = useCallback(async (dayId: number | null) => {
|
||||||
if (routeAbortRef.current) routeAbortRef.current.abort()
|
if (routeAbortRef.current) routeAbortRef.current.abort()
|
||||||
if (!dayId) { setRoute(null); setRouteSegments([]); return }
|
if (!dayId) { setRoute(null); setRouteSegments([]); return }
|
||||||
const currentAssignments = tripStore.assignments || {}
|
const currentAssignments = tripStoreRef.current.assignments || {}
|
||||||
const da = (currentAssignments[String(dayId)] || []).slice().sort((a, b) => a.order_index - b.order_index)
|
const da = (currentAssignments[String(dayId)] || []).slice().sort((a, b) => a.order_index - b.order_index)
|
||||||
const waypoints = da.map((a) => a.place).filter((p) => p?.lat && p?.lng)
|
const waypoints = da.map((a) => a.place).filter((p) => p?.lat && p?.lng)
|
||||||
if (waypoints.length < 2) { setRoute(null); setRouteSegments([]); return }
|
if (waypoints.length < 2) { setRoute(null); setRouteSegments([]); return }
|
||||||
|
|||||||
Reference in New Issue
Block a user