hejianhao
2026-04-24 62e0e9088efec67345541885aaa4f39db183e445
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import Taro from "@tarojs/taro";
import { View, Image } from "@tarojs/components";
import { formatCountdown } from '../../../../../utils/Robotaxi-public-method';
 
type Props = {
    tripStatus: number;
    waitMinutes: number | null;
    durationDisplay: { value: string | number; unit: string };
    isArriveSoon: boolean;
    isPickupCountdownSoon: boolean;
    pickupCountdownSeconds: number | null;
    finishCountdownEnabled: boolean;
    finishCountdownSeconds: number | null;
    limitMinutes: number | null;
    handleOpenCancelPopup?: (displayInfo: { durationDisplay: { value: string | number; unit: string }; waitMinutes: number | null }) => void;
};
 
export default function TripStatusHeader({
    tripStatus,
    waitMinutes,
    durationDisplay,
    isArriveSoon,
    isPickupCountdownSoon,
    pickupCountdownSeconds,
    finishCountdownEnabled,
    finishCountdownSeconds,
    limitMinutes,
    handleOpenCancelPopup
}: Props) {
    // 标题行文案映射
    const titleMap = {
        3: <>预计<View className="time">{waitMinutes}</View>分钟内有车应答</>,
        4: isArriveSoon
            ? <>即将到达</>
            : <>车辆还有<View className="time">{durationDisplay.value}</View>{durationDisplay.unit}到达</>,
        5: <>车辆已到达上车点<View className="time" style={isPickupCountdownSoon ? { color: '#E03434' } : undefined}>{pickupCountdownSeconds !== null ? formatCountdown(pickupCountdownSeconds) : '--:--'}</View></>,
        6: <>预计<View className="time">{durationDisplay.value}</View>{durationDisplay.unit}抵达目的地</>,
        7: (finishCountdownEnabled || finishCountdownSeconds !== null)
            ? <>已到达目的地<View className="time">{finishCountdownSeconds !== null ? formatCountdown(finishCountdownSeconds) : '--:--'}</View></>
            : <>已到达目的地</>,
        8: '行程已结束',
        9: '支付成功'
    }
 
    // 说明文案映射
    const descMap = {
        3: { text: '正全力为您叫车中,请耐心等待...', className: 'calling-car-content-desc' },
        4: limitMinutes ? { text: `此处限停${limitMinutes}分钟,请尽快前往上车点`, className: isArriveSoon ? 'calling-car-content-desc-red' : 'calling-car-content-warning' } : null,
        5: { text: '此处限停,请在倒计时结束前到达上车点', className: 'calling-car-content-desc' },
        6: { text: '行程已开始,请全程系好安全带', className: 'calling-car-content-desc' },
        7: { text: '倒计时结束时车辆将自动驶离,请带好物品安全下车', className: 'calling-car-content-desc' },
        8: { text: '订单待支付,请核对后完成支付', className: 'calling-car-content-desc' }
    }
 
    return (
        <View className='calling-car-content'>
            <View>
                {titleMap[tripStatus] && (
                    <View className='calling-car-content-title'>{titleMap[tripStatus]}</View>
                )}
                {descMap[tripStatus] && (
                    <View style={{ paddingBottom: tripStatus === 3 ? '20px' : '0px' }} className={descMap[tripStatus]?.className}>{descMap[tripStatus]?.text}</View>
                )}
            </View>
            {
                [3, 4, 5].includes(tripStatus) &&
                <View className="cancel-btn">
                    <Image onClick={() => handleOpenCancelPopup?.({ durationDisplay, waitMinutes })} src={require('../../../../assets/cancel-btn.png')} className="cancel" />
                </View>
            }
        </View>
    );
}