| | |
| | | if (!Number.isFinite(discountAmount) || discountAmount <= 0) { |
| | | return '0元'; |
| | | } |
| | | return `${parseFloat(discountAmount.toFixed(2))}元`; |
| | | return `-${parseFloat(discountAmount.toFixed(2))}元`; |
| | | }; |
| | | |
| | | useEffect(() => { |
| | |
| | | return ( |
| | | <View className="release-route-container"> |
| | | <View |
| | | className='release-route-wrapper' |
| | | style={{ height: typeof boxHeight === 'number' ? `${boxHeight}px` : 'auto' }} |
| | | catchMove={isRouteSelectExpanded} |
| | | onTouchStart={(e) => { |
| | | // 如果没有展开,禁止滑动 |
| | | if (!isRouteSelectExpanded) return; |
| | | e.stopPropagation(); |
| | | handleTouchStart(e); |
| | | }} |
| | | onTouchMove={(e) => { |
| | | if (!isRouteSelectExpanded) return; |
| | | e.stopPropagation(); |
| | | handleTouchMove(e); |
| | | }} |
| | | onTouchEnd={(e) => { |
| | | if (!isRouteSelectExpanded) return; |
| | | e.stopPropagation(); |
| | | handleTouchEnd(); |
| | | }} |
| | | className='release-route-wrapper' |
| | | style={{ height: typeof boxHeight === 'number' ? `${boxHeight}px` : 'auto' }} |
| | | catchMove={isRouteSelectExpanded} |
| | | onTouchStart={(e) => { |
| | | // 如果没有展开,禁止滑动 |
| | | if (!isRouteSelectExpanded) return; |
| | | e.stopPropagation(); |
| | | handleTouchStart(e); |
| | | }} |
| | | onTouchMove={(e) => { |
| | | if (!isRouteSelectExpanded) return; |
| | | e.stopPropagation(); |
| | | handleTouchMove(e); |
| | | }} |
| | | onTouchEnd={(e) => { |
| | | if (!isRouteSelectExpanded) return; |
| | | e.stopPropagation(); |
| | | handleTouchEnd(); |
| | | }} |
| | | > |
| | | <View className='release-route-content'> |
| | | {isRouteSelectExpanded && ( |
| | | <RouteSelectionPanel |
| | | routeOptions={routeOptions} |
| | | selectedRouteIndex={selectedRouteIndex} |
| | | handleSelectRoute={handleSelectRoute} |
| | | routeOptions={routeOptions} |
| | | selectedRouteIndex={selectedRouteIndex} |
| | | handleSelectRoute={handleSelectRoute} |
| | | /> |
| | | )} |
| | | <View className="select-site" style={{ paddingBottom: typeof bottomPaddingHeight === 'number' ? `${bottomPaddingHeight}px` : undefined }}> |
| | | <Image className="site-top-bg" src='https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/site-top-bg-20260507.png' /> |
| | | <View className="site-boarding-point"> |
| | | <Image className="site-top-bg" src='https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/top-card-bg-20260722.png' /> |
| | | <View className="select-site-content"> |
| | | <View className="site-boarding-point"> |
| | | {/* 起点 */} |
| | | <View> |
| | | <View onClick={() => toSeleteSitePage('start')} className="now-site"> |
| | | <View className="now-site-dot"></View> |
| | | <View className="now-site-address"> |
| | | <View className="now-site-address-content"> |
| | | 从<Text className="now-site-address-text">{startSite.name}</Text>上车 |
| | | </View> |
| | | <Image className="now-site-icon" src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/right-icon.png" /> |
| | | </View> |
| | | </View> |
| | | {walkingTime > 0 && <View className="now-site-walk">步行{formatWalkingTime(walkingTime)}</View>} |
| | | <View onClick={() => toSeleteSitePage('start')} className="now-site"> |
| | | <View className="now-site-dot"></View> |
| | | <View className="now-site-address"> |
| | | <View className="now-site-address-content"> |
| | | 从<Text className="now-site-address-text">{startSite.name}</Text>上车 |
| | | </View> |
| | | <Image className="now-site-icon" src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/now-site-arrow-20260708.png" /> |
| | | </View> |
| | | </View> |
| | | {walkingTime > 0 && <View className="now-site-walk">步行{formatWalkingTime(walkingTime)}</View>} |
| | | </View> |
| | | {/* 终点 */} |
| | | <View onClick={() => toSeleteSitePage('end')} className="to-site"> |
| | |
| | | <View className="to-site-text">{endSite.name}</View> |
| | | </View> |
| | | </View> |
| | | </View> |
| | | <View className="route-content"> |
| | | <View className="route-content-top"> |
| | | <View className="route-content-txt">预估等待{fareEstimate.waitingTime || '-'}分钟</View> |
| | | <View className="route-content-txt" style={{ margin: '0 4px' }}>|</View> |
| | | <View className="route-content-txt">限乘{fareEstimate.maxPeopleNumber || '-'}人</View> |
| | | </View> |
| | | <View className="route-content-bottom"> |
| | | <View onClick={handleOpenPassengerNotice} className="route-content-bottom-left"> |
| | | <Image className="tip-icon" src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/tip-default-icon.png" /> |
| | | <View>乘车须知</View> |
| | | </View> |
| | | <View className="route-content"> |
| | | <View className="route-content-top"> |
| | | <View className="route-content-txt">预估等待{fareEstimate.waitingTime || '-'}分钟</View> |
| | | <View className="route-content-txt" style={{ margin: '0 4px' }}>|</View> |
| | | <View className="route-content-txt">限乘{fareEstimate.maxPeopleNumber || '-'}人</View> |
| | | </View> |
| | | <View className="route-content-bottom"> |
| | | <View onClick={handleOpenPassengerNotice} className="route-content-bottom-left"> |
| | | <Image className="tip-icon" src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/tip-default-icon-20260726.png" /> |
| | | <View>乘车须知</View> |
| | | </View> |
| | | </View> |
| | | </View> |
| | | </View> |
| | | </View> |
| | | </View> |
| | | </View> |
| | | <View className="confirm-btn-box"> |
| | | { |
| | | hasDiscountAmount && |
| | | <View className="discount-amount" onClick={onOpenCouponSelect}> |
| | | <View |
| | | className="discount-amount" |
| | | style={{ visibility: isRouteSelectExpanded ? 'hidden' : 'visible' }} |
| | | onClick={onOpenCouponSelect} |
| | | > |
| | | <View className="flex-center"> |
| | | <View className="discount-amount-text">最佳优惠</View> |
| | | <View className="discount-amount-desc" >已为您选择最佳优惠</View> |
| | | </View> |
| | | <View className="flex-center"> |
| | | <View className="discount-amount-num">{formatDiscountAmountText()}</View> |
| | | <Image className="change-coupon-icon" src='https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/change-coupon.png' /> |
| | | <Image className="change-coupon-icon" src='https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/golden-arrow-20260702.png' /> |
| | | </View> |
| | | </View> |
| | | } |
| | | <View className="confirm-btn-box-content"> |
| | | <View className="money-box"> |
| | | {isOperateFree ? ( |
| | | <View className="route-operate-free">员工内部测试</View> |
| | | <View className="route-operate-free">{selectedRoute?.freeText || "员工内部测试"}</View> |
| | | ) : ( |
| | | <View className="route-content-top-money" onClick={() => toPriceDescription()} > |
| | | <Image className="tip-icon" src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/tip-default-icon.png" /> |
| | | <View className="price-box"> |
| | | <View className="price-box-text">预估</View> |
| | | <Text className="money-num">{fareEstimate.finalFareStr || '-'}</Text> |
| | | <View className="price-box-text">元</View> |
| | | <View className="forecast-text"> |
| | | <Image className="tip-icon" src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/tip-default-icon.png" /> |
| | | <Text>预估</Text> |
| | | </View> |
| | | <Text className="money-num">{fareEstimate.finalFareStr || '-'}</Text> |
| | | <View className="unit-text"> |
| | | 元 |
| | | </View> |
| | | </View> |
| | | )} |
| | | </View> |
| | | <View className="confirm-btn-wrapper"> |
| | | <View onClick={() => !isCallDisabled && callImmediately()} className="confirm-btn">立即呼叫</View> |
| | | {isCallDisabled && <View className="confirm-btn-mask" />} |
| | | <Image className="confirm-btn-bg" src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/confirm-btn-bg-20260726.png" /> |
| | | <View onClick={() => !isCallDisabled && callImmediately()} className="confirm-btn"> |
| | | <Image className="confirm-btn-icon" src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/confirm-btn-icon-20260629.png" /> |
| | | 立即呼叫 |
| | | </View> |
| | | {isCallDisabled && <View className="confirm-btn-mask" />} |
| | | </View> |
| | | </View> |
| | | </View> |