| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- import { View, Text, Pressable, Dimensions,Image, StyleSheet } from 'react-native';
- import { SafeAreaView } from 'react-native-safe-area-context';
- import { router, useLocalSearchParams } from 'expo-router';
- import { CrossLogoSvg } from '../global/SVG';
- import CouponTabViewComponent from '../global/couponTabView';
- import { useEffect, useMemo, useState, useRef } from 'react';
- import { chargeStationService } from '../../service/chargeStationService';
- import BookingTabViewComponent from '../global/bookingTabViewComponent';
- import { set } from 'lodash';
- import { ChargingDetails, Remark, ElectricityPrice, Special } from '../../service/type/chargeStationType';
- import { format, parseISO } from 'date-fns';
- const ChargingDetailsPageComponent = () => {
- const screenHeight = Dimensions.get('window').height;
- const params = useLocalSearchParams();
- const [list, setList] = useState<ChargingDetails>({} as ChargingDetails);
- const [time, setTime] = useState<string>('');
- useEffect(() => {
- const fetchData = async () => {
- const res = await chargeStationService.fetchChargingDetails(params.id.toString())
- if (res) {
- // If res is an array, take the first item; otherwise, set as is
- setList(Array.isArray(res) ? res[0] : {} as ChargingDetails);
- // 解析并格式化日期
- const startTime = parseISO(res[0].actual_start_time);
- const endTime = parseISO(res[0].actual_end_time);
- // 格式化为指定格式
- const formattedDate = `${format(startTime, 'yyyy/MM/dd HH:mm:ss')}-${format(endTime, 'HH:mm:ss')}`;
- setTime(formattedDate)
- }
- };
- fetchData();
- }, [])
- const totalPrice = useMemo(() => {
- if (list.total_fee && list.withdraw_fee) {
- let actual_fee = list.total_fee - list.withdraw_fee
- const value = actual_fee <= 0? '0': actual_fee % 1 === 0? `${actual_fee}`: `${actual_fee.toFixed(1)}`
- return value
- }
- return '0';
- }, [list]);
- return (
- <SafeAreaView className="flex-1 bg-white" edges={['top']}>
- <View style={{ minHeight: screenHeight, flex: 1 }}>
- <View className="mx-[5%]" style={{ marginTop: 25}}>
- <Pressable
- onPress={() => {
- if (router.canGoBack()) {
- router.back();
- } else {
- router.replace('/accountMainPage');
- }
- }}
- >
- <CrossLogoSvg />
- </Pressable>
- <View className="items-center px-3">
- {/* <View className="flex-3 items-center justify-end" style={{}}> */}
- <Image
- source={require('../../assets/ccLogo.png')}
- resizeMode="contain"
- style={{
- width: screenHeight > 750 ? 200 : 110,
- height: screenHeight > 750 ? 200 : 110
- }}
- />
- <Text style={styles.totalPrice}>- {totalPrice}</Text>
- <View style={styles.viewLine}></View>
- <View className='w-full flex-row justify-between mt-6 pr-10'>
- <Text style={styles.leftLable}>訂單编號: </Text>
- <Text style={styles.rightLable}>{list.format_order_id}</Text>
- </View>
- <View className='w-full flex-row justify-between my-3 pr-10'>
- <Text style={styles.leftLable}>充電時間: </Text>
- <Text style={styles.rightLable}>{time}</Text>
- </View>
- <View className='w-full flex-row justify-between pr-10 mb-4'>
- <Text style={styles.leftLable}>充電站位置:</Text>
- <Text style={styles.rightLable}>{params.chargeStationName}</Text>
- </View>
- <View style={styles.viewLine}></View>
- <ChargingDataComponent list={list} totalPrice={totalPrice}/>
- <View style={styles.viewLine}></View>
- <View className='w-full flex-row justify-between mt-6 pr-10'>
- <View>
- <Text style={styles.leftLable}>實付:</Text>
- {list.promotion_name ? <Text style={{fontSize: 12, color:'#888888'}}>優惠券支付</Text>: null}
- </View>
- <Text style={styles.rightLable}>${totalPrice}</Text>
- </View>
- </View>
- </View>
- <View style={{ width: "100%",height: 130 }} />
- </View>
- </SafeAreaView>
- );
- };
- interface ChargingDataComponentProps {
- list: ChargingDetails;
- totalPrice: string;
- }
- const ChargingDataComponent: React.FC<ChargingDataComponentProps> = ({
- list,
- totalPrice
- }) => {
- const [data, setData] = useState<Remark>({} as Remark);
- const [price, setPrice] = useState<number>(0);
- const hasFetchedPrice = useRef(false); // 添加 ref 跟踪是否已获取过价格
- useEffect(() => {
- const data = JSON.parse(list?.remark || '{}') as Remark;
- setData(data)
- if (!list.promotion_name && !hasFetchedPrice.current && list.actual_start_time) {
- chargeStationService.fetchElectricityPrice().then(res => {
- hasFetchedPrice.current = true; // 标记为已调用
- const date = new Date(list.actual_start_time);
- const str = date.toLocaleString('en-US', { weekday: 'short' }).toLowerCase();
- if (res && res.length > 0) {
- if (data.RushKwh) {
- const obj = (res[1][str as keyof ElectricityPrice]) as Special
- setPrice(obj.price)
- }
- if (data.ElseKwh) {
- const obj = (res[2][str as keyof ElectricityPrice]) as Special
- setPrice(obj.price)
- }
- if (data.OffKwh) {
- const obj = (res[0][str as keyof ElectricityPrice]) as Special
- setPrice(obj.price)
- }
- }
- })
- }
- }, [list.promotion_name, list.actual_start_time, list.remark])
-
- if (!list.promotion_name) {
- return (
- <View>
- {(data.RushKwh) ?
- <View>
- <View className='w-full flex-row justify-between mt-4 pr-10'>
- <Text style={styles.leftLable}>峰時總電量: </Text>
- <Text style={styles.rightLable}>{data.RushKwh?.toFixed(1)}</Text>
- </View>
- <View className='w-full flex-row justify-between my-3 pr-10'>
- <Text style={styles.leftLable}>峰時電價(09:00-20:59): </Text>
- <Text style={styles.rightLable}>${price}</Text>
- </View>
- <View className='w-full flex-row justify-between pr-10 mb-3'>
- <Text style={styles.leftLable}>峰時總電費:</Text>
-
- <Text style={styles.rightLable}>${totalPrice}</Text>
- </View>
- </View>: null }
- {(data.ElseKwh) ?
- <View>
- <View className='w-full flex-row justify-between mt-4 pr-10'>
- <Text style={styles.leftLable}>平時總電量: </Text>
- <Text style={styles.rightLable}>{data.RushKwh?.toFixed(1)}</Text>
- </View>
- <View className='w-full flex-row justify-between my-3 pr-10'>
- <Text style={styles.leftLable}>平時電價(09:00-20:59): </Text>
- <Text style={styles.rightLable}>${price}</Text>
- </View>
- <View className='w-full flex-row justify-between pr-10 mb-3'>
- <Text style={styles.leftLable}>平時總電費:</Text>
-
- <Text style={styles.rightLable}>${totalPrice}</Text>
- </View>
- </View>: null }
- {(data.OffKwh) ?
- <View>
- <View className='w-full flex-row justify-between mt-4 pr-10'>
- <Text style={styles.leftLable}>穀時總電量: </Text>
- <Text style={styles.rightLable}>{data.RushKwh?.toFixed(1)}</Text>
- </View>
- <View className='w-full flex-row justify-between my-3 pr-10'>
- <Text style={styles.leftLable}>穀時電價(09:00-20:59): </Text>
- <Text style={styles.rightLable}>${price}</Text>
- </View>
- <View className='w-full flex-row justify-between pr-10 mb-3'>
- <Text style={styles.leftLable}>穀時總電費:</Text>
-
- <Text style={styles.rightLable}>${totalPrice}</Text>
- </View>
- </View>: null }
- </View>
- )
- } else {
- return (
- <View>
- <View className='w-full flex-row justify-between mt-4 pr-10'>
- <Text style={styles.leftLable}>總電量: </Text>
- <Text style={styles.rightLable}>{data.TotalPower?.toFixed(1)}</Text>
- </View>
- <View className='w-full flex-row justify-between my-3 pr-10'>
- <Text style={styles.leftLable}>電價: </Text>
- <Text style={styles.rightLable}>${list?.connector?.EquipmentID?.StationID?.price}</Text>
- </View>
- <View className='w-full flex-row justify-between pr-10 mb-3'>
- <Text style={styles.leftLable}>總電費: </Text>
-
- <Text style={styles.rightLable}>${totalPrice}</Text>
- </View>
- </View>
- )
- }
- }
- const styles = StyleSheet.create({
- viewLine: {
- width: '100%',
- height: 1,
- backgroundColor: '#E5E5E5',
- },
- totalPrice: {
- fontSize: 26,
- fontWeight: 'bold',
- marginBottom: 25,
- },
- leftLable: {
- fontSize: 18,
- color:'#888888',
- },
- rightLable: {
- fontSize: 17
- },
- })
- export default ChargingDetailsPageComponent;
|