| | |
| | | import Taro from '@tarojs/taro'; |
| | | import { useState, useRef, useCallback, useMemo, useEffect } from 'react'; |
| | | import { computeAdaptiveBottomPadding } from '../../../../utils/Robotaxi-public-method'; |
| | | import { computeAdaptiveBottomPadding, debounce } from '../../../../utils/Robotaxi-public-method'; |
| | | import { TripStatus } from '../../../constants/trip-status'; |
| | | import { buildActiveTripSafeAreaMetrics } from './active-trip-camera-policy'; |
| | | |
| | |
| | | const ACTIVE_TRIP_VIEWPORT_SYNC_INTERVAL_MS = 600; // 行程安全区跟随的最小同步间隔,避免地图频繁漂移 |
| | | const ACTIVE_TRIP_VIEWPORT_SYNC_ANIMATION_MS = 300; // 跟车中心移动缓动时长,等待原生地图动画后再回写受控中心点 |
| | | const ORDER_DETAIL_SCALE_SYNC_DELAY_MS = 600; // 完成态 includePoints 后等待原生地图落稳,再同步实际 scale |
| | | const VIEWPORT_FIT_DEBOUNCE_MS = 300; // 视口 fit 统一防抖:状态切换瞬间路线点/视口类型会先残留旧值再被正确值覆盖, |
| | | // 防抖把窗口内的多次 includePoints/moveToLocation 合并为最后一次,避免连续命令式调用动画相互打断导致缩放卡死 |
| | | export const ACTIVE_TRIP_VIEWPORT_SAFE_X_MARGIN_RATIO = 0.2; // 横向两侧保留的边距比例,调大可让车辆更早触发横向回中,避免跑到贴边只剩一小段线路 |
| | | |
| | | type ViewportPoint = { |
| | |
| | | }, ORDER_DETAIL_SCALE_SYNC_DELAY_MS); |
| | | }, [deps.setLatitude, deps.setLongitude, deps.tripStatus, getMapCenterLocation, getMapScale]); |
| | | |
| | | const updateViewportByPayload = (viewportType: string, points: any[]) => { |
| | | const updateViewportByPayloadRaw = (viewportType: string, points: any[]) => { |
| | | const mapCtx = Taro.createMapContext('map'); |
| | | const bottomPadding = computeBottomPadding(points, viewportType, deps.tripStatus); |
| | | const baseTopPadding = viewportType === 'order_detail' ? 60 : 24; |
| | |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // 防抖包裹:状态切换瞬间多次连续调用只执行最后一次,避免 includePoints 动画相互打断 |
| | | const updateViewportByPayload = debounce(updateViewportByPayloadRaw, VIEWPORT_FIT_DEBOUNCE_MS); |
| | | |
| | | const toOrigin = () => { |
| | | const mapCtx = Taro.createMapContext('map'); |
| | |
| | | if (deps.tripStatus === TripStatus.InService && viewportType === 'route') { |
| | | tripStatus6ViewportLockedRef.current = true; |
| | | } |
| | | // updateViewportByPayload 已用 debounce 包裹:状态切换瞬间多次调用只执行最后一次 |
| | | updateViewportByPayload(viewportType, points); |
| | | if ([TripStatus.TripFinished, TripStatus.PaymentSuccess].includes(deps.tripStatus) && viewportType === 'order_detail') { |
| | | const hasOrderDetailRouteAfterEnter = orderDetailRouteUpdatedAfterEnterRef.current && deps.routePoints.length > 0; |