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'; import NoChargingOngoingPageComponent from '../../../../component/chargingPage/noChargingOngoingPageComponent'; import { useFocusEffect } from 'expo-router'; import ChargingHurryUpPageComponent from '../../../../component/chargingPage/chargingHurryUpPageComponent'; import FutureReservationPageComponent from '../../../../component/chargingPage/futureReservationPageComponent'; import ChargingFinishPageComponent from '../../../../component/chargingPage/chargingFinishPageComponent'; const fakeData = [ { createdAt: '2024-08-26T10:15:30.123Z', updatedAt: '2024-08-26T10:15:30.123Z', id: 'a1b2c3d4-e5f6-7890-abcd-1234567890ab', book_time: '2024-08-26T11:00:00.000Z', end_time: '2024-08-26T13:00:00.000Z', actual_start_time: '2024-08-26T11:05:23.456Z', actual_end_time: '2024-08-26T12:01:23.456Z', total_power: null, type: 'charging', penalty_fee: null, total_fee: 150, snapshot: '{"type":"charging","stationID":"2408261122116801000","connector":"101708260802474001","user":"user123-456-789","book_time":"2024-08-26T11:00:00.000Z","end_time":"2024-08-26T13:00:00.000Z","total_fee":150,"car":"car123-456-789"}', remark: null, promotion_name: null, promotion_msg: null, format_order_id: '730998640260820241015301234', Soc: 45, connector: { createdAt: '2024-08-01T09:00:00.000Z', updatedAt: '2024-08-26T10:00:00.000Z', id: 'conn123-456-789', ConnectorID: '101708260802474001', VoltageLowerLimits: 380, ConnectorType: 4, VoltageUpperLimits: 1000, NationalStandard: 2015, ConnectorName: 'A枪', Current: 250, Power: 180000, Status: 'charging', ParkStatus: 'occupied', LockStatus: 'locked', EquipmentID: { createdAt: '2024-08-01T09:00:00.000Z', updatedAt: '2024-08-26T10:00:00.000Z', id: 'equip123-456-789', EquipmentID: '1017082608024740', EquipmentLat: 22.310709, EquipmentLng: 114.22301, EquipmentType: 1, EquipmentName: '1桩', EquipmentModel: 'GCE-D180-Y-F', Power: 180000, StationID: { createdAt: '2024-08-01T09:00:00.000Z', updatedAt: '2024-08-26T10:00:00.000Z', id: '2408261122116801000', snapshot: '{"StationName":"CRAZY CHARGE (Example Street)","Address":"123 Example Street, Hong Kong"}', self_active_status_fk: 'active', business_hours_fk: '24/7', qr_code: 'qr_code_data', image: 'station_image_url', price: 3 } } }, user: { createdAt: '2024-01-01T00:00:00.000Z', updatedAt: '2024-08-26T10:00:00.000Z', id: 'user123-456-789', firstname: 'John', lastname: 'Doe', nickname: 'JD', email: 'john.doe@example.com', password: '$2b$10$hashedpasswordexample', phone: 12345678, ic_card: '0000001234567890', wallet: 5000, icon_url: 'user_icon_url', remark: null, address: '456 User Street, Hong Kong', status_fk: '1', gender: 'man', birthday: '1990/01/01', ic_car_id: null }, status: { id: '2', createdAt: '2024-07-16T14:58:40.630Z', updatedAt: '2024-07-16T14:58:40.630Z', description: 'charging' }, car: { createdAt: '2024-01-01T00:00:00.000Z', updatedAt: '2024-08-26T10:00:00.000Z', id: 'car123-456-789', license_plate: 'AB1234', car_brand: { createdAt: '2024-01-01T00:00:00.000Z', updatedAt: '2024-01-01T00:00:00.000Z', id: 'brand123-456-789', name: 'BWD', img_url: 'tesla_logo_url' }, car_type: { createdAt: '2024-01-01T00:00:00.000Z', updatedAt: '2024-01-01T00:00:00.000Z', id: 'type123-456-789', name: 'Model 3', capacitance: 75, capacitance_unit: 'kwh', type_image_url: 'model3_image_url' } } } ]; //*********************************************************************** //而家start time & end time 一樣就當Walk in, walkin 會改左d字眼在ChargingHurryUpPageComponent //如果以後scan qr code可選時間, ChargingHurryUp display 字眼個logic 就要改 //*********************************************************************** 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 { const now = new Date(); const response = await chargeStationService.fetchReservationHistories(); lastUpdateTimeRef.current = Date.now(); if (Object.keys(response).length === 0) { console.log('no reservation data'); setCurrentStatus('noReservation'); } else { // Check for recently finished reservations const finishedReservation = response.find((r) => { if (r.status.id === '8' && r.actual_end_time) { const endTime = new Date(r.actual_end_time); const timeDifference = now.getTime() - endTime.getTime(); return timeDifference <= 1 * 60 * 1000; // Within 1 minutes } return false; }); if (finishedReservation) { console.log('now', now); console.log('Finished reservation found:', finishedReservation); setCurrentStatus('finishReservation'); setData(finishedReservation); } else { // Existing checks for other reservation types const penaltyReservation = response.filter( (r) => r.actual_start_time != null && r.actual_end_time != null && r.connector.Status === 7 ); if (penaltyReservation.length > 0) { setCurrentStatus('penaltyReservation'); setData(penaltyReservation); } else { // Check for ongoing reservations (已插槍的預約) const onGoingReservation = response.filter( (r) => r.status.id === '7' && r.actual_end_time == null ); // console.log('onGoingReservation', onGoingReservation); if (onGoingReservation.length > 0) { setCurrentStatus('onGoingReservation'); setData(onGoingReservation); } else { // Check for recently passed reservations (仍未開始插槍充電的預約) const recentlyPassedReservations = response.filter((r) => { const bookTime = new Date(r.book_time); const fifteenMinutesAfterBookTime = new Date(bookTime.getTime() + 15 * 60 * 1000); const isWithin15MinutesAndStatus6 = now > bookTime && now <= fifteenMinutesAfterBookTime && r.status.id === '6'; return isWithin15MinutesAndStatus6; }); if (recentlyPassedReservations.length > 0) { console.log(' i am recentlyPassedReservation', recentlyPassedReservations); setCurrentStatus('recentlyPassedReservations'); setData(recentlyPassedReservations); } else { const futureReservation = response.filter((r) => { const bookTime = new Date(r.book_time); const fifteenMinutesAfterBookTime = new Date(bookTime.getTime() + 15 * 60 * 1000); return now < bookTime || (now > bookTime && now <= fifteenMinutesAfterBookTime); }); if (futureReservation.length > 0) { futureReservation.sort((a, b) => new Date(a.end_time) - new Date(b.end_time)); const closestReservation = futureReservation[0]; setCurrentStatus('futureReservation'); setData(closestReservation); } else { //if you are here, it means there are no future reservations (but there are past reservations) setCurrentStatus('noReservation'); } } } } } } } catch (error) { console.error('Error fetching reservation histories:', error); } finally { 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; const fetchData = async () => { try { await fetchReservationData(); } catch (error) { console.error('Error in useFocusEffect:', error); } }; fetchData(); // Cleanup function return () => { isActive = false; // Any additional cleanup logic can go here }; }, [fetchReservationData]) ); if (isLoading) { return ( ); } return ( {currentStatus === 'noReservation' && } {currentStatus === 'penaltyReservation' && } {currentStatus === 'onGoingReservation' && } {currentStatus === 'recentlyPassedReservations' && } {currentStatus === 'futureReservation' && } {currentStatus === 'finishReservation' && } ); }; export default ChargingPage; // const fetchReservationData = useCallback(async () => { // setIsLoading(true); // try { // const now = new Date(); // const response = await chargeStationService.fetchReservationHistories(); // //先睇有無預約 // if (Object.keys(response).length === 0) { // console.log('no reservation data'); // setCurrentStatus('noReservation'); // } else { // //二睇有無正在進行中 已插槍的預約 // const onGoingReservation = response.filter((r) => r.status.id === '7'); // if (onGoingReservation.length > 0) { // setCurrentStatus('onGoingReservation'); // setData(onGoingReservation); // } else { // //三睇有無正在進行中的預約但仍未開始插槍充電的預約 // //example: 訂單在10點開始, 現時為10點05分,用戶仍未插槍。 // const recentlyPassedReservations = response.filter((r) => { // const bookTime = new Date(r.book_time); // const fifteenMinutesAfterBookTime = new Date(bookTime.getTime() + 15 * 60 * 1000); // const isWithin15MinutesAndStatus6 = // now > bookTime && now <= fifteenMinutesAfterBookTime && r.status.id === '6'; // return isWithin15MinutesAndStatus6; // }); // if (recentlyPassedReservations.length > 0) { // console.log(' i am recentlyPassedReservation', recentlyPassedReservations); // setCurrentStatus('recentlyPassedReservations'); // setData(recentlyPassedReservations); // } else { // //睇未來最近一次的預約 // const futureReservation = response.filter((r) => { // const bookTime = new Date(r.book_time); // const fifteenMinutesAfterBookTime = new Date(bookTime.getTime() + 15 * 60 * 1000); // return now < bookTime || (now > bookTime && now <= fifteenMinutesAfterBookTime); // }); // if (futureReservation.length > 0) { // futureReservation.sort((a, b) => new Date(a.end_time) - new Date(b.end_time)); // const closestReservation = futureReservation[0]; // console.log('i am closest reservation', closestReservation); // setCurrentStatus('futureReservation'); // setData(closestReservation); // } // } // } // } // } catch (error) { // console.error('Error fetching reservation histories:', error); // } finally { // setIsLoading(false); // } // }, []);