| | |
| | | mapScale: number; |
| | | /** 修改目的地预览态下隐藏车辆气泡。 */ |
| | | isModifyDestinationReviewVisible: boolean; |
| | | routeSummaryLocation: { latitude: number; longitude: number } | null; |
| | | startSite: any; |
| | | endSite: any; |
| | | vehicleLocation: { latitude: number; longitude: number } | null; |
| | |
| | | // 到达气泡样式与显示状态 |
| | | const [arriveCalloutStyle, setArriveCalloutStyle] = useState<any>({}); |
| | | const [arriveCalloutVisible, setArriveCalloutVisible] = useState(false); |
| | | // 路线摘要气泡样式与显示状态 |
| | | const [routeSummaryCalloutStyle, setRouteSummaryCalloutStyle] = useState<any>({}); |
| | | const [routeSummaryCalloutVisible, setRouteSummaryCalloutVisible] = useState(false); |
| | | const mapRectRef = useRef<any>(null); |
| | | |
| | | // 读取地图投影上下文,供路线点批量转换屏幕坐标使用。 |
| | |
| | | setArriveCalloutVisible(true); |
| | | }; |
| | | |
| | | // 更新路线摘要气泡位置 |
| | | const updateRouteSummaryCalloutPosition = async () => { |
| | | if (!deps.isAndroid || !deps.routeSummaryLocation) { |
| | | setRouteSummaryCalloutVisible(false); |
| | | return; |
| | | } |
| | | const rect = await ensureMapRect(); |
| | | const pos = await computeScreenPosition(deps.routeSummaryLocation, rect, 0); |
| | | if (!pos) { |
| | | setRouteSummaryCalloutVisible(false); |
| | | return; |
| | | } |
| | | setRouteSummaryCalloutStyle(buildTransformOverlayStyle({ |
| | | x: pos.x, |
| | | y: pos.y |
| | | }, '')); |
| | | setRouteSummaryCalloutVisible(true); |
| | | }; |
| | | |
| | | // 地图区域变化时同步覆盖物显隐与重算 |
| | | // 注意:这里把「begin 隐藏」与「end 重算」解耦,避免历史上的两类问题: |
| | | // 1) 若 begin 对所有区域变化都隐藏,则 fitRouteIntoView/includePoints 等程序化视口调整会 |
| | |
| | | setWaitingRadarVisible(false); |
| | | setCarCalloutVisible(false); |
| | | setArriveCalloutVisible(false); |
| | | setRouteSummaryCalloutVisible(false); |
| | | } |
| | | return; |
| | | } |
| | |
| | | updateWaitingRadarPosition(); |
| | | updateCarCalloutPosition(); |
| | | updateArriveCalloutPosition(); |
| | | updateRouteSummaryCalloutPosition(); |
| | | } |
| | | }; |
| | | |
| | |
| | | }, [deps.isAndroid, deps.tripStatus, deps.endSite?.latitude, deps.endSite?.longitude]); |
| | | |
| | | useEffect(() => { |
| | | updateRouteSummaryCalloutPosition(); |
| | | }, [deps.isAndroid, deps.routeSummaryLocation?.latitude, deps.routeSummaryLocation?.longitude, deps.mapScale, deps.tripStatus]); |
| | | |
| | | useEffect(() => { |
| | | if (!deps.isAndroid || deps.tripStatus !== TripStatus.ArrivedDestination) return; |
| | | if (deps.mapScale < 20) return; |
| | | const timer = setTimeout(() => { |
| | |
| | | carCalloutVisible, |
| | | arriveCalloutStyle, |
| | | arriveCalloutVisible, |
| | | routeSummaryCalloutStyle, |
| | | routeSummaryCalloutVisible, |
| | | updateWaitingRadarPosition, |
| | | updateCarCalloutPosition, |
| | | updateArriveCalloutPosition, |
| | | updateRouteSummaryCalloutPosition, |
| | | handleRegionChange |
| | | }; |
| | | } |