|
|
@@ -0,0 +1,228 @@
|
|
|
+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;
|