import { View, Text, ActivityIndicator, AppState, ScrollView, RefreshControl } from 'react-native';
import React, { useCallback, useContext, 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';
import { AuthContext } from '../../../../context/AuthProvider';
//***********************************************************************
//而家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 { user } = useContext(AuthContext);
const [refreshing, setRefreshing] = useState(false);
const [refetchTrigger, setRefetchTrigger] = useState(0);
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) {
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) {
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
);
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) {
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.log('Error fetching reservation histordfsdfes:', error);
} finally {
setIsLoading(false);
}
}, []);
const onRefresh = useCallback(() => {
setRefreshing(true);
setRefetchTrigger((prev) => prev + 1);
// Simulate a delay to show the refresh indicator
setTimeout(() => {
setRefreshing(false);
fetchReservationData().finally(() => {
setRefreshing(false);
});
}, 1000);
}, []);
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;