feat: 重建时暂停 translateMarker
Co-Authored-By: ai-coding <ai-coding@devgenie.local>
| | |
| | | arrivedMarkerReady: boolean; |
| | | arrivedTooltipReady: boolean; |
| | | onVehicleMarkerReady: () => void; |
| | | onCarMarkerWillRebuild: () => void; |
| | | }; |
| | | |
| | | const defaultDeps: Deps = { |
| | |
| | | vehicleMarkerId: 3, |
| | | arrivedMarkerReady: false, |
| | | arrivedTooltipReady: false, |
| | | onVehicleMarkerReady: () => { } |
| | | onVehicleMarkerReady: () => { }, |
| | | onCarMarkerWillRebuild: () => { } |
| | | }; |
| | | |
| | | export default function useMapMarkers(rawDeps?: Partial<Deps>) { |
| | |
| | | setDisplayMarkers(markers); |
| | | return; |
| | | } |
| | | // 通知外部:CarMarker 即将重建,请暂停 translateMarker |
| | | deps.onCarMarkerWillRebuild(); |
| | | // 第一步:展示层先去掉车标,原生层销毁旧 car marker |
| | | setDisplayMarkers(markers.filter((m: any) => m.id !== deps.vehicleMarkerId)); |
| | | // 第二步:下一帧恢复完整列表,原生层重建 car marker(清除 translateMarker 遗留的旋转矩阵) |
| | |
| | | }, [markers]); |
| | | |
| | | useEffect(() => { |
| | | const hasVehicleMarker = deps.statusRule.showCar && markers.some((item: any) => item.id === deps.vehicleMarkerId); |
| | | // 这里使用 displayMarkers 而非 markers(逻辑态),以保证 rebuild 完成(车标已真实渲染到原生地图)后才通知 ready |
| | | const hasVehicleMarker = deps.statusRule.showCar && displayMarkers.some((item: any) => item.id === deps.vehicleMarkerId); |
| | | if (!hasVehicleMarker) { |
| | | return; |
| | | } |
| | | Taro.nextTick(() => { |
| | | deps.onVehicleMarkerReady(); |
| | | }); |
| | | }, [markers, deps.statusRule.showCar, deps.vehicleMarkerId, deps.onVehicleMarkerReady]); |
| | | }, [displayMarkers, deps.statusRule.showCar, deps.vehicleMarkerId, deps.onVehicleMarkerReady]); |
| | | |
| | | useEffect(() => { |
| | | const pickupSite = deps.startSite?.latitude && deps.startSite?.longitude ? deps.startSite : Taro.getStorageSync('startSite'); |
| | |
| | | clearVehicleMarkerReadyTimer(); |
| | | }, []); |
| | | |
| | | /** |
| | | * 暂停 translateMarker:清除 ready 状态、pending/lastApplied 任务,递增 session 让在飞回调失效。 |
| | | * 用于 CarMarker 重建期间阻止 translateMarker 作用于即将被销毁的旧 marker。 |
| | | * 后续调用 notifyVehicleMarkerReady 会重新走 ready 延时并 flush 平移任务。 |
| | | */ |
| | | const suspendVehicleMarker = useCallback(() => { |
| | | isTranslatingRef.current = false; |
| | | pendingTranslateRef.current = null; |
| | | lastAppliedTranslateTaskRef.current = null; |
| | | vehicleMarkerReadyRef.current = false; |
| | | clearVehicleMarkerReadyTimer(); |
| | | translateSessionIdRef.current += 1; |
| | | }, []); |
| | | |
| | | return { |
| | | vehicleLocation, |
| | | setVehicleLocation, |
| | |
| | | lastVehiclePointRef, |
| | | lastVehicleUpdateAtRef, |
| | | updateVehicleLocationThrottled, |
| | | notifyVehicleMarkerReady |
| | | notifyVehicleMarkerReady, |
| | | suspendVehicleMarker |
| | | }; |
| | | } |
| | |
| | | beforeUserEndSite: isPickupRouteChangeMapMode ? null : beforeUserEndSite, |
| | | arrivedMarkerReady, |
| | | arrivedTooltipReady, |
| | | onVehicleMarkerReady: vehicleState.notifyVehicleMarkerReady |
| | | onVehicleMarkerReady: vehicleState.notifyVehicleMarkerReady, |
| | | onCarMarkerWillRebuild: vehicleState.suspendVehicleMarker |
| | | }); // 地图标记状态容器 |
| | | const { |
| | | markers, |
| | |
| | | vehicleMarkerId: number; |
| | | arrivedMarkerReady: boolean; |
| | | onVehicleMarkerReady: () => void; |
| | | onCarMarkerWillRebuild: () => void; |
| | | }; |
| | | |
| | | const defaultDeps: Deps = { |
| | |
| | | vehicleDirection: null, |
| | | vehicleMarkerId: 3, |
| | | arrivedMarkerReady: false, |
| | | onVehicleMarkerReady: () => { } |
| | | onVehicleMarkerReady: () => { }, |
| | | onCarMarkerWillRebuild: () => { } |
| | | }; |
| | | |
| | | export default function useMapMarkers(rawDeps?: Partial<Deps>) { |
| | |
| | | setDisplayMarkers(markers); |
| | | return; |
| | | } |
| | | // 通知外部:CarMarker 即将重建,请暂停 translateMarker |
| | | deps.onCarMarkerWillRebuild(); |
| | | // 第一步:展示层先去掉车标,原生层销毁旧 car marker |
| | | setDisplayMarkers(markers.filter((m: any) => m.id !== deps.vehicleMarkerId)); |
| | | // 第二步:下一帧恢复完整列表,原生层重建 car marker(清除 translateMarker 遗留的旋转矩阵) |
| | |
| | | }, [markers]); |
| | | |
| | | useEffect(() => { |
| | | const hasVehicleMarker = deps.statusRule.showCar && markers.some((item: any) => item.id === deps.vehicleMarkerId); |
| | | // 这里使用 displayMarkers 而非 markers(逻辑态),以保证 rebuild 完成(车标已真实渲染到原生地图)后才通知 ready |
| | | const hasVehicleMarker = deps.statusRule.showCar && displayMarkers.some((item: any) => item.id === deps.vehicleMarkerId); |
| | | if (!hasVehicleMarker) { |
| | | return; |
| | | } |
| | | Taro.nextTick(() => { |
| | | deps.onVehicleMarkerReady(); |
| | | }); |
| | | }, [markers, deps.statusRule.showCar, deps.vehicleMarkerId, deps.onVehicleMarkerReady]); |
| | | }, [displayMarkers, deps.statusRule.showCar, deps.vehicleMarkerId, deps.onVehicleMarkerReady]); |
| | | |
| | | useEffect(() => { |
| | | const pickupSite = |
| | |
| | | clearVehicleMarkerReadyTimer(); |
| | | }, []); |
| | | |
| | | /** |
| | | * 暂停 translateMarker:清除 ready 状态、pending/lastApplied 任务,递增 session 让在飞回调失效。 |
| | | * 用于 CarMarker 重建期间阻止 translateMarker 作用于即将被销毁的旧 marker。 |
| | | * 后续调用 notifyVehicleMarkerReady 会重新走 ready 延时并 flush 平移任务。 |
| | | */ |
| | | const suspendVehicleMarker = useCallback(() => { |
| | | isTranslatingRef.current = false; |
| | | pendingTranslateRef.current = null; |
| | | lastAppliedTranslateTaskRef.current = null; |
| | | vehicleMarkerReadyRef.current = false; |
| | | clearVehicleMarkerReadyTimer(); |
| | | translateSessionIdRef.current += 1; |
| | | }, []); |
| | | |
| | | return { |
| | | vehicleLocation, |
| | | setVehicleLocation, |
| | |
| | | lastVehiclePointRef, |
| | | lastVehicleUpdateAtRef, |
| | | updateVehicleLocationThrottled, |
| | | notifyVehicleMarkerReady |
| | | notifyVehicleMarkerReady, |
| | | suspendVehicleMarker |
| | | }; |
| | | } |
| | |
| | | setVehicleMoveAlongPoints, |
| | | setVehicleDirection, |
| | | updateVehicleLocationThrottled, |
| | | notifyVehicleMarkerReady |
| | | notifyVehicleMarkerReady, |
| | | suspendVehicleMarker |
| | | } = useVehicleTracking({ |
| | | statusRule, |
| | | vehicleMarkerId, |
| | |
| | | vehicleMarkerId, |
| | | arrivedMarkerReady, |
| | | onVehicleMarkerReady: notifyVehicleMarkerReady, |
| | | onCarMarkerWillRebuild: suspendVehicleMarker, |
| | | }); // 地图 marker 状态容器 |
| | | |
| | | const { |