Ian Fung 1 年之前
父节点
当前提交
7ee0d86e15

+ 39 - 4
app/(auth)/(tabs)/(charging)/chargingPage.tsx

@@ -1,5 +1,5 @@
-import { View, Text, ActivityIndicator } from 'react-native';
-import React, { useCallback, useState } from 'react';
+import { View, Text, ActivityIndicator, AppState } from 'react-native';
+import React, { useCallback, useEffect, useRef, useState } from 'react';
 import ChargingPageComponent from '../../../../component/chargingPage/chargingPageComponent';
 import { chargeStationService } from '../../../../service/chargeStationService';
 import ChargingPenaltyPageComponent from '../../../../component/chargingPage/chargingPenaltyComponent';
@@ -123,7 +123,8 @@ const ChargingPage = () => {
     const [data, setData] = useState();
     const [isLoading, setIsLoading] = useState(false);
     const [currentStatus, setCurrentStatus] = useState('');
-
+    const intervalRef = useRef(null);
+    const lastUpdateTimeRef = useRef(Date.now());
     // const fetchReservationData = useCallback(async () => {
     //     setIsLoading(true);
     //     try {
@@ -185,7 +186,8 @@ const ChargingPage = () => {
         try {
             const now = new Date();
             const response = await chargeStationService.fetchReservationHistories();
-            console.log('response', response);
+            // console.log('response', response);
+            lastUpdateTimeRef.current = Date.now();
             // Check if there are any reservations
             if (Object.keys(response).length === 0) {
                 console.log('no reservation data');
@@ -243,6 +245,39 @@ const ChargingPage = () => {
             setIsLoading(false);
         }
     }, []);
+
+    const checkAndUpdateData = useCallback(() => {
+        const currentTime = Date.now();
+        const timeSinceLastUpdate = currentTime - lastUpdateTimeRef.current;
+        if (timeSinceLastUpdate > 60000) {
+            // If more than a minute has passed
+            fetchReservationData();
+        }
+    }, [fetchReservationData]);
+
+    useEffect(() => {
+        const subscription = AppState.addEventListener('change', (nextAppState) => {
+            if (nextAppState === 'active') {
+                checkAndUpdateData();
+            }
+        });
+
+        return () => {
+            subscription.remove();
+        };
+    }, [checkAndUpdateData]);
+
+    useEffect(() => {
+        fetchReservationData();
+        intervalRef.current = setInterval(fetchReservationData, 60000);
+
+        return () => {
+            if (intervalRef.current) {
+                clearInterval(intervalRef.current);
+            }
+        };
+    }, [fetchReservationData]);
+
     useFocusEffect(
         useCallback(() => {
             let isActive = true;

+ 906 - 903
component/accountPages/walletPageComponent.tsx

@@ -1,496 +1,496 @@
-import {
-    View,
-    Image,
-    Text,
-    ScrollView,
-    AppState,
-    Pressable,
-    ImageBackground,
-    ActivityIndicator,
-    Modal,
-    Alert,
-    TextInput,
-    Linking
-} from 'react-native';
-import { SafeAreaView } from 'react-native-safe-area-context';
-import { router } from 'expo-router';
-import { CrossLogoSvg } from '../global/SVG';
-import { useEffect, useRef, useState } from 'react';
-import { walletService } from '../../service/walletService';
-import UnionPayImage from '../../assets/unionpay.png';
-import PayMeImage from '../../assets/payme.png';
-import { formatCouponDate, formatDate } from '../../util/lib';
-import { set } from 'date-fns';
-import { reloadAppAsync } from 'expo';
-
-const TopUpModal = ({ visible, onClose, onSelect, paymentOptions }) => {
-    const getPaymentImage = (key) => {
-        switch (key) {
-            case 'union_pay_wap_payment':
-                return UnionPayImage;
-            case 'payme_wap_payment':
-                return PayMeImage;
-            default:
-                return null;
-        }
-    };
-    return (
-        <Modal animationType="fade" transparent={true} visible={visible} onRequestClose={onClose}>
-            <View
-                style={{
-                    flex: 1,
-                    justifyContent: 'center',
-                    alignItems: 'center',
-                    backgroundColor: 'rgba(0,0,0,0.5)'
-                }}
-            >
-                <View
-                    style={{
-                        backgroundColor: 'white',
-                        padding: 20,
-                        borderRadius: 10,
-                        width: '80%',
-                        maxHeight: '80%'
-                    }}
-                >
-                    <Text style={{ fontSize: 20, marginBottom: 20 }}>選擇支付方式</Text>
-                    <ScrollView>
-                        {Object.entries(paymentOptions).map(([key, value]) => (
-                            <Pressable
-                                key={key}
-                                onPress={() => onSelect(value)}
-                                style={{
-                                    padding: 10,
-                                    marginBottom: 10,
-                                    borderBottomWidth: 1,
-                                    borderBottomColor: '#eee'
-                                }}
-                            >
-                                <View className="flex flex-row items-center space-x-2">
-                                    <Image
-                                        source={getPaymentImage(key)}
-                                        style={{ width: 40, height: 40, marginRight: 10 }}
-                                        resizeMode="contain"
-                                    />
-                                    <Text className="tracking-wider">
-                                        {key === 'union_pay_wap_payment' ? 'UnionPay' : 'PayMe'}
-                                    </Text>
-                                </View>
-                            </Pressable>
-                        ))}
-                    </ScrollView>
-                    <Pressable onPress={onClose} style={{ padding: 10, alignItems: 'center', marginTop: 10 }}>
-                        <Text style={{ color: 'red' }}>關閉</Text>
-                    </Pressable>
-                </View>
-            </View>
-        </Modal>
-    );
-};
-const AmountInputModal = ({ visible, onClose, onConfirm }) => {
-    const [inputAmount, setInputAmount] = useState('');
+// import {
+//     View,
+//     Image,
+//     Text,
+//     ScrollView,
+//     AppState,
+//     Pressable,
+//     ImageBackground,
+//     ActivityIndicator,
+//     Modal,
+//     Alert,
+//     TextInput,
+//     Linking
+// } from 'react-native';
+// import { SafeAreaView } from 'react-native-safe-area-context';
+// import { router } from 'expo-router';
+// import { CrossLogoSvg } from '../global/SVG';
+// import { useEffect, useRef, useState } from 'react';
+// import { walletService } from '../../service/walletService';
+// import UnionPayImage from '../../assets/unionpay.png';
+// import PayMeImage from '../../assets/payme.png';
+// import { formatCouponDate, formatDate } from '../../util/lib';
+// import { set } from 'date-fns';
+// import { reloadAppAsync } from 'expo';
 
-    return (
-        <Modal animationType="fade" transparent={true} visible={visible} onRequestClose={onClose}>
-            <View
-                style={{
-                    flex: 1,
-                    justifyContent: 'center',
-                    alignItems: 'center',
-                    backgroundColor: 'rgba(0,0,0,0.5)'
-                }}
-            >
-                <View
-                    style={{
-                        backgroundColor: 'white',
-                        padding: 20,
-                        borderRadius: 10,
-                        width: '80%'
-                    }}
-                >
-                    <Text style={{ fontSize: 20, marginBottom: 20 }}>輸入增值金額</Text>
-                    <TextInput
-                        style={{
-                            borderWidth: 1,
-                            borderColor: '#ccc',
-                            borderRadius: 5,
-                            padding: 10,
-                            marginBottom: 20,
-                            fontSize: 18
-                        }}
-                        keyboardType="numeric"
-                        placeholder="輸入金額"
-                        value={inputAmount}
-                        onChangeText={setInputAmount}
-                    />
-                    <Pressable
-                        onPress={() => onConfirm(inputAmount)}
-                        style={{
-                            backgroundColor: '#02677D',
-                            padding: 10,
-                            borderRadius: 5,
-                            alignItems: 'center'
-                        }}
-                    >
-                        <Text style={{ color: 'white', fontSize: 18 }}>確認</Text>
-                    </Pressable>
-                    <Pressable onPress={onClose} style={{ padding: 10, alignItems: 'center', marginTop: 10 }}>
-                        <Text style={{ color: 'red' }}>取消</Text>
-                    </Pressable>
-                </View>
-            </View>
-        </Modal>
-    );
-};
+// const TopUpModal = ({ visible, onClose, onSelect, paymentOptions }) => {
+//     const getPaymentImage = (key) => {
+//         switch (key) {
+//             case 'union_pay_wap_payment':
+//                 return UnionPayImage;
+//             case 'payme_wap_payment':
+//                 return PayMeImage;
+//             default:
+//                 return null;
+//         }
+//     };
+//     return (
+//         <Modal animationType="fade" transparent={true} visible={visible} onRequestClose={onClose}>
+//             <View
+//                 style={{
+//                     flex: 1,
+//                     justifyContent: 'center',
+//                     alignItems: 'center',
+//                     backgroundColor: 'rgba(0,0,0,0.5)'
+//                 }}
+//             >
+//                 <View
+//                     style={{
+//                         backgroundColor: 'white',
+//                         padding: 20,
+//                         borderRadius: 10,
+//                         width: '80%',
+//                         maxHeight: '80%'
+//                     }}
+//                 >
+//                     <Text style={{ fontSize: 20, marginBottom: 20 }}>選擇支付方式</Text>
+//                     <ScrollView>
+//                         {Object.entries(paymentOptions).map(([key, value]) => (
+//                             <Pressable
+//                                 key={key}
+//                                 onPress={() => onSelect(value)}
+//                                 style={{
+//                                     padding: 10,
+//                                     marginBottom: 10,
+//                                     borderBottomWidth: 1,
+//                                     borderBottomColor: '#eee'
+//                                 }}
+//                             >
+//                                 <View className="flex flex-row items-center space-x-2">
+//                                     <Image
+//                                         source={getPaymentImage(key)}
+//                                         style={{ width: 40, height: 40, marginRight: 10 }}
+//                                         resizeMode="contain"
+//                                     />
+//                                     <Text className="tracking-wider">
+//                                         {key === 'union_pay_wap_payment' ? 'UnionPay' : 'PayMe'}
+//                                     </Text>
+//                                 </View>
+//                             </Pressable>
+//                         ))}
+//                     </ScrollView>
+//                     <Pressable onPress={onClose} style={{ padding: 10, alignItems: 'center', marginTop: 10 }}>
+//                         <Text style={{ color: 'red' }}>關閉</Text>
+//                     </Pressable>
+//                 </View>
+//             </View>
+//         </Modal>
+//     );
+// };
+// const AmountInputModal = ({ visible, onClose, onConfirm }) => {
+//     const [inputAmount, setInputAmount] = useState('');
 
-export const IndividualCouponComponent = ({
-    title,
-    price,
-    detail,
-    date
-}: {
-    title: string;
-    price: string;
-    detail: string;
-    date: string;
-}) => {
-    return (
-        <Pressable onPress={() => console.log('abc')}>
-            <View className="bg-[#e7f2f8] h-[124px]  rounded-xl flex-row mb-3">
-                <View className="bg-white mx-3 my-3 w-[28%] rounded-xl">
-                    <View className="flex-row justify-center items-center pr-4 pt-4 ">
-                        <Text className="color-[#02677d] text-2xl pl-2 pr-1">$</Text>
-                        <Text className="color-[#02677d] text-3xl font-bold" adjustsFontSizeToFit={true}>
-                            {price}
-                        </Text>
-                    </View>
-                    <View className="items-center justify-center">
-                        <Text className="text-base mt-1">{title}</Text>
-                    </View>
-                </View>
+//     return (
+//         <Modal animationType="fade" transparent={true} visible={visible} onRequestClose={onClose}>
+//             <View
+//                 style={{
+//                     flex: 1,
+//                     justifyContent: 'center',
+//                     alignItems: 'center',
+//                     backgroundColor: 'rgba(0,0,0,0.5)'
+//                 }}
+//             >
+//                 <View
+//                     style={{
+//                         backgroundColor: 'white',
+//                         padding: 20,
+//                         borderRadius: 10,
+//                         width: '80%'
+//                     }}
+//                 >
+//                     <Text style={{ fontSize: 20, marginBottom: 20 }}>輸入增值金額</Text>
+//                     <TextInput
+//                         style={{
+//                             borderWidth: 1,
+//                             borderColor: '#ccc',
+//                             borderRadius: 5,
+//                             padding: 10,
+//                             marginBottom: 20,
+//                             fontSize: 18
+//                         }}
+//                         keyboardType="numeric"
+//                         placeholder="輸入金額"
+//                         value={inputAmount}
+//                         onChangeText={setInputAmount}
+//                     />
+//                     <Pressable
+//                         onPress={() => onConfirm(inputAmount)}
+//                         style={{
+//                             backgroundColor: '#02677D',
+//                             padding: 10,
+//                             borderRadius: 5,
+//                             alignItems: 'center'
+//                         }}
+//                     >
+//                         <Text style={{ color: 'white', fontSize: 18 }}>確認</Text>
+//                     </Pressable>
+//                     <Pressable onPress={onClose} style={{ padding: 10, alignItems: 'center', marginTop: 10 }}>
+//                         <Text style={{ color: 'red' }}>取消</Text>
+//                     </Pressable>
+//                 </View>
+//             </View>
+//         </Modal>
+//     );
+// };
 
-                {/* //dash line */}
-                <View style={{ overflow: 'hidden' }}>
-                    <View
-                        style={{
-                            borderStyle: 'dashed',
-                            borderWidth: 1,
-                            borderColor: '#CCCCCC',
-                            margin: -1,
-                            width: 0,
-                            marginRight: 0,
-                            height: '100%'
-                        }}
-                    >
-                        <View style={{ height: 60 }}></View>
-                    </View>
-                </View>
+// export const IndividualCouponComponent = ({
+//     title,
+//     price,
+//     detail,
+//     date
+// }: {
+//     title: string;
+//     price: string;
+//     detail: string;
+//     date: string;
+// }) => {
+//     return (
+//         <Pressable onPress={() => console.log('abc')}>
+//             <View className="bg-[#e7f2f8] h-[124px]  rounded-xl flex-row mb-3">
+//                 <View className="bg-white mx-3 my-3 w-[28%] rounded-xl">
+//                     <View className="flex-row justify-center items-center pr-4 pt-4 ">
+//                         <Text className="color-[#02677d] text-2xl pl-2 pr-1">$</Text>
+//                         <Text className="color-[#02677d] text-3xl font-bold" adjustsFontSizeToFit={true}>
+//                             {price}
+//                         </Text>
+//                     </View>
+//                     <View className="items-center justify-center">
+//                         <Text className="text-base mt-1">{title}</Text>
+//                     </View>
+//                 </View>
 
-                <View className="flex-col flex-1  m-[5%] justify-center ">
-                    <Text className="text-lg">{title}</Text>
-                    <Text className="color-[#888888] text-sm">{detail}</Text>
-                    <View className="flex-row items-center ">
-                        <Text className="text-base">有效期 </Text>
-                        <Text className="text-base font-bold text-[#02677d]">{date}</Text>
-                    </View>
-                </View>
-            </View>
-        </Pressable>
-    );
-};
+//                 {/* //dash line */}
+//                 <View style={{ overflow: 'hidden' }}>
+//                     <View
+//                         style={{
+//                             borderStyle: 'dashed',
+//                             borderWidth: 1,
+//                             borderColor: '#CCCCCC',
+//                             margin: -1,
+//                             width: 0,
+//                             marginRight: 0,
+//                             height: '100%'
+//                         }}
+//                     >
+//                         <View style={{ height: 60 }}></View>
+//                     </View>
+//                 </View>
 
-const WalletPageComponent = () => {
-    const [walletBalance, setWalletBalance] = useState<string | null>(null);
-    const [loading, setLoading] = useState<boolean>(false);
-    const [modalVisible, setModalVisible] = useState(false);
-    const [coupons, setCoupons] = useState([]);
-    const [paymentType, setPaymentType] = useState({});
-    const [userID, setUserID] = useState('');
-    const [selectedPaymentType, setSelectedPaymentType] = useState<string | null>(null);
-    const [amount, setAmount] = useState<number>(0);
-    const [amountModalVisible, setAmountModalVisible] = useState(false);
-    const [outTradeNo, setOutTradeNo] = useState('');
-    const PAYMENT_CHECK_TIMEOUT = 5 * 60 * 1000; // 5 minutes in milliseconds
-    const [paymentStatus, setPaymentStatus] = useState(null);
-    const [isExpectingPayment, setIsExpectingPayment] = useState(false);
-    const appState = useRef(AppState.currentState);
-    const paymentInitiatedTime = useRef(null);
+//                 <View className="flex-col flex-1  m-[5%] justify-center ">
+//                     <Text className="text-lg">{title}</Text>
+//                     <Text className="color-[#888888] text-sm">{detail}</Text>
+//                     <View className="flex-row items-center ">
+//                         <Text className="text-base">有效期 </Text>
+//                         <Text className="text-base font-bold text-[#02677d]">{date}</Text>
+//                     </View>
+//                 </View>
+//             </View>
+//         </Pressable>
+//     );
+// };
 
-    useEffect(() => {
-        const subscription = AppState.addEventListener('change', (nextAppState) => {
-            if (
-                appState.current.match(/inactive|background/) &&
-                nextAppState === 'active' &&
-                isExpectingPayment &&
-                outTradeNo &&
-                paymentInitiatedTime.current
-            ) {
-                const currentTime = new Date().getTime();
-                if (currentTime - paymentInitiatedTime.current < PAYMENT_CHECK_TIMEOUT) {
-                    checkPaymentStatus();
-                } else {
-                    // Payment check timeout reached
-                    setIsExpectingPayment(false);
-                    setOutTradeNo('');
-                    paymentInitiatedTime.current = null;
-                    Alert.alert(
-                        'Payment Timeout',
-                        'The payment status check has timed out. Please check your payment history.'
-                    );
-                }
-            }
-            appState.current = nextAppState;
-        });
+// const WalletPageComponent = () => {
+//     const [walletBalance, setWalletBalance] = useState<string | null>(null);
+//     const [loading, setLoading] = useState<boolean>(false);
+//     const [modalVisible, setModalVisible] = useState(false);
+//     const [coupons, setCoupons] = useState([]);
+//     const [paymentType, setPaymentType] = useState({});
+//     const [userID, setUserID] = useState('');
+//     const [selectedPaymentType, setSelectedPaymentType] = useState<string | null>(null);
+//     const [amount, setAmount] = useState<number>(0);
+//     const [amountModalVisible, setAmountModalVisible] = useState(false);
+//     const [outTradeNo, setOutTradeNo] = useState('');
+//     const PAYMENT_CHECK_TIMEOUT = 5 * 60 * 1000; // 5 minutes in milliseconds
+//     const [paymentStatus, setPaymentStatus] = useState(null);
+//     const [isExpectingPayment, setIsExpectingPayment] = useState(false);
+//     const appState = useRef(AppState.currentState);
+//     const paymentInitiatedTime = useRef(null);
 
-        return () => {
-            subscription.remove();
-        };
-    }, [outTradeNo, isExpectingPayment]);
+//     useEffect(() => {
+//         const subscription = AppState.addEventListener('change', (nextAppState) => {
+//             if (
+//                 appState.current.match(/inactive|background/) &&
+//                 nextAppState === 'active' &&
+//                 isExpectingPayment &&
+//                 outTradeNo &&
+//                 paymentInitiatedTime.current
+//             ) {
+//                 const currentTime = new Date().getTime();
+//                 if (currentTime - paymentInitiatedTime.current < PAYMENT_CHECK_TIMEOUT) {
+//                     checkPaymentStatus();
+//                 } else {
+//                     // Payment check timeout reached
+//                     setIsExpectingPayment(false);
+//                     setOutTradeNo('');
+//                     paymentInitiatedTime.current = null;
+//                     Alert.alert(
+//                         'Payment Timeout',
+//                         'The payment status check has timed out. Please check your payment history.'
+//                     );
+//                 }
+//             }
+//             appState.current = nextAppState;
+//         });
 
-    const checkPaymentStatus = async () => {
-        try {
-            const result = await walletService.checkPaymentStatus(outTradeNo);
-            setPaymentStatus(result);
-            console.log('checkPaymentStatus from walletPageComponent', result);
-            if (result) {
-                // Payment successful
-                Alert.alert('Success', 'Payment was successful!', [
-                    {
-                        text: 'OK',
-                        onPress: async () => {
-                            const wallet = await walletService.getWalletBalance();
-                            setWalletBalance(wallet);
-                            console.log('new wallet:', wallet);
-                        }
-                    }
-                ]);
-            } else {
-                Alert.alert('Payment Failed', 'Payment was not successful. Please try again.');
-            }
-            setIsExpectingPayment(false);
-            setOutTradeNo('');
-            paymentInitiatedTime.current = null;
-        } catch (error) {
-            console.error('Failed to check payment status:', error);
-            Alert.alert('Error', 'Failed to check payment status. Please check your payment history.');
-        }
-    };
+//         return () => {
+//             subscription.remove();
+//         };
+//     }, [outTradeNo, isExpectingPayment]);
 
-    // useEffect(() => {
-    //     const handleAppStateChange = (nextAppState) => {
-    //         if (appState.match(/inactive|background/) && nextAppState === 'active') {
-    //             console.log('App has come to the foreground!');
-    //             // Check payment status or update UI here
-    //             console.log('outTradeNo', outTradeNo);
-    //         }
-    //         setAppState(nextAppState);
-    //     };
+//     const checkPaymentStatus = async () => {
+//         try {
+//             const result = await walletService.checkPaymentStatus(outTradeNo);
+//             setPaymentStatus(result);
+//             console.log('checkPaymentStatus from walletPageComponent', result);
+//             if (result) {
+//                 // Payment successful
+//                 Alert.alert('Success', 'Payment was successful!', [
+//                     {
+//                         text: 'OK',
+//                         onPress: async () => {
+//                             const wallet = await walletService.getWalletBalance();
+//                             setWalletBalance(wallet);
+//                             console.log('new wallet:', wallet);
+//                         }
+//                     }
+//                 ]);
+//             } else {
+//                 Alert.alert('Payment Failed', 'Payment was not successful. Please try again.');
+//             }
+//             setIsExpectingPayment(false);
+//             setOutTradeNo('');
+//             paymentInitiatedTime.current = null;
+//         } catch (error) {
+//             console.error('Failed to check payment status:', error);
+//             Alert.alert('Error', 'Failed to check payment status. Please check your payment history.');
+//         }
+//     };
 
-    //     AppState.addEventListener('change', handleAppStateChange);
-    // }, [appState]);
+//     // useEffect(() => {
+//     //     const handleAppStateChange = (nextAppState) => {
+//     //         if (appState.match(/inactive|background/) && nextAppState === 'active') {
+//     //             console.log('App has come to the foreground!');
+//     //             // Check payment status or update UI here
+//     //             console.log('outTradeNo', outTradeNo);
+//     //         }
+//     //         setAppState(nextAppState);
+//     //     };
 
-    useEffect(() => {
-        const fetchData = async () => {
-            try {
-                setLoading(true);
-                const info = await walletService.getCustomerInfo();
-                // const coupon = await walletService.getCouponForSpecificUser(info.id);
-                const wallet = await walletService.getWalletBalance();
-                console.log(wallet);
-                setUserID(info.id);
-                setWalletBalance(wallet);
-                setCoupons(coupon);
-            } catch (error) {
-                console.log(error);
-            } finally {
-                setLoading(false);
-            }
-        };
+//     //     AppState.addEventListener('change', handleAppStateChange);
+//     // }, [appState]);
 
-        fetchData();
-    }, []);
+//     useEffect(() => {
+//         const fetchData = async () => {
+//             try {
+//                 setLoading(true);
+//                 const info = await walletService.getCustomerInfo();
+//                 // const coupon = await walletService.getCouponForSpecificUser(info.id);
+//                 const wallet = await walletService.getWalletBalance();
+//                 console.log(wallet);
+//                 setUserID(info.id);
+//                 setWalletBalance(wallet);
+//                 setCoupons(coupon);
+//             } catch (error) {
+//                 console.log(error);
+//             } finally {
+//                 setLoading(false);
+//             }
+//         };
 
-    const formatMoney = (amount: any) => {
-        if (typeof amount !== 'number') {
-            amount = Number(amount);
-        }
-        return amount.toLocaleString('en-US');
-    };
-    const filterPaymentOptions = (options, allowedKeys) => {
-        return Object.fromEntries(Object.entries(options).filter(([key]) => allowedKeys.includes(key)));
-    };
-    useEffect(() => {
-        const fetchPaymentType = async () => {
-            const response = await walletService.selectPaymentType();
-            console.log('response', response);
-            const filteredPaymentTypes = filterPaymentOptions(response, ['union_pay_wap_payment', 'payme_wap_payment']);
-            setPaymentType(filteredPaymentTypes);
-        };
-        fetchPaymentType();
-    }, []);
+//         fetchData();
+//     }, []);
 
-    const handleTopUp = (selectedValue) => {
-        setSelectedPaymentType(selectedValue);
-        setModalVisible(false);
-        setAmountModalVisible(true);
-    };
+//     const formatMoney = (amount: any) => {
+//         if (typeof amount !== 'number') {
+//             amount = Number(amount);
+//         }
+//         return amount.toLocaleString('en-US');
+//     };
+//     const filterPaymentOptions = (options, allowedKeys) => {
+//         return Object.fromEntries(Object.entries(options).filter(([key]) => allowedKeys.includes(key)));
+//     };
+//     useEffect(() => {
+//         const fetchPaymentType = async () => {
+//             const response = await walletService.selectPaymentType();
+//             console.log('response', response);
+//             const filteredPaymentTypes = filterPaymentOptions(response, ['union_pay_wap_payment', 'payme_wap_payment']);
+//             setPaymentType(filteredPaymentTypes);
+//         };
+//         fetchPaymentType();
+//     }, []);
 
-    const handleAmountConfirm = async (inputAmount) => {
-        setAmountModalVisible(false);
+//     const handleTopUp = (selectedValue) => {
+//         setSelectedPaymentType(selectedValue);
+//         setModalVisible(false);
+//         setAmountModalVisible(true);
+//     };
 
-        try {
-            const numericAmount = parseFloat(inputAmount);
-            if (isNaN(numericAmount) || numericAmount <= 0) {
-                throw new Error('Invalid amount');
-            }
+//     const handleAmountConfirm = async (inputAmount) => {
+//         setAmountModalVisible(false);
 
-            const response = await walletService.submitPaymentAfterSelectingType(
-                numericAmount,
-                selectedPaymentType,
-                'test'
-            );
+//         try {
+//             const numericAmount = parseFloat(inputAmount);
+//             if (isNaN(numericAmount) || numericAmount <= 0) {
+//                 throw new Error('Invalid amount');
+//             }
 
-            setOutTradeNo(response.out_trade_no);
-            console.log('handleAmountConfirm outtradeno here,', response.out_trade_no);
-            console.log('just state outTradeNo here,', outTradeNo);
-            setIsExpectingPayment(true);
-            paymentInitiatedTime.current = new Date().getTime();
+//             const response = await walletService.submitPaymentAfterSelectingType(
+//                 numericAmount,
+//                 selectedPaymentType,
+//                 'test'
+//             );
 
-            const payUrl = response.pay_url;
-            const supported = await Linking.canOpenURL(payUrl);
+//             setOutTradeNo(response.out_trade_no);
+//             console.log('handleAmountConfirm outtradeno here,', response.out_trade_no);
+//             console.log('just state outTradeNo here,', outTradeNo);
+//             setIsExpectingPayment(true);
+//             paymentInitiatedTime.current = new Date().getTime();
 
-            if (supported) {
-                await Linking.openURL(payUrl);
-            } else {
-                throw new Error("Can't open payment URL");
-            }
-        } catch (error) {
-            console.error('Top-up failed:', error);
-            Alert.alert('Error', 'Failed to process top-up. Please try again.');
-        }
-    };
+//             const payUrl = response.pay_url;
+//             const supported = await Linking.canOpenURL(payUrl);
 
-    return (
-        <SafeAreaView className="flex-1 bg-white" edges={['top', 'right', 'left']}>
-            <ScrollView className="flex-1 ">
-                <View className="flex-1 mx-[5%]">
-                    <View style={{ marginTop: 25 }}>
-                        <Pressable
-                            onPress={() => {
-                                if (router.canGoBack()) {
-                                    router.back();
-                                } else {
-                                    router.replace('/accountMainPage');
-                                }
-                            }}
-                        >
-                            <CrossLogoSvg />
-                        </Pressable>
-                        <Text style={{ fontSize: 45, marginVertical: 25 }}>錢包</Text>
-                    </View>
-                    <View>
-                        <ImageBackground
-                            className="flex-col-reverse shadow-lg"
-                            style={{ height: 200 }}
-                            source={require('../../assets/walletCard1.png')}
-                            resizeMode="contain"
-                        >
-                            <View className="mx-[5%] pb-6">
-                                <Text className="text-white text-xl">餘額 (HKD)</Text>
-                                <View className="flex-row  items-center justify-between ">
-                                    <Text style={{ fontSize: 52 }} className=" text-white font-bold">
-                                        {loading ? (
-                                            <View className="items-center justify-center">
-                                                <ActivityIndicator />
-                                            </View>
-                                        ) : (
-                                            <>
-                                                <Text>$</Text>
-                                                {formatMoney(walletBalance)}
-                                            </>
-                                        )}
-                                    </Text>
-                                    <Pressable
-                                        className="rounded-2xl items-center justify-center p-3 px-5 pr-6 "
-                                        style={{
-                                            backgroundColor: 'rgba(231, 242, 248, 0.2)'
-                                        }}
-                                        onPress={() => {
-                                            console.log('增值');
-                                            setModalVisible(true);
-                                        }}
-                                    >
-                                        <Text className="text-white font-bold">+ 增值</Text>
-                                    </Pressable>
-                                </View>
-                            </View>
-                        </ImageBackground>
-                    </View>
-                    <View className="flex-row-reverse mt-2 mb-6">
-                        <Pressable
-                            onPress={() => {
-                                router.push({
-                                    pathname: '/paymentRecord',
-                                    params: { walletBalance: formatMoney(walletBalance) }
-                                });
-                            }}
-                        >
-                            <Text className="text-[#02677D] text-lg underline">付款記錄</Text>
-                        </Pressable>
-                    </View>
-                </View>
+//             if (supported) {
+//                 await Linking.openURL(payUrl);
+//             } else {
+//                 throw new Error("Can't open payment URL");
+//             }
+//         } catch (error) {
+//             console.error('Top-up failed:', error);
+//             Alert.alert('Error', 'Failed to process top-up. Please try again.');
+//         }
+//     };
 
-                <View className="w-full h-1 bg-[#DBE4E8]" />
+//     return (
+//         <SafeAreaView className="flex-1 bg-white" edges={['top', 'right', 'left']}>
+//             <ScrollView className="flex-1 ">
+//                 <View className="flex-1 mx-[5%]">
+//                     <View style={{ marginTop: 25 }}>
+//                         <Pressable
+//                             onPress={() => {
+//                                 if (router.canGoBack()) {
+//                                     router.back();
+//                                 } else {
+//                                     router.replace('/accountMainPage');
+//                                 }
+//                             }}
+//                         >
+//                             <CrossLogoSvg />
+//                         </Pressable>
+//                         <Text style={{ fontSize: 45, marginVertical: 25 }}>錢包</Text>
+//                     </View>
+//                     <View>
+//                         <ImageBackground
+//                             className="flex-col-reverse shadow-lg"
+//                             style={{ height: 200 }}
+//                             source={require('../../assets/walletCard1.png')}
+//                             resizeMode="contain"
+//                         >
+//                             <View className="mx-[5%] pb-6">
+//                                 <Text className="text-white text-xl">餘額 (HKD)</Text>
+//                                 <View className="flex-row  items-center justify-between ">
+//                                     <Text style={{ fontSize: 52 }} className=" text-white font-bold">
+//                                         {loading ? (
+//                                             <View className="items-center justify-center">
+//                                                 <ActivityIndicator />
+//                                             </View>
+//                                         ) : (
+//                                             <>
+//                                                 <Text>$</Text>
+//                                                 {formatMoney(walletBalance)}
+//                                             </>
+//                                         )}
+//                                     </Text>
+//                                     <Pressable
+//                                         className="rounded-2xl items-center justify-center p-3 px-5 pr-6 "
+//                                         style={{
+//                                             backgroundColor: 'rgba(231, 242, 248, 0.2)'
+//                                         }}
+//                                         onPress={() => {
+//                                             console.log('增值');
+//                                             setModalVisible(true);
+//                                         }}
+//                                     >
+//                                         <Text className="text-white font-bold">+ 增值</Text>
+//                                     </Pressable>
+//                                 </View>
+//                             </View>
+//                         </ImageBackground>
+//                     </View>
+//                     <View className="flex-row-reverse mt-2 mb-6">
+//                         <Pressable
+//                             onPress={() => {
+//                                 router.push({
+//                                     pathname: '/paymentRecord',
+//                                     params: { walletBalance: formatMoney(walletBalance) }
+//                                 });
+//                             }}
+//                         >
+//                             <Text className="text-[#02677D] text-lg underline">付款記錄</Text>
+//                         </Pressable>
+//                     </View>
+//                 </View>
 
-                <View className="flex-row justify-between mx-[5%] pt-6 pb-3">
-                    <Text className="text-xl">優惠券</Text>
-                    <Pressable onPress={() => router.push('couponPage')}>
-                        <Text className="text-xl text-[#888888]">顯示所有</Text>
-                    </Pressable>
-                </View>
+//                 <View className="w-full h-1 bg-[#DBE4E8]" />
 
-                <View className="flex-1 flex-col mx-[5%]">
-                    {loading ? (
-                        <View className="items-center justify-center">
-                            <ActivityIndicator />
-                        </View>
-                    ) : (
-                        <View>
-                            {coupons
-                                .filter(
-                                    (coupon) =>
-                                        coupon.is_consumed === false && new Date(coupon.expire_date) > new Date()
-                                )
-                                .slice(0, 2)
-                                .map((coupon, index) => (
-                                    <IndividualCouponComponent
-                                        key={index}
-                                        title={coupon.name}
-                                        price={coupon.amount}
-                                        detail={coupon.description}
-                                        date={formatCouponDate(coupon.expire_date)}
-                                    />
-                                ))}
-                        </View>
-                    )}
-                </View>
-            </ScrollView>
-            <TopUpModal
-                visible={modalVisible}
-                onClose={() => setModalVisible(false)}
-                onSelect={handleTopUp}
-                paymentOptions={paymentType}
-            />
-            <AmountInputModal
-                visible={amountModalVisible}
-                onClose={() => setAmountModalVisible(false)}
-                onConfirm={handleAmountConfirm}
-            />
-        </SafeAreaView>
-    );
-};
+//                 <View className="flex-row justify-between mx-[5%] pt-6 pb-3">
+//                     <Text className="text-xl">優惠券</Text>
+//                     <Pressable onPress={() => router.push('couponPage')}>
+//                         <Text className="text-xl text-[#888888]">顯示所有</Text>
+//                     </Pressable>
+//                 </View>
 
-export default WalletPageComponent;
+//                 <View className="flex-1 flex-col mx-[5%]">
+//                     {loading ? (
+//                         <View className="items-center justify-center">
+//                             <ActivityIndicator />
+//                         </View>
+//                     ) : (
+//                         <View>
+//                             {coupons
+//                                 .filter(
+//                                     (coupon) =>
+//                                         coupon.is_consumed === false && new Date(coupon.expire_date) > new Date()
+//                                 )
+//                                 .slice(0, 2)
+//                                 .map((coupon, index) => (
+//                                     <IndividualCouponComponent
+//                                         key={index}
+//                                         title={coupon.name}
+//                                         price={coupon.amount}
+//                                         detail={coupon.description}
+//                                         date={formatCouponDate(coupon.expire_date)}
+//                                     />
+//                                 ))}
+//                         </View>
+//                     )}
+//                 </View>
+//             </ScrollView>
+//             <TopUpModal
+//                 visible={modalVisible}
+//                 onClose={() => setModalVisible(false)}
+//                 onSelect={handleTopUp}
+//                 paymentOptions={paymentType}
+//             />
+//             <AmountInputModal
+//                 visible={amountModalVisible}
+//                 onClose={() => setAmountModalVisible(false)}
+//                 onConfirm={handleAmountConfirm}
+//             />
+//         </SafeAreaView>
+//     );
+// };
+
+// export default WalletPageComponent;
 
 //////BELOW uses QFPay 的托管收银台页面 to 增值
 //////BELOW uses QFPay 的托管收银台页面 to 增值
@@ -498,461 +498,464 @@ export default WalletPageComponent;
 //////BELOW uses QFPay 的托管收银台页面 to 增值
 //////BELOW uses QFPay 的托管收银台页面 to 增值
 
-// import {
-//     View,
-//     Image,
-//     Text,
-//     ScrollView,
-//     AppState,
-//     Pressable,
-//     ImageBackground,
-//     ActivityIndicator,
-//     Modal,
-//     Alert,
-//     TextInput,
-//     Linking
-// } from 'react-native';
-// import { SafeAreaView } from 'react-native-safe-area-context';
-// import { router } from 'expo-router';
-// import { CrossLogoSvg } from '../global/SVG';
-// import { useEffect, useRef, useState } from 'react';
-// import { walletService } from '../../service/walletService';
-// import UnionPayImage from '../../assets/unionpay.png';
-// import PayMeImage from '../../assets/payme.png';
-// import { formatCouponDate, formatDate } from '../../util/lib';
-// import { set } from 'date-fns';
-// import { reloadAppAsync } from 'expo';
-// import sha256 from 'crypto-js/sha256';
-
-// const AmountInputModal = ({ visible, onClose, onConfirm }) => {
-//     const [inputAmount, setInputAmount] = useState('');
+import {
+    View,
+    Image,
+    Text,
+    ScrollView,
+    AppState,
+    Pressable,
+    ImageBackground,
+    ActivityIndicator,
+    Modal,
+    Alert,
+    TextInput,
+    Linking
+} from 'react-native';
+import { SafeAreaView } from 'react-native-safe-area-context';
+import { router } from 'expo-router';
+import { CrossLogoSvg } from '../global/SVG';
+import { useEffect, useRef, useState } from 'react';
+import { walletService } from '../../service/walletService';
+import UnionPayImage from '../../assets/unionpay.png';
+import PayMeImage from '../../assets/payme.png';
+import { formatCouponDate, formatDate } from '../../util/lib';
+import { set } from 'date-fns';
+import { reloadAppAsync } from 'expo';
+import sha256 from 'crypto-js/sha256';
 
-//     return (
-//         <Modal animationType="fade" transparent={true} visible={visible} onRequestClose={onClose}>
-//             <View
-//                 style={{
-//                     flex: 1,
-//                     justifyContent: 'center',
-//                     alignItems: 'center',
-//                     backgroundColor: 'rgba(0,0,0,0.5)'
-//                 }}
-//             >
-//                 <View
-//                     style={{
-//                         backgroundColor: 'white',
-//                         padding: 20,
-//                         borderRadius: 10,
-//                         width: '80%'
-//                     }}
-//                 >
-//                     <Text style={{ fontSize: 20, marginBottom: 20 }}>輸入增值金額</Text>
-//                     <TextInput
-//                         style={{
-//                             borderWidth: 1,
-//                             borderColor: '#ccc',
-//                             borderRadius: 5,
-//                             padding: 10,
-//                             marginBottom: 20,
-//                             fontSize: 18
-//                         }}
-//                         keyboardType="numeric"
-//                         placeholder="輸入金額"
-//                         value={inputAmount}
-//                         onChangeText={setInputAmount}
-//                     />
-//                     <Pressable
-//                         onPress={() => onConfirm(inputAmount)}
-//                         style={{
-//                             backgroundColor: '#02677D',
-//                             padding: 10,
-//                             borderRadius: 5,
-//                             alignItems: 'center'
-//                         }}
-//                     >
-//                         <Text style={{ color: 'white', fontSize: 18 }}>確認</Text>
-//                     </Pressable>
-//                     <Pressable onPress={onClose} style={{ padding: 10, alignItems: 'center', marginTop: 10 }}>
-//                         <Text style={{ color: 'red' }}>取消</Text>
-//                     </Pressable>
-//                 </View>
-//             </View>
-//         </Modal>
-//     );
-// };
+const AmountInputModal = ({ visible, onClose, onConfirm }) => {
+    const [inputAmount, setInputAmount] = useState('');
 
-// export const IndividualCouponComponent = ({
-//     title,
-//     price,
-//     detail,
-//     date
-// }: {
-//     title: string;
-//     price: string;
-//     detail: string;
-//     date: string;
-// }) => {
-//     return (
-//         <Pressable onPress={() => console.log('abc')}>
-//             <View className="bg-[#e7f2f8] h-[124px]  rounded-xl flex-row mb-3">
-//                 <View className="bg-white mx-3 my-3 w-[28%] rounded-xl">
-//                     <View className="flex-row justify-center items-center pr-4 pt-4 ">
-//                         <Text className="color-[#02677d] text-2xl pl-2 pr-1">$</Text>
-//                         <Text className="color-[#02677d] text-3xl font-bold" adjustsFontSizeToFit={true}>
-//                             {price}
-//                         </Text>
-//                     </View>
-//                     <View className="items-center justify-center">
-//                         <Text className="text-base mt-1">{title}</Text>
-//                     </View>
-//                 </View>
+    return (
+        <Modal animationType="fade" transparent={true} visible={visible} onRequestClose={onClose}>
+            <View
+                style={{
+                    flex: 1,
+                    justifyContent: 'center',
+                    alignItems: 'center',
+                    backgroundColor: 'rgba(0,0,0,0.5)'
+                }}
+            >
+                <View
+                    style={{
+                        backgroundColor: 'white',
+                        padding: 20,
+                        borderRadius: 10,
+                        width: '80%'
+                    }}
+                >
+                    <Text style={{ fontSize: 20, marginBottom: 20 }}>輸入增值金額</Text>
+                    <TextInput
+                        style={{
+                            borderWidth: 1,
+                            borderColor: '#ccc',
+                            borderRadius: 5,
+                            padding: 10,
+                            marginBottom: 20,
+                            fontSize: 18
+                        }}
+                        keyboardType="numeric"
+                        placeholder="輸入金額"
+                        value={inputAmount}
+                        onChangeText={setInputAmount}
+                    />
+                    <Pressable
+                        onPress={() => onConfirm(inputAmount)}
+                        style={{
+                            backgroundColor: '#02677D',
+                            padding: 10,
+                            borderRadius: 5,
+                            alignItems: 'center'
+                        }}
+                    >
+                        <Text style={{ color: 'white', fontSize: 18 }}>確認</Text>
+                    </Pressable>
+                    <Pressable onPress={onClose} style={{ padding: 10, alignItems: 'center', marginTop: 10 }}>
+                        <Text style={{ color: 'red' }}>取消</Text>
+                    </Pressable>
+                </View>
+            </View>
+        </Modal>
+    );
+};
 
-//                 {/* //dash line */}
-//                 <View style={{ overflow: 'hidden' }}>
-//                     <View
-//                         style={{
-//                             borderStyle: 'dashed',
-//                             borderWidth: 1,
-//                             borderColor: '#CCCCCC',
-//                             margin: -1,
-//                             width: 0,
-//                             marginRight: 0,
-//                             height: '100%'
-//                         }}
-//                     >
-//                         <View style={{ height: 60 }}></View>
-//                     </View>
-//                 </View>
+export const IndividualCouponComponent = ({
+    title,
+    price,
+    detail,
+    date
+}: {
+    title: string;
+    price: string;
+    detail: string;
+    date: string;
+}) => {
+    return (
+        <Pressable onPress={() => console.log('abc')}>
+            <View className="bg-[#e7f2f8] h-[124px]  rounded-xl flex-row mb-3">
+                <View className="bg-white mx-3 my-3 w-[28%] rounded-xl">
+                    <View className="flex-row justify-center items-center pr-4 pt-4 ">
+                        <Text className="color-[#02677d] text-2xl pl-2 pr-1">$</Text>
+                        <Text className="color-[#02677d] text-3xl font-bold" adjustsFontSizeToFit={true}>
+                            {price}
+                        </Text>
+                    </View>
+                    <View className="items-center justify-center">
+                        <Text className="text-base mt-1">{title}</Text>
+                    </View>
+                </View>
 
-//                 <View className="flex-col flex-1  m-[5%] justify-center ">
-//                     <Text className="text-lg">{title}</Text>
-//                     <Text className="color-[#888888] text-sm">{detail}</Text>
-//                     <View className="flex-row items-center ">
-//                         <Text className="text-base">有效期 </Text>
-//                         <Text className="text-base font-bold text-[#02677d]">{date}</Text>
-//                     </View>
-//                 </View>
-//             </View>
-//         </Pressable>
-//     );
-// };
+                {/* //dash line */}
+                <View style={{ overflow: 'hidden' }}>
+                    <View
+                        style={{
+                            borderStyle: 'dashed',
+                            borderWidth: 1,
+                            borderColor: '#CCCCCC',
+                            margin: -1,
+                            width: 0,
+                            marginRight: 0,
+                            height: '100%'
+                        }}
+                    >
+                        <View style={{ height: 60 }}></View>
+                    </View>
+                </View>
 
-// const WalletPageComponent = () => {
-//     const [walletBalance, setWalletBalance] = useState<string | null>(null);
-//     const [loading, setLoading] = useState<boolean>(false);
-//     const [modalVisible, setModalVisible] = useState(false);
-//     const [coupons, setCoupons] = useState([]);
-//     const [paymentType, setPaymentType] = useState({});
-//     const [userID, setUserID] = useState('');
-//     const [selectedPaymentType, setSelectedPaymentType] = useState<string | null>(null);
-//     const [amount, setAmount] = useState<number>(0);
-//     const [amountModalVisible, setAmountModalVisible] = useState(false);
-//     const [outTradeNo, setOutTradeNo] = useState('');
-//     const PAYMENT_CHECK_TIMEOUT = 5 * 60 * 1000; // 5 minutes in milliseconds
-//     const [paymentStatus, setPaymentStatus] = useState(null);
-//     const [isExpectingPayment, setIsExpectingPayment] = useState(false);
-//     const appState = useRef(AppState.currentState);
-//     const paymentInitiatedTime = useRef(null);
+                <View className="flex-col flex-1  m-[5%] justify-center ">
+                    <Text className="text-lg">{title}</Text>
+                    <Text className="color-[#888888] text-sm">{detail}</Text>
+                    <View className="flex-row items-center ">
+                        <Text className="text-base">有效期 </Text>
+                        <Text className="text-base font-bold text-[#02677d]">{date}</Text>
+                    </View>
+                </View>
+            </View>
+        </Pressable>
+    );
+};
 
-//     useEffect(() => {
-//         const subscription = AppState.addEventListener('change', (nextAppState) => {
-//             if (
-//                 appState.current.match(/inactive|background/) &&
-//                 nextAppState === 'active' &&
-//                 isExpectingPayment &&
-//                 // outTradeNo &&
-//                 paymentInitiatedTime.current
-//             ) {
-//                 const currentTime = new Date().getTime();
-//                 if (currentTime - paymentInitiatedTime.current < PAYMENT_CHECK_TIMEOUT) {
-//                     checkPaymentStatus();
-//                 } else {
-//                     // Payment check timeout reached
-//                     setIsExpectingPayment(false);
-//                     setOutTradeNo('');
-//                     paymentInitiatedTime.current = null;
-//                     Alert.alert(
-//                         'Payment Timeout',
-//                         'The payment status check has timed out. Please check your payment history.'
-//                     );
-//                 }
-//             }
-//             appState.current = nextAppState;
-//         });
+const WalletPageComponent = () => {
+    const [walletBalance, setWalletBalance] = useState<string | null>(null);
+    const [loading, setLoading] = useState<boolean>(false);
+    const [modalVisible, setModalVisible] = useState(false);
+    const [coupons, setCoupons] = useState([]);
+    const [paymentType, setPaymentType] = useState({});
+    const [userID, setUserID] = useState('');
+    const [selectedPaymentType, setSelectedPaymentType] = useState<string | null>(null);
+    const [amount, setAmount] = useState<number>(0);
+    const [amountModalVisible, setAmountModalVisible] = useState(false);
+    const [outTradeNo, setOutTradeNo] = useState('');
+    const PAYMENT_CHECK_TIMEOUT = 5 * 60 * 1000; // 5 minutes in milliseconds
+    const [paymentStatus, setPaymentStatus] = useState(null);
+    const [isExpectingPayment, setIsExpectingPayment] = useState(false);
+    const appState = useRef(AppState.currentState);
+    const paymentInitiatedTime = useRef(null);
 
-//         return () => {
-//             subscription.remove();
-//         };
-//     }, [outTradeNo, isExpectingPayment]);
+    useEffect(() => {
+        const subscription = AppState.addEventListener('change', (nextAppState) => {
+            if (
+                appState.current.match(/inactive|background/) &&
+                nextAppState === 'active' &&
+                isExpectingPayment &&
+                // outTradeNo &&
+                paymentInitiatedTime.current
+            ) {
+                const currentTime = new Date().getTime();
+                if (currentTime - paymentInitiatedTime.current < PAYMENT_CHECK_TIMEOUT) {
+                    checkPaymentStatus();
+                } else {
+                    // Payment check timeout reached
+                    setIsExpectingPayment(false);
+                    setOutTradeNo('');
+                    paymentInitiatedTime.current = null;
+                    Alert.alert(
+                        'Payment Timeout',
+                        'The payment status check has timed out. Please check your payment history.'
+                    );
+                }
+            }
+            appState.current = nextAppState;
+        });
 
-//     const checkPaymentStatus = async () => {
-//         try {
-//             const result = await walletService.checkPaymentStatus(outTradeNo);
-//             setPaymentStatus(result);
-//             console.log('checkPaymentStatus from walletPageComponent', result);
-//             if (result) {
-//                 // Payment successful
-//                 Alert.alert('Success', 'Payment was successful!', [
-//                     {
-//                         text: 'OK',
-//                         onPress: async () => {
-//                             const wallet = await walletService.getWalletBalance();
-//                             setWalletBalance(wallet);
-//                             console.log('new wallet:', wallet);
-//                         }
-//                     }
-//                 ]);
-//             } else {
-//                 Alert.alert('Payment Failed', 'Payment was not successful. Please try again.');
-//             }
-//             setIsExpectingPayment(false);
-//             setOutTradeNo('');
-//             paymentInitiatedTime.current = null;
-//         } catch (error) {
-//             console.error('Failed to check payment status:', error);
-//             Alert.alert('Error', 'Failed to check payment status. Please check your payment history.');
-//         }
-//     };
+        return () => {
+            subscription.remove();
+        };
+    }, [outTradeNo, isExpectingPayment]);
 
-//     useEffect(() => {
-//         const fetchData = async () => {
-//             try {
-//                 setLoading(true);
-//                 const info = await walletService.getCustomerInfo();
+    const checkPaymentStatus = async () => {
+        try {
+            console.log('what is the outTradeNo?? ', outTradeNo);
+            const result = await walletService.checkPaymentStatus(outTradeNo);
+            setPaymentStatus(result);
+            console.log('checkPaymentStatus from walletPageComponent', result);
+            if (result) {
+                // Payment successful
+                Alert.alert('Success', 'Payment was successful!', [
+                    {
+                        text: 'OK',
+                        onPress: async () => {
+                            const wallet = await walletService.getWalletBalance();
+                            setWalletBalance(wallet);
+                            console.log('new wallet:', wallet);
+                        }
+                    }
+                ]);
+            } else {
+                Alert.alert('Payment Failed', 'Payment was not successful. Please try again.');
+            }
+            setIsExpectingPayment(false);
+            setOutTradeNo('');
+            paymentInitiatedTime.current = null;
+        } catch (error) {
+            console.error('Failed to check payment status:', error);
+            Alert.alert('Error', 'Failed to check payment status. Please check your payment history.');
+        }
+    };
 
-//                 const wallet = await walletService.getWalletBalance();
-//                 console.log(wallet);
-//                 setUserID(info.id);
-//                 setWalletBalance(wallet);
-//                 setCoupons(coupon);
-//             } catch (error) {
-//                 console.log(error);
-//             } finally {
-//                 setLoading(false);
-//             }
-//         };
+    useEffect(() => {
+        const fetchData = async () => {
+            try {
+                setLoading(true);
+                const info = await walletService.getCustomerInfo();
 
-//         fetchData();
-//     }, []);
+                const wallet = await walletService.getWalletBalance();
+                console.log(wallet);
+                setUserID(info.id);
+                setWalletBalance(wallet);
+                setCoupons(coupon);
+            } catch (error) {
+                console.log(error);
+            } finally {
+                setLoading(false);
+            }
+        };
 
-//     const formatMoney = (amount: any) => {
-//         if (typeof amount !== 'number') {
-//             amount = Number(amount);
-//         }
-//         return amount.toLocaleString('en-US');
-//     };
-//     const filterPaymentOptions = (options, allowedKeys) => {
-//         return Object.fromEntries(Object.entries(options).filter(([key]) => allowedKeys.includes(key)));
-//     };
+        fetchData();
+    }, []);
+
+    const formatMoney = (amount: any) => {
+        if (typeof amount !== 'number') {
+            amount = Number(amount);
+        }
+        return amount.toLocaleString('en-US');
+    };
+    const filterPaymentOptions = (options, allowedKeys) => {
+        return Object.fromEntries(Object.entries(options).filter(([key]) => allowedKeys.includes(key)));
+    };
 
-//     function formatTime(utcTimeString) {
-//         // Parse the UTC time string
-//         const date = new Date(utcTimeString);
+    function formatTime(utcTimeString) {
+        // Parse the UTC time string
+        const date = new Date(utcTimeString);
 
-//         // Add 8 hours
-//         date.setHours(date.getHours());
+        // Add 8 hours
+        date.setHours(date.getHours());
 
-//         // Format the date
-//         const year = date.getFullYear();
-//         const month = String(date.getMonth() + 1).padStart(2, '0');
-//         const day = String(date.getDate()).padStart(2, '0');
-//         const hours = String(date.getHours()).padStart(2, '0');
-//         const minutes = String(date.getMinutes()).padStart(2, '0');
-//         const seconds = String(date.getSeconds()).padStart(2, '0');
+        // Format the date
+        const year = date.getFullYear();
+        const month = String(date.getMonth() + 1).padStart(2, '0');
+        const day = String(date.getDate()).padStart(2, '0');
+        const hours = String(date.getHours()).padStart(2, '0');
+        const minutes = String(date.getMinutes()).padStart(2, '0');
+        const seconds = String(date.getSeconds()).padStart(2, '0');
 
-//         // Return the formatted string
-//         return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-//     }
+        // Return the formatted string
+        return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+    }
 
-//     useEffect(() => {
-//         const fetchPaymentType = async () => {
-//             const response = await walletService.selectPaymentType();
-//             // console.log('response', response);
-//             const filteredPaymentTypes = filterPaymentOptions(response, ['union_pay_wap_payment', 'payme_wap_payment']);
-//             setPaymentType(filteredPaymentTypes);
-//         };
-//         fetchPaymentType();
-//     }, []);
+    useEffect(() => {
+        const fetchPaymentType = async () => {
+            const response = await walletService.selectPaymentType();
+            // console.log('response', response);
+            const filteredPaymentTypes = filterPaymentOptions(response, ['union_pay_wap_payment', 'payme_wap_payment']);
+            setPaymentType(filteredPaymentTypes);
+        };
+        fetchPaymentType();
+    }, []);
 
-//     const handleAmountConfirm = async (inputAmount) => {
-//         setAmountModalVisible(false);
-//         try {
-//             const response = await walletService.getOutTradeNo();
-//             if (response) {
-//                 setIsExpectingPayment(true);
-//                 paymentInitiatedTime.current = new Date().getTime();
-//                 const now = new Date();
-//                 const formattedTime = formatTime(now);
-//                 console.log(formattedTime);
-//                 const out_trade_no = response;
-
-//                 let amount = parseInt(inputAmount, 10) * 100;
-//                 const origin = 'https://openapi-hk.qfapi.com/checkstand/#/?';
-//                 const obj = {
-//                     appcode: process.env.QFPAY_CODE,
-//                     goods_name: 'Crazy Charge 錢包增值',
-//                     out_trade_no: out_trade_no,
-//                     paysource: 'crazycharge_checkout',
-//                     return_url: 'https://www.google.com',
-//                     failed_url: 'https://www.google.com',
-//                     notify_url: 'https://api.crazycharge.com.hk/api/v1/clients/qfpay/webhook',
-//                     sign_type: 'sha256',
-//                     txamt: amount,
-//                     txcurrcd: 'HKD',
-//                     txdtm: formattedTime
-//                 };
-
-//                 const paramStringify = (json, flag?) => {
-//                     let str = '';
-//                     let keysArr = Object.keys(json);
-//                     keysArr.sort().forEach((val) => {
-//                         if (!json[val]) return;
-//                         str += `${val}=${flag ? encodeURIComponent(json[val]) : json[val]}&`;
-//                     });
-//                     return str.slice(0, -1);
-//                 };
-
-//                 const api_key = process.env.QFPAY_KEY;
-//                 const params = paramStringify(obj);
-//                 const sign = sha256(`${params}${api_key}`).toString();
-//                 const url = `${origin}${paramStringify(obj, true)}&sign=${sign}`;
-
-//                 try {
-//                     const supported = await Linking.canOpenURL(url);
-//                     if (supported) {
-//                         await Linking.openURL(url);
-//                     } else {
-//                         Alert.alert('錯誤', '請稍後再試');
-//                     }
-//                 } catch (error) {
-//                     console.error('Top-up failed:', error);
-//                     Alert.alert('Error', 'Failed to process top-up. Please try again.');
-//                 }
-//             } else {
-//                 console.log('no');
-//             }
-//         } catch (error) {
-//             console.log(error);
-//         }
-//     };
+    const handleAmountConfirm = async (inputAmount) => {
+        setAmountModalVisible(false);
+        try {
+            const response = await walletService.getOutTradeNo();
+            console.log('do i have outtrade no??', response);
+            if (response) {
+                setOutTradeNo(response);
+                setIsExpectingPayment(true);
+                paymentInitiatedTime.current = new Date().getTime();
+                const now = new Date();
+                const formattedTime = formatTime(now);
+                console.log(formattedTime);
+                const out_trade_no = response;
+
+                let amount = parseInt(inputAmount, 10) * 100;
+                const origin = 'https://openapi-hk.qfapi.com/checkstand/#/?';
+                const obj = {
+                    appcode: process.env.QFPAY_CODE,
+                    goods_name: 'Crazy Charge 錢包增值',
+                    out_trade_no: out_trade_no,
+                    paysource: 'crazycharge_checkout',
+                    return_url: 'https://www.google.com',
+                    failed_url: 'https://www.google.com',
+                    notify_url: 'https://api.crazycharge.com.hk/api/v1/clients/qfpay/webhook',
+                    sign_type: 'sha256',
+                    txamt: amount,
+                    txcurrcd: 'HKD',
+                    txdtm: formattedTime
+                };
+
+                const paramStringify = (json, flag?) => {
+                    let str = '';
+                    let keysArr = Object.keys(json);
+                    keysArr.sort().forEach((val) => {
+                        if (!json[val]) return;
+                        str += `${val}=${flag ? encodeURIComponent(json[val]) : json[val]}&`;
+                    });
+                    return str.slice(0, -1);
+                };
+
+                const api_key = process.env.QFPAY_KEY;
+                const params = paramStringify(obj);
+                const sign = sha256(`${params}${api_key}`).toString();
+                const url = `${origin}${paramStringify(obj, true)}&sign=${sign}`;
+
+                try {
+                    const supported = await Linking.canOpenURL(url);
+                    if (supported) {
+                        await Linking.openURL(url);
+                    } else {
+                        Alert.alert('錯誤', '請稍後再試');
+                    }
+                } catch (error) {
+                    console.error('Top-up failed:', error);
+                    Alert.alert('Error', 'Failed to process top-up. Please try again.');
+                }
+            } else {
+                console.log('no');
+            }
+        } catch (error) {
+            console.log(error);
+        }
+    };
 
-//     return (
-//         <SafeAreaView className="flex-1 bg-white" edges={['top', 'right', 'left']}>
-//             <ScrollView className="flex-1 ">
-//                 <View className="flex-1 mx-[5%]">
-//                     <View style={{ marginTop: 25 }}>
-//                         <Pressable
-//                             onPress={() => {
-//                                 if (router.canGoBack()) {
-//                                     router.back();
-//                                 } else {
-//                                     router.replace('/accountMainPage');
-//                                 }
-//                             }}
-//                         >
-//                             <CrossLogoSvg />
-//                         </Pressable>
-//                         <Text style={{ fontSize: 45, marginVertical: 25 }}>錢包</Text>
-//                     </View>
-//                     <View>
-//                         <ImageBackground
-//                             className="flex-col-reverse shadow-lg"
-//                             style={{ height: 200 }}
-//                             source={require('../../assets/walletCard1.png')}
-//                             resizeMode="contain"
-//                         >
-//                             <View className="mx-[5%] pb-6">
-//                                 <Text className="text-white text-xl">餘額 (HKD)</Text>
-//                                 <View className="flex-row  items-center justify-between ">
-//                                     <Text style={{ fontSize: 52 }} className=" text-white font-bold">
-//                                         {loading ? (
-//                                             <View className="items-center justify-center">
-//                                                 <ActivityIndicator />
-//                                             </View>
-//                                         ) : (
-//                                             <>
-//                                                 <Text>$</Text>
-//                                                 {formatMoney(walletBalance)}
-//                                             </>
-//                                         )}
-//                                     </Text>
-//                                     <Pressable
-//                                         className="rounded-2xl items-center justify-center p-3 px-5 pr-6 "
-//                                         style={{
-//                                             backgroundColor: 'rgba(231, 242, 248, 0.2)'
-//                                         }}
-//                                         onPress={() => {
-//                                             console.log('增值');
-//                                             setAmountModalVisible(true);
-//                                         }}
-//                                     >
-//                                         <Text className="text-white font-bold">+ 增值</Text>
-//                                     </Pressable>
-//                                 </View>
-//                             </View>
-//                         </ImageBackground>
-//                     </View>
-//                     <View className="flex-row-reverse mt-2 mb-6">
-//                         <Pressable
-//                             onPress={() => {
-//                                 router.push({
-//                                     pathname: '/paymentRecord',
-//                                     params: { walletBalance: formatMoney(walletBalance) }
-//                                 });
-//                             }}
-//                         >
-//                             <Text className="text-[#02677D] text-lg underline">付款記錄</Text>
-//                         </Pressable>
-//                     </View>
-//                 </View>
+    return (
+        <SafeAreaView className="flex-1 bg-white" edges={['top', 'right', 'left']}>
+            <ScrollView className="flex-1 ">
+                <View className="flex-1 mx-[5%]">
+                    <View style={{ marginTop: 25 }}>
+                        <Pressable
+                            onPress={() => {
+                                if (router.canGoBack()) {
+                                    router.back();
+                                } else {
+                                    router.replace('/accountMainPage');
+                                }
+                            }}
+                        >
+                            <CrossLogoSvg />
+                        </Pressable>
+                        <Text style={{ fontSize: 45, marginVertical: 25 }}>錢包</Text>
+                    </View>
+                    <View>
+                        <ImageBackground
+                            className="flex-col-reverse shadow-lg"
+                            style={{ height: 200 }}
+                            source={require('../../assets/walletCard1.png')}
+                            resizeMode="contain"
+                        >
+                            <View className="mx-[5%] pb-6">
+                                <Text className="text-white text-xl">餘額 (HKD)</Text>
+                                <View className="flex-row  items-center justify-between ">
+                                    <Text style={{ fontSize: 52 }} className=" text-white font-bold">
+                                        {loading ? (
+                                            <View className="items-center justify-center">
+                                                <ActivityIndicator />
+                                            </View>
+                                        ) : (
+                                            <>
+                                                <Text>$</Text>
+                                                {formatMoney(walletBalance)}
+                                            </>
+                                        )}
+                                    </Text>
+                                    <Pressable
+                                        className="rounded-2xl items-center justify-center p-3 px-5 pr-6 "
+                                        style={{
+                                            backgroundColor: 'rgba(231, 242, 248, 0.2)'
+                                        }}
+                                        onPress={() => {
+                                            console.log('增值');
+                                            setAmountModalVisible(true);
+                                        }}
+                                    >
+                                        <Text className="text-white font-bold">+ 增值</Text>
+                                    </Pressable>
+                                </View>
+                            </View>
+                        </ImageBackground>
+                    </View>
+                    <View className="flex-row-reverse mt-2 mb-6">
+                        <Pressable
+                            onPress={() => {
+                                router.push({
+                                    pathname: '/paymentRecord',
+                                    params: { walletBalance: formatMoney(walletBalance) }
+                                });
+                            }}
+                        >
+                            <Text className="text-[#02677D] text-lg underline">付款記錄</Text>
+                        </Pressable>
+                    </View>
+                </View>
 
-//                 <View className="w-full h-1 bg-[#DBE4E8]" />
+                <View className="w-full h-1 bg-[#DBE4E8]" />
 
-//                 <View className="flex-row justify-between mx-[5%] pt-6 pb-3">
-//                     <Text className="text-xl">優惠券</Text>
-//                     <Pressable onPress={() => router.push('couponPage')}>
-//                         <Text className="text-xl text-[#888888]">顯示所有</Text>
-//                     </Pressable>
-//                 </View>
+                <View className="flex-row justify-between mx-[5%] pt-6 pb-3">
+                    <Text className="text-xl">優惠券</Text>
+                    <Pressable onPress={() => router.push('couponPage')}>
+                        <Text className="text-xl text-[#888888]">顯示所有</Text>
+                    </Pressable>
+                </View>
 
-//                 <View className="flex-1 flex-col mx-[5%]">
-//                     {loading ? (
-//                         <View className="items-center justify-center">
-//                             <ActivityIndicator />
-//                         </View>
-//                     ) : (
-//                         <View>
-//                             {coupons
-//                                 .filter(
-//                                     (coupon) =>
-//                                         coupon.is_consumed === false && new Date(coupon.expire_date) > new Date()
-//                                 )
-//                                 .slice(0, 2)
-//                                 .map((coupon, index) => (
-//                                     <IndividualCouponComponent
-//                                         key={index}
-//                                         title={coupon.name}
-//                                         price={coupon.amount}
-//                                         detail={coupon.description}
-//                                         date={formatCouponDate(coupon.expire_date)}
-//                                     />
-//                                 ))}
-//                         </View>
-//                     )}
-//                 </View>
-//             </ScrollView>
-//             {/* <TopUpModal
-//                 visible={modalVisible}
-//                 onClose={() => setModalVisible(false)}
-//                 onSelect={handleTopUp}
-//                 paymentOptions={paymentType}
-//             /> */}
-//             <AmountInputModal
-//                 visible={amountModalVisible}
-//                 onClose={() => setAmountModalVisible(false)}
-//                 onConfirm={handleAmountConfirm}
-//             />
-//         </SafeAreaView>
-//     );
-// };
+                <View className="flex-1 flex-col mx-[5%]">
+                    {loading ? (
+                        <View className="items-center justify-center">
+                            <ActivityIndicator />
+                        </View>
+                    ) : (
+                        <View>
+                            {coupons
+                                .filter(
+                                    (coupon) =>
+                                        coupon.is_consumed === false && new Date(coupon.expire_date) > new Date()
+                                )
+                                .slice(0, 2)
+                                .map((coupon, index) => (
+                                    <IndividualCouponComponent
+                                        key={index}
+                                        title={coupon.name}
+                                        price={coupon.amount}
+                                        detail={coupon.description}
+                                        date={formatCouponDate(coupon.expire_date)}
+                                    />
+                                ))}
+                        </View>
+                    )}
+                </View>
+            </ScrollView>
+            {/* <TopUpModal
+                visible={modalVisible}
+                onClose={() => setModalVisible(false)}
+                onSelect={handleTopUp}
+                paymentOptions={paymentType}
+            /> */}
+            <AmountInputModal
+                visible={amountModalVisible}
+                onClose={() => setAmountModalVisible(false)}
+                onConfirm={handleAmountConfirm}
+            />
+        </SafeAreaView>
+    );
+};
 
-// export default WalletPageComponent;
+export default WalletPageComponent;

+ 1 - 0
component/chargingPage/chargingPageComponent.tsx

@@ -110,6 +110,7 @@ const ChargingPageComponent = ({ data }) => {
                                     fontWeight: 300
                                 }}
                             >
+                                {/* 4852 */}
                                 {/* {onGoingChargingData ? `${onGoingChargingData.Soc} %` : 'Loading'} */}
                                 {`${reservationData.Soc}%`}
                                 <LoadingDots />