| | |
| | | tripStatus: TripStatus; |
| | | orderId?: string; |
| | | orderTrunkStatus?: boolean; |
| | | hasDoorOpenedInCurrentOrder?: boolean; |
| | | handleOpenOverRoutePopup?: () => void; |
| | | onDoorUnlockSuccess?: () => void; |
| | | }; |
| | |
| | | tripStatus, |
| | | orderId, |
| | | orderTrunkStatus, |
| | | hasDoorOpenedInCurrentOrder = false, |
| | | handleOpenOverRoutePopup, |
| | | onDoorUnlockSuccess |
| | | }: Props) { |
| | | const [trunkStatus, setTrunkStatus] = useState(orderTrunkStatus); // 后备箱开关状态 |
| | | const [lockStatus, setLockStatus] = useState(false); // 车门开关状态 |
| | | const trunkPollTimerRef = useRef<any>(null); // 后备箱状态轮询定时器 |
| | | const overRoutePopupDebounceTimerRef = useRef<any>(null); // 结束行程弹窗防抖定时器 |
| | | const OVER_ROUTE_POPUP_DEBOUNCE_MS = 1000; // 结束行程弹窗点击防抖时长 |
| | | const lockStatus = hasDoorOpenedInCurrentOrder; // 当前订单是否已完成开门,直接作为车锁展示态 |
| | | |
| | | // 外部后备箱状态变化时同步本地状态 |
| | | useEffect(() => { |
| | |
| | | if (doorType === 'door') { |
| | | // Taro.hideLoading(); |
| | | Taro.showToast({ title: '右侧车门已解锁', icon: 'none' }); |
| | | setLockStatus(true); |
| | | onDoorUnlockSuccess?.(); |
| | | onSuccess?.(); |
| | | } |
| | |
| | | handleModifyDestination?: () => void; |
| | | handleShareTrip?: () => void; |
| | | showModifyDestination?: boolean; |
| | | showCancelTrip?: boolean; |
| | | }; |
| | | |
| | | export default function TripActionBar({ |
| | |
| | | handleCancelTrip, |
| | | handleModifyDestination, |
| | | handleShareTrip, |
| | | showModifyDestination = true, |
| | | showCancelTrip = tripStatus === TripStatus.VehicleApproaching |
| | | showModifyDestination = true |
| | | }: Props) { |
| | | // 按行程状态控制按钮集合,避免在 JSX 中堆叠过多条件判断 |
| | | const actionList = [ |
| | |
| | | key: "cancel", |
| | | label: "取消行程", |
| | | icon: 'https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/cancel-trip.png', |
| | | visible: showCancelTrip, |
| | | visible: tripStatus === TripStatus.VehicleApproaching, |
| | | onClick: handleCancelTrip |
| | | }, |
| | | { |
| | |
| | | durationDisplay: { value: string | number; unit: string }; |
| | | isArriveSoon: boolean; |
| | | isPickupCountdownSoon: boolean; |
| | | hasDoorOpenedInCurrentOrder: boolean; |
| | | pickupCountdownSeconds: number | null; |
| | | finishCountdownEnabled: boolean; |
| | | finishCountdownSeconds: number | null; |
| | |
| | | durationDisplay, |
| | | isArriveSoon, |
| | | isPickupCountdownSoon, |
| | | hasDoorOpenedInCurrentOrder, |
| | | pickupCountdownSeconds, |
| | | finishCountdownEnabled, |
| | | finishCountdownSeconds, |
| | |
| | | [TripStatus.VehicleApproaching]: isArriveSoon |
| | | ? <>车辆即将到达,请准备上车</> |
| | | : <>车辆还有<View className="time">{durationDisplay.value}</View>{durationDisplay.unit}到达</>, |
| | | [TripStatus.VehicleArrivedPickup]: hasDoorOpenedInCurrentOrder |
| | | ? <>车辆已到达,请尽快上车</> |
| | | : <>{isPickupCountdownSoon ? '车辆已到达,请尽快上车' : '车辆已到达上车点'}<View className="time" style={isPickupCountdownSoon ? { color: '#f58900' } : undefined}>{pickupCountdownSeconds !== null ? formatCountdown(pickupCountdownSeconds) : '--:--'}</View></>, |
| | | [TripStatus.VehicleArrivedPickup]: <>{isPickupCountdownSoon ? '车辆已到达,请尽快上车' : '车辆已到达上车点'}<View className="time" style={isPickupCountdownSoon ? { color: '#f58900' } : undefined}>{pickupCountdownSeconds !== null ? formatCountdown(pickupCountdownSeconds) : '--:--'}</View></>, |
| | | [TripStatus.InService]: <>预计<View className="time">{inServiceDurationDisplay.value}</View>{inServiceDurationDisplay.unit}抵达目的地</>, |
| | | [TripStatus.ArrivedDestination]: (finishCountdownEnabled || finishCountdownSeconds !== null) |
| | | ? <>已到达目的地<View className="time">{finishCountdownSeconds !== null ? formatCountdown(finishCountdownSeconds) : '--:--'}</View></> |
| | |
| | | const descMap = { |
| | | [TripStatus.CallingCar]: { text: '正全力为您叫车中,请耐心等待...', className: 'calling-car-content-desc' }, |
| | | [TripStatus.VehicleApproaching]: limitMinutes ? { text: `此处限停${limitMinutes}分钟,请尽快前往上车点`, className: 'calling-car-content-warning' } : null, |
| | | [TripStatus.VehicleArrivedPickup]: hasDoorOpenedInCurrentOrder |
| | | ? { text: '车门已解锁,已停止等待倒计时', className: 'calling-car-content-desc' } |
| | | : { text: isPickupCountdownSoon ? `车辆到达后最多等待${limitMinutes}分钟,超时自动取消` : '此处限停,请在倒计时结束前到达上车点', className: 'calling-car-content-desc' }, |
| | | [TripStatus.VehicleArrivedPickup]: { text: isPickupCountdownSoon ? `车辆到达后最多等待${limitMinutes}分钟,超时自动取消` : '此处限停,请在倒计时结束前到达上车点', className: 'calling-car-content-desc' }, |
| | | [TripStatus.InService]: { text: '行程已开始,请全程系好安全带', className: 'calling-car-content-desc' }, |
| | | [TripStatus.ArrivedDestination]: { text: '倒计时结束时车辆将自动驶离,请带好物品安全下车', className: 'calling-car-content-desc' }, |
| | | [TripStatus.TripFinished]: { text: '订单待支付,请核对后完成支付', className: 'calling-car-content-desc' } |
| | |
| | | orderId?: string; |
| | | estimatedWaitMinutes?: number; |
| | | finishCountdownEnabled: boolean; |
| | | hasDoorOpenedInCurrentOrder: boolean; |
| | | handleCancelTimeout?: () => void; |
| | | handleFinishTimeout?: () => void; |
| | | priceUpdateVersion?: number; |
| | |
| | | orderId, |
| | | estimatedWaitMinutes, |
| | | finishCountdownEnabled, |
| | | hasDoorOpenedInCurrentOrder, |
| | | handleCancelTimeout, |
| | | handleFinishTimeout, |
| | | priceUpdateVersion |
| | |
| | | const finishTimerRef = useRef<any>(null); |
| | | const countdownFinishedRef = useRef(false); |
| | | const pickupTripStatusRef = useRef(tripStatus); |
| | | const pickupDoorOpenedRef = useRef(hasDoorOpenedInCurrentOrder); |
| | | const pickupEndTimeRef = useRef<number | null>(null); |
| | | const finishEndTimeRef = useRef<number | null>(null); |
| | | const lastFareRequestKeyRef = useRef<string | null>(null); // 费用明细请求去重键(订单+优惠券) |
| | |
| | | }, [tripStatus]); |
| | | |
| | | useEffect(() => { |
| | | pickupDoorOpenedRef.current = hasDoorOpenedInCurrentOrder; |
| | | }, [hasDoorOpenedInCurrentOrder]); |
| | | |
| | | const stopPickupCountdown = useCallback((clearPersistedEndTime = false) => { |
| | | clearPickupTimer(); |
| | | countdownFinishedRef.current = false; |
| | | pickupEndTimeRef.current = null; |
| | | setPickupCountdownSeconds(null); |
| | | if (clearPersistedEndTime) { |
| | | Taro.removeStorageSync(PICKUP_END_TIME_KEY); |
| | | } |
| | | }, [clearPickupTimer]); |
| | | |
| | | useEffect(() => { |
| | | if (tripStatus !== TripStatus.VehicleArrivedPickup) { |
| | | clearPickupTimer(); |
| | | return; |
| | | } |
| | | if (hasDoorOpenedInCurrentOrder) { |
| | | stopPickupCountdown(true); |
| | | return; |
| | | } |
| | | |
| | |
| | | // 防止状态已切换后,旧定时回调仍触发取消逻辑 |
| | | if (pickupTripStatusRef.current !== TripStatus.VehicleArrivedPickup) { |
| | | clearPickupTimer(); |
| | | return; |
| | | } |
| | | if (pickupDoorOpenedRef.current) { |
| | | stopPickupCountdown(true); |
| | | return; |
| | | } |
| | | const remaining = getRemainingSeconds(pickupEndTimeRef.current); |
| | |
| | | return () => { |
| | | clearPickupTimer(); |
| | | }; |
| | | }, [tripStatus, orderId, hasDoorOpenedInCurrentOrder, handleCancelTimeout, clearPickupTimer, stopPickupCountdown]); |
| | | }, [tripStatus, orderId, handleCancelTimeout, clearPickupTimer]); |
| | | |
| | | useEffect(() => { |
| | | if (tripStatus !== TripStatus.ArrivedDestination) { |
| | |
| | | handlePay?: () => void; |
| | | /** 打开详细评价弹窗 */ |
| | | handleOpenEvaluatePopup?: () => void; |
| | | /** 当前订单是否已开过门 */ |
| | | hasDoorOpenedInCurrentOrder?: boolean; |
| | | /** 取消行程 */ |
| | | handleCancelTrip?: () => void; |
| | | /** 是否展示取消行程 */ |
| | | showCancelTrip?: boolean; |
| | | /** 修改目的地 */ |
| | | handleModifyDestination?: () => void; |
| | | /** 是否展示修改目的地 */ |
| | |
| | | onToggleDetailFade, |
| | | handlePay, |
| | | handleOpenEvaluatePopup, |
| | | hasDoorOpenedInCurrentOrder = false, |
| | | handleCancelTrip, |
| | | showCancelTrip = tripStatus === TripStatus.VehicleApproaching, |
| | | handleModifyDestination, |
| | | showModifyDestination = true, |
| | | handleShareTrip, |
| | |
| | | orderId, |
| | | estimatedWaitMinutes, |
| | | finishCountdownEnabled, |
| | | hasDoorOpenedInCurrentOrder, |
| | | handleCancelTimeout, |
| | | handleFinishTimeout, |
| | | priceUpdateVersion |
| | |
| | | durationDisplay={durationDisplay} |
| | | isArriveSoon={isArriveSoon} |
| | | isPickupCountdownSoon={isPickupCountdownSoon} |
| | | hasDoorOpenedInCurrentOrder={hasDoorOpenedInCurrentOrder} |
| | | pickupCountdownSeconds={pickupCountdownSeconds} |
| | | finishCountdownEnabled={finishCountdownEnabled} |
| | | finishCountdownSeconds={finishCountdownSeconds} |
| | |
| | | tripStatus={tripStatus} |
| | | orderId={orderId} |
| | | orderTrunkStatus={orderTrunkStatus} |
| | | hasDoorOpenedInCurrentOrder={hasDoorOpenedInCurrentOrder} |
| | | handleOpenOverRoutePopup={handleOpenOverRoutePopup} |
| | | onDoorUnlockSuccess={onDoorUnlockSuccess} |
| | | /> |
| | |
| | | <TripActionBar |
| | | tripStatus={tripStatus} |
| | | handleCancelTrip={handleCancelTrip} |
| | | showCancelTrip={showCancelTrip} |
| | | handleModifyDestination={handleModifyDestination} |
| | | showModifyDestination={showModifyDestination} |
| | | handleShareTrip={handleShareTrip} |
| | |
| | | tripStatus={tripStatus === TripStatus.ArrivedDestination ? TripStatus.ArrivedDestination : -1} |
| | | orderId={orderId} |
| | | orderTrunkStatus={orderTrunkStatus} |
| | | hasDoorOpenedInCurrentOrder={hasDoorOpenedInCurrentOrder} |
| | | handleOpenOverRoutePopup={handleOpenOverRoutePopup} |
| | | onDoorUnlockSuccess={onDoorUnlockSuccess} |
| | | /> |
| | |
| | | type Deps = { |
| | | orderId: string; |
| | | tripStatus: TripStatus; |
| | | onBluetoothDoorUnlockSuccess?: () => void; |
| | | }; |
| | | |
| | | type BluetoothTokenPayload = { |
| | |
| | | /** |
| | | * 蓝牙车控编排:负责凭证获取、蓝牙连接和 RtAuth 鉴权。 |
| | | */ |
| | | export default function useBluetoothCarControl({ orderId, tripStatus, onBluetoothDoorUnlockSuccess }: Deps) { |
| | | export default function useBluetoothCarControl({ orderId, tripStatus }: Deps) { |
| | | const managerRef = useRef<any>(null); // 蓝牙管理器实例引用 |
| | | const lastStartKeyRef = useRef(''); // 最近一次启动鉴权的参数签名 |
| | | const startAuthTaskRef = useRef<Promise<void> | null>(null); // 当前进行中的鉴权任务,防止并发重复请求 |
| | |
| | | }); |
| | | }; // 统一展示蓝牙解锁结果提示 |
| | | latestTripStatusRef.current = tripStatus; |
| | | |
| | | /** |
| | | * 收口蓝牙真实解锁成功后的状态与提示。 |
| | | */ |
| | | const handleBluetoothDoorUnlockSuccess = () => { |
| | | if (unlockFinishedRef.current) { |
| | | return; |
| | | } |
| | | unlockFinishedRef.current = true; |
| | | setAuthError(''); |
| | | onBluetoothDoorUnlockSuccess?.(); |
| | | const storageKey = `ROBOTAXI_UNLOCK_TOAST_SHOWN_${orderId}`; |
| | | if (!Taro.getStorageSync(storageKey)) { |
| | | showUnlockToast(UNLOCK_SUCCESS_MESSAGE); |
| | | Taro.setStorageSync(storageKey, true); |
| | | } |
| | | closeConnectionRef.current(); |
| | | }; |
| | | |
| | | /** |
| | | * 判断当前蓝牙异步回调是否仍属于有效轮次。 |
| | |
| | | if (result?.type === 'pollingUnlock') { |
| | | const isAlreadyUnlocked = Number(result?.data?.result) === 2; // RtNotification 挂载在 data,result=2 表示车辆已解锁 |
| | | if (isAlreadyUnlocked) { |
| | | handleBluetoothDoorUnlockSuccess(); |
| | | if (unlockFinishedRef.current) { |
| | | return; |
| | | } |
| | | unlockFinishedRef.current = true; |
| | | setAuthError(''); |
| | | const storageKey = `ROBOTAXI_UNLOCK_TOAST_SHOWN_${orderId}`; |
| | | if (!Taro.getStorageSync(storageKey)) { |
| | | showUnlockToast(UNLOCK_SUCCESS_MESSAGE); |
| | | Taro.setStorageSync(storageKey, true); |
| | | } |
| | | closeConnectionRef.current(); |
| | | return; |
| | | } |
| | | if (result?.success) { |
| | | handleBluetoothDoorUnlockSuccess(); |
| | | if (unlockFinishedRef.current) { |
| | | return; |
| | | } |
| | | unlockFinishedRef.current = true; |
| | | setAuthError(''); |
| | | const storageKey = `ROBOTAXI_UNLOCK_TOAST_SHOWN_${orderId}`; |
| | | if (!Taro.getStorageSync(storageKey)) { |
| | | showUnlockToast(UNLOCK_SUCCESS_MESSAGE); |
| | | Taro.setStorageSync(storageKey, true); |
| | | } |
| | | closeConnectionRef.current(); |
| | | } else { |
| | | setAuthError(RETRY_UNLOCK_MESSAGE); |
| | | showUnlockToast(RETRY_UNLOCK_MESSAGE); |
| | |
| | | createPickupArrivedCancelTripReportPayload |
| | | } from '../../../constants/confirm-ride-report'; |
| | | import { OrderActionsDeps } from './use-order-actions.shared'; |
| | | import { clearOrderDoorOpenedFlag } from './order-door-open-storage'; |
| | | |
| | | /** 等待计时开始时间缓存键。 */ |
| | | const WAITING_TIMER_START_STORAGE_KEY = 'waitingTimerStartAt'; |
| | |
| | | * 清理活跃订单运行时缓存。 |
| | | */ |
| | | const clearActiveOrderRuntime = () => { |
| | | clearOrderDoorOpenedFlag(deps.orderId); |
| | | deps.setOrderId(''); |
| | | deps.setVehicleInfo({}); |
| | | clearOrderTripStorage(); |
| | |
| | | import { TRIP_COMPLETED_PAGE_VIEW_EVENT_ID, TRIP_IN_PROGRESS_PAY_START_BUTTON_EVENT_ID } from '../../../constants/report-events'; |
| | | import { SocketOrderStatus, TripStatus } from '../../../constants/trip-status'; |
| | | import { OrderActionsDeps } from './use-order-actions.shared'; |
| | | import { clearOrderDoorOpenedFlag } from './order-door-open-storage'; |
| | | |
| | | /** 支付 Hook 返回值。 */ |
| | | type UseOrderPaymentResult = { |
| | |
| | | * 同步支付成功态。 |
| | | */ |
| | | const syncPaymentSuccessStatus = () => { |
| | | clearOrderDoorOpenedFlag(deps.orderId); |
| | | deps.setTripStatus(TripStatus.PaymentSuccess); |
| | | Taro.setStorageSync('tripStatus', TripStatus.PaymentSuccess); |
| | | }; |
| | |
| | | * 同步行程结束待支付态。 |
| | | */ |
| | | const syncTripFinishedStatus = () => { |
| | | clearOrderDoorOpenedFlag(deps.orderId); |
| | | deps.setTripStatus(TripStatus.TripFinished); |
| | | Taro.setStorageSync('tripStatus', TripStatus.TripFinished); |
| | | }; |
| | |
| | | handlePay: () => void; |
| | | /** 打开评价 */ |
| | | handleOpenEvaluatePopup: () => void; |
| | | /** 是否展示取消行程 */ |
| | | showCancelTrip: boolean; |
| | | /** 当前订单是否已开过门 */ |
| | | hasDoorOpenedInCurrentOrder: boolean; |
| | | /** 详情展开回调 */ |
| | | handleToggleDetailFade: (expanded: boolean, hasFare: boolean) => void; |
| | | /** 修改目的地 */ |
| | |
| | | vehicleInfo={deps.vehicleInfo} |
| | | handleOpenCancelPopup={(displayInfo) => deps.handleOpenCancelPopupByTripStatus(deps.tripStatus, displayInfo)} |
| | | handleCancelTrip={() => deps.handleOpenCancelPopupByTripStatus(deps.tripStatus, true)} |
| | | showCancelTrip={deps.showCancelTrip} |
| | | handleModifyDestination={deps.handleModifyDestination} |
| | | showModifyDestination={deps.showModifyDestination} |
| | | handleShareTrip={deps.handleShareTrip} |
| | |
| | | handlePay={deps.handlePay} |
| | | onOpenCouponSelect={deps.handleOpenCouponSelect} |
| | | handleOpenEvaluatePopup={deps.handleOpenEvaluatePopup} |
| | | hasDoorOpenedInCurrentOrder={deps.hasDoorOpenedInCurrentOrder} |
| | | estimatedWaitMinutes={deps.fareEstimate?.waitingTime} |
| | | routeDurationSeconds={deps.routeDuration} |
| | | onToggleDetailFade={deps.handleToggleDetailFade} |
| | |
| | | import { PENDING_CANCEL_CONTEXT_TTL_MS, type PendingCancelContext } from '../use-order-actions.shared'; |
| | | import type { UseWebSocketEventsDeps } from '../use-web-socket-events'; |
| | | import { isSameOrder, resolveCurrentOrderId, type WebSocketDepsRef } from './web-socket-order-guard'; |
| | | import { clearOrderDoorOpenedFlag } from '../order-door-open-storage'; |
| | | |
| | | /** |
| | | * 解析 payload 中用于同步订单的有效 orderId。 |
| | |
| | | deps.setCancelType(pendingCancelContext?.cancelType || 4); |
| | | deps.pendingCancelContextRef.current = null; |
| | | } else if (changeStatusOld === TripStatus.VehicleApproaching || changeStatusOld === TripStatus.VehicleArrivedPickup) { |
| | | clearOrderDoorOpenedFlag(deps.orderId); |
| | | deps.setOrderId(''); |
| | | deps.setVehicleInfo({}); |
| | | clearOrderTripStorage(); |
| | |
| | | import useBluetoothAccess from './hooks/use-bluetooth-access'; |
| | | // 蓝牙车控连接与鉴权编排 |
| | | import useBluetoothCarControl from './hooks/use-bluetooth-car-control'; |
| | | import useOrderDoorOpenState from './hooks/use-order-door-open-state'; |
| | | import { toTripStatus, TripStatus } from '../../constants/trip-status'; |
| | | import { MODIFY_DESTINATION_SOCKET_STATUS_KEY } from '../../constants/modify-destination'; |
| | | import { getDistance, reportEvent } from '../../../utils/Robotaxi-public-method'; |
| | |
| | | getCurrentLatitude: () => latitude, |
| | | getCurrentVehicleLocation: () => vehicleLocation |
| | | }); // 页面恢复与初始化编排 |
| | | const { |
| | | hasDoorOpenedInCurrentOrder, |
| | | markCurrentOrderDoorOpened, |
| | | clearCurrentOrderDoorOpened |
| | | } = useOrderDoorOpenState({ |
| | | orderId, |
| | | tripStatus, |
| | | pageDidShowVersion |
| | | }); // 当前订单开门状态编排 |
| | | const router = Taro.useRouter(); |
| | | const tripRuntime = useTripRuntime({ |
| | | waitingTimerStartKey: WAITING_TIMER_START_KEY, |
| | |
| | | * 支付成功后的统一收口。 |
| | | */ |
| | | const handlePaymentSuccess = useCallback(() => { |
| | | clearCurrentOrderDoorOpened(orderId); |
| | | setTripStatus(TripStatus.PaymentSuccess); |
| | | Taro.setStorageSync('tripStatus', TripStatus.PaymentSuccess); |
| | | }, [orderId, clearCurrentOrderDoorOpened]); |
| | | |
| | | /** |
| | | * 蓝牙真实解锁成功后,写入当前订单开门标记。 |
| | | */ |
| | | const handleBluetoothDoorUnlockSuccess = useCallback(() => { |
| | | markCurrentOrderDoorOpened(); |
| | | }, [markCurrentOrderDoorOpened]); |
| | | }, []); |
| | | |
| | | const { queryPaymentResult: queryOrderPaymentResult } = useOrderPaymentResultQuery({ |
| | | orderId, |
| | |
| | | markManualDoorUnlock |
| | | } = useBluetoothCarControl({ |
| | | orderId, |
| | | tripStatus, |
| | | onBluetoothDoorUnlockSuccess: handleBluetoothDoorUnlockSuccess |
| | | tripStatus |
| | | }); |
| | | /** |
| | | * 手动点击开门成功后,既要记录本单已开门,也要停止后续蓝牙自动解锁流程。 |
| | | * 手动点击开门成功后,停止后续蓝牙自动解锁流程。 |
| | | */ |
| | | const handleManualDoorUnlockSuccess = useCallback(() => { |
| | | markCurrentOrderDoorOpened(); |
| | | markManualDoorUnlock(); |
| | | }, [markCurrentOrderDoorOpened, markManualDoorUnlock]); |
| | | }, [markManualDoorUnlock]); |
| | | const { |
| | | bluetoothStatusReady, |
| | | bluetoothCardDescription, |
| | |
| | | title: `我正在使用小鹏Robotaxi,车牌号[${vehicleInfo?.plateNumber || ''}]`, |
| | | path: `/robotaxi/pages/share-trip/index?orderId=${shareOrderId}` |
| | | }); |
| | | |
| | | /** 接驾阶段取消行程按钮展示态。 */ |
| | | const showCancelTrip = useMemo(() => { |
| | | return [TripStatus.VehicleApproaching, TripStatus.VehicleArrivedPickup].includes(tripStatus) && !hasDoorOpenedInCurrentOrder; |
| | | }, [tripStatus, hasDoorOpenedInCurrentOrder]); |
| | | |
| | | useShareAppMessage(onShareAppMessage); |
| | | |
| | |
| | | handleOpenOverRoutePopup, |
| | | handlePay, |
| | | handleOpenEvaluatePopup, |
| | | showCancelTrip, |
| | | hasDoorOpenedInCurrentOrder, |
| | | handleToggleDetailFade, |
| | | handleModifyDestination, |
| | | showModifyDestination, |
| | |
| | | case 6: |
| | | return 6; |
| | | case 7: |
| | | return 6; |
| | | return 7; |
| | | case 8: |
| | | return 8; |
| | | case 9: |
| | |
| | | case 6: |
| | | return { tripStatus: 6 }; |
| | | case 7: |
| | | return { tripStatus: 6 }; |
| | | return { tripStatus: 7 }; |
| | | case 8: |
| | | return { tripStatus: 8 }; |
| | | case 9: |