| src/robotaxi/pages/begin-route/hooks/use-map-markers.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/robotaxi/pages/begin-route/hooks/use-order-cancel.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/robotaxi/pages/begin-route/hooks/use-page-actions.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/robotaxi/pages/begin-route/hooks/use-vehicle-speed-scale.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/robotaxi/pages/begin-route/hooks/use-map-markers.ts
@@ -4,6 +4,17 @@ const CHANGE_SITE_UP_ICON_URL = 'https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/change-site-up.png'; // 行程中修改目的地时的上车点图标 /** * 归一化车辆朝向,避免透传负数或超过 360 的角度。 */ const normalizeMarkerRotate = (rotate: unknown) => { const numericRotate = Number(rotate); if (!Number.isFinite(numericRotate)) { return null; } return ((numericRotate % 360) + 360) % 360; }; /** * 生成 marker 签名,供平移态判断结构是否实际变化。 */ const buildMarkersSignature = (markers: any[], vehicleMarkerId: number, shouldUsePureTranslateCarMarker: boolean) => markers @@ -201,12 +212,15 @@ } markersSignatureRef.current = nextMarkersSignature; const mergedMarkers = [...nextMarkers]; const latestVehicleLatitude = Number(deps.vehicleLocation?.latitude); const latestVehicleLongitude = Number(deps.vehicleLocation?.longitude); const latestVehicleRotate = normalizeMarkerRotate(deps.vehicleDirection); mergedMarkers[nextCarIndex] = { ...mergedMarkers[nextCarIndex], latitude: prevCar.latitude, longitude: prevCar.longitude, rotate: typeof mergedMarkers[nextCarIndex]?.rotate === 'number' ? mergedMarkers[nextCarIndex].rotate latitude: Number.isFinite(latestVehicleLatitude) ? latestVehicleLatitude : prevCar.latitude, longitude: Number.isFinite(latestVehicleLongitude) ? latestVehicleLongitude : prevCar.longitude, rotate: typeof latestVehicleRotate === 'number' ? latestVehicleRotate : prevCar.rotate }; return mergedMarkers; src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts
@@ -80,6 +80,12 @@ const orderDetailEnterSignatureRef = useRef(''); const orderDetailRouteUpdatedAfterEnterRef = useRef(false); const dynamicScaleHoldUntilRef = useRef(0); // 速度缩放暂停截止时间 const vehicleLocationRef = useRef(deps.vehicleLocation); // 车辆位置 ref,供延时回调读取最新值 const latitudeRef = useRef(deps.latitude); // 当前中心纬度 ref const longitudeRef = useRef(deps.longitude); // 当前中心经度 ref useEffect(() => { vehicleLocationRef.current = deps.vehicleLocation; }, [deps.vehicleLocation]); useEffect(() => { latitudeRef.current = deps.latitude; }, [deps.latitude]); useEffect(() => { longitudeRef.current = deps.longitude; }, [deps.longitude]); const isAndroid = useMemo(() => { try { @@ -428,13 +434,13 @@ * 行程动态缩放生效时,将地图中心跟随到车辆位置,确保车辆留在当前视野内。 */ const syncActiveTripViewportToVehicle = useCallback(() => { const vehicleLatitude = Number(deps.vehicleLocation?.latitude); const vehicleLongitude = Number(deps.vehicleLocation?.longitude); const vehicleLatitude = Number(vehicleLocationRef.current?.latitude); const vehicleLongitude = Number(vehicleLocationRef.current?.longitude); if (!Number.isFinite(vehicleLatitude) || !Number.isFinite(vehicleLongitude)) { return; } const currentLatitude = Number(deps.latitude); const currentLongitude = Number(deps.longitude); const currentLatitude = Number(latitudeRef.current); const currentLongitude = Number(longitudeRef.current); const hasLatitudeDelta = !Number.isFinite(currentLatitude) || Math.abs(currentLatitude - vehicleLatitude) >= ACTIVE_TRIP_VIEWPORT_SYNC_MIN_DELTA; const hasLongitudeDelta = !Number.isFinite(currentLongitude) || Math.abs(currentLongitude - vehicleLongitude) >= ACTIVE_TRIP_VIEWPORT_SYNC_MIN_DELTA; if (!hasLatitudeDelta && !hasLongitudeDelta) { @@ -442,7 +448,7 @@ } deps.setLatitude(vehicleLatitude); deps.setLongitude(vehicleLongitude); }, [deps.latitude, deps.longitude, deps.setLatitude, deps.setLongitude, deps.vehicleLocation?.latitude, deps.vehicleLocation?.longitude]); }, [deps.setLatitude, deps.setLongitude]); useEffect(() => { if ([TripStatus.InService, TripStatus.ArrivedDestination].includes(deps.tripStatus)) { src/robotaxi/pages/begin-route/hooks/use-order-cancel.ts
@@ -116,6 +116,11 @@ * 确认取消。 */ const handleConfirmCancel = async () => { if (deps.cancelType === 4) { restartPlanningRoute(); return; } if (deps.cancelType === 5) { handleOpenCancelPopupWithType(5); return; src/robotaxi/pages/begin-route/hooks/use-page-actions.ts
@@ -10,6 +10,10 @@ MODIFY_DESTINATION_SESSION_KEY } from '../constants/modify-destination'; import { clearPassedRouteCache } from './passed-route-cache'; import { HOME_START_SITE_SOURCE_MANUAL_SELECTED, writeHomeStartSiteDisplayState } from '../../../../pages/robotaxi/home/hooks/use-home-start-site-display'; type Deps = { tripStatus: TripStatus; @@ -23,6 +27,23 @@ * 页面动作编排:统一处理服务入口、页面跳转、地图气泡点击行为。 */ export default function usePageActions(deps: Deps) { /** * 线路预估页返回首页前,显式保留一次当前上车点,避免首页恢复流程把它当作普通未吸附态清掉。 */ const retainStartSiteForNextHome = () => { const latitude = Number(deps.startSite?.latitude); const longitude = Number(deps.startSite?.longitude); if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) { return; } writeHomeStartSiteDisplayState( deps.startSite, HOME_START_SITE_SOURCE_MANUAL_SELECTED, undefined, true ); }; /** * 清理修改目的地流程相关缓存,避免返回后残留会话影响后续流程。 */ @@ -78,6 +99,9 @@ clearModifyDestinationStorage(); clearPassedRouteCache(); if (deps.tripStatus === TripStatus.PaymentSuccess || deps.tripStatus === TripStatus.PublishRoute) { if (deps.tripStatus === TripStatus.PublishRoute) { retainStartSiteForNextHome(); } clearOrderTripStorage(); Taro.removeStorageSync('endSite'); } src/robotaxi/pages/begin-route/hooks/use-vehicle-speed-scale.ts
@@ -145,7 +145,9 @@ return; } deps.setMapScale(clamp(nextBand.scale, SCALE_MIN, SCALE_MAX)); deps.syncActiveTripViewportToVehicle(); setTimeout(() => { deps.syncActiveTripViewportToVehicle(); }, 150); }, Math.max(0, Math.ceil(delayMs))); };