import { View, Text, ScrollView, Pressable, StyleSheet, Image, Dimensions, ActivityIndicator } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { router } from 'expo-router'; import NormalButton from '../global/normal_button'; import { CheckMarkLogoSvg, DirectionLogoSvg, PreviousPageBlackSvg } from '../global/SVG'; import { ChargingStationTabView } from '../global/chargingStationTabView'; import ChooseCarForChargingRow from '../global/chooseCarForChargingRow'; import { useEffect, useState } from 'react'; import DropdownSelect from '../global/dropdown_select'; import { chargeStationService } from '../../service/chargeStationService'; const dummyDataChooseCarForCharging = [ { imageUrl: require('../../assets/car1.png'), VehicleName: 'TESLA - Model 3', isDefault: true }, { VehicleName: 'TESLA - Model Y', isDefault: false }, { imageUrl: require('../../assets/car1.png'), VehicleName: 'TESLA - Model X', isDefault: false }, { VehicleName: 'TESLA - Model 3', isDefault: false } ]; interface AccordionItemProps { title: string; children: React.ReactNode; isOpen: boolean; onToggle: () => void; isSelected: boolean; } const AccordionItem: React.FC = ({ title, children, isOpen, onToggle, isSelected }) => ( {title} {isOpen && {children}} ); const MakingBookingPageComponent = () => { const [openDrawer, setOpenDrawer] = useState(0); const [selectedTime, setSelectedTime] = useState(''); const [availableTimeSlots, setAvailableTimeSlots] = useState([]); const [selectedDrawer, setSelectedDrawer] = useState(0); const [isLoading, setIsLoading] = useState(true); const [selectedDate, setSelectedDate] = useState(''); const toggleDrawer = (index: number) => { setOpenDrawer(openDrawer === index ? null : index); setSelectedDrawer(index); }; const [availableDate, setAvailableDate] = useState([]); useEffect(() => { const fetchingAvailableDates = async () => { const fetchedDates = await chargeStationService.fetchAvailableDates( '2405311022116801000' ); setAvailableDate(fetchedDates); }; fetchingAvailableDates(); }, []); useEffect(() => { const fetchingAvailableTimeSlots = async () => { setIsLoading(true); try { const fetchedTimeSlots = await chargeStationService.fetchAvailableTimeSlots( '2405311022116801000', selectedDate ); setAvailableTimeSlots(fetchedTimeSlots); console.log(`I AM TIMESLOT ${fetchedTimeSlots}`); } catch (error) { console.error('Error fetching time slots:', error); } finally { setIsLoading(false); } }; if (selectedDate) { fetchingAvailableTimeSlots(); } }, [selectedDate]); const timeData = [ '14:00', '14:15', '14:30', '14:45', '15:00', '15:15', '15:30', '15:45', '16:00', '16:15', '16:30', '16:45', '17:00', '17:15', '17:30', '17:45' ]; const dateData = [ '今天', '3/15', '3/16', '3/17', '3/18', '3/19', '3/20', '3/21' ]; const [uiState, setUiState] = useState({ isCarSelected: false, isChargingPlanOpen: false, isDateOpen: false, isCharigingGunOpen: false }); const [selectedChargingGun, setSelectedChargingGun] = useState(''); const [chargingBasedOnWatt, setChargingBasedOnWatt] = useState(false); const [stopChargingUponBatteryFull, setStopChargingUponBatteryFull] = useState(false); const [selectedCar, setSelectedCar] = useState(''); const [selectedDuration, setSelectedDuration] = useState(''); const { width: screenWidth, height: screenHeight } = Dimensions.get('window'); const layoutWidth = screenWidth; const layoutHeight = screenHeight * 0.4; return ( { if (router.canGoBack()) { router.back(); } else { router.replace('./'); } }} > 上環街市充電站 香港上環皇后大道中345號 路線 } onPress={() => console.log('路線')} extendedStyle={{ backgroundColor: '#E3F2F8', borderRadius: 61, paddingHorizontal: 20, paddingVertical: 8 }} /> Walk-In 400米 {selectedCar !== '' ? ( <> { setSelectedCar(''); setOpenDrawer(0); setSelectedDrawer(0); setSelectedDuration(''); setChargingBasedOnWatt(false); setStopChargingUponBatteryFull(false); setSelectedDate(''); setSelectedTime(''); }} > 選擇充電車輛 {selectedCar} ) : ( toggleDrawer(0)} isSelected={selectedDrawer === 0} > {dummyDataChooseCarForCharging.map( (car, index) => ( { setSelectedCar(car.VehicleName); setSelectedDrawer(1); setOpenDrawer(1); }} imageUrl={car.imageUrl} key={`${car.VehicleName}+${index}`} VehicleName={car.VehicleName} isDefault={car.isDefault} /> ) )} )} {stopChargingUponBatteryFull === true || selectedDuration !== '' ? ( { setSelectedDuration(''); setChargingBasedOnWatt(false); setStopChargingUponBatteryFull(false); setSelectedTime(''); setSelectedDate(''); setOpenDrawer(1); setSelectedDrawer(1); }} > 選擇充電方案 {selectedDuration !== '' ? `按每道電 - ${selectedDuration}` : '充滿停機'} ) : ( { if (selectedCar !== '') { toggleDrawer(1); } }} isSelected={selectedDrawer === 1} > { setChargingBasedOnWatt( !chargingBasedOnWatt ); setStopChargingUponBatteryFull(false); }} > 按每度電 { setStopChargingUponBatteryFull( !stopChargingUponBatteryFull ); setChargingBasedOnWatt(false); setSelectedDrawer(2); setOpenDrawer(2); }} className={`border rounded-lg border-[#34667c] w-[47%] items-center bg-white ${ stopChargingUponBatteryFull ? ' bg-[#34667c]' : '' }`} > 充滿停機 {chargingBasedOnWatt === true && ( {['30分鐘', '45分鐘', '60分鐘', '其他'].map( (duration) => ( { setSelectedDuration( duration ); setOpenDrawer(2); setSelectedDrawer(2); }} > {duration} ) )} )} )} {selectedTime !== '' ? ( { setOpenDrawer(2); setSelectedDrawer(2); setSelectedDate(''); setSelectedTime(''); }} > 選擇日期 {selectedDate} - {selectedTime} ) : ( { if ( stopChargingUponBatteryFull !== false || selectedDuration !== '' ) { toggleDrawer(2); } }} isSelected={selectedDrawer === 2} > {availableDate.map((date) => ( { setSelectedDate(date); }} > {date} ))} {selectedDate !== '' && ( <> 選擇時間 {isLoading ? ( ) : ( {availableTimeSlots.map((time) => ( { setSelectedTime(time); setOpenDrawer(3); setSelectedDrawer(3); }} > {time} ))} )} )} )} { if (selectedTime) { toggleDrawer(3); } }} isSelected={selectedDrawer === 3} > { setSelectedChargingGun(value); router.push('/bookingConfirmationPage'); }} extendedStyle={{ borderColor: '#34667c', marginTop: 4 }} /> 收費 $20 每15分鐘 $3.5 每度電 充電站資訊 ); }; export default MakingBookingPageComponent; const styles = StyleSheet.create({ grayColor: { color: '#888888' }, topLeftTriangle: { width: 0, height: 0, borderLeftWidth: 50, borderBottomWidth: 50, borderLeftColor: '#02677D', borderBottomColor: 'transparent', position: 'absolute', top: 0, left: 0 }, text: { fontWeight: 300, color: '#000000' } });