| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838 |
- import {
- View,
- Text,
- ScrollView,
- Pressable,
- StyleSheet,
- Image,
- Dimensions,
- ActivityIndicator,
- Platform,
- Linking,
- Alert
- } from 'react-native';
- import { SafeAreaView } from 'react-native-safe-area-context';
- import { router, useLocalSearchParams } from 'expo-router';
- import NormalButton from '../global/normal_button';
- import { CheckMarkLogoSvg, DirectionLogoSvg, PreviousPageBlackSvg } from '../global/SVG';
- import { ChargingStationTabView } from '../global/chargingStationTabView';
- import { useEffect, useState } from 'react';
- import DropdownSelect from '../global/dropdown_select';
- import { chargeStationService } from '../../service/chargeStationService';
- import * as Location from 'expo-location';
- import { calculateDistance } from '../global/distanceCalculator';
- import Modal from 'react-native-modal';
- import useUserInfoStore from '../../providers/userinfo_store';
- interface AccordionItemProps {
- title: string;
- children: React.ReactNode;
- isOpen: boolean;
- onToggle: () => void;
- isSelected: boolean;
- }
- const AccordionItem: React.FC<AccordionItemProps> = ({ title, children, isOpen, onToggle, isSelected }) => (
- <View className={`${isSelected ? 'bg-[#e7f5f8]' : 'bg-white'}`}>
- <View className="mx-[5%]">
- <Pressable onPress={onToggle}>
- <Text className={` pt-2 text-lg ${isSelected ? 'text-[#222222]' : 'text-[#888888] '}}`}>{title}</Text>
- </Pressable>
- {isOpen && <View>{children}</View>}
- </View>
- </View>
- );
- const MakingBookingPageComponent = () => {
- const [isModalVisible, setModalVisible] = useState(false);
- const [routerParams, setRouterParams] = useState(null);
- const [openDrawer, setOpenDrawer] = useState<number | null>(1);
- const [selectedTime, setSelectedTime] = useState<string>('');
- const [availableTimeSlots, setAvailableTimeSlots] = useState<string[]>([]);
- const [selectedDrawer, setSelectedDrawer] = useState<number>(1);
- const [isLoading, setIsLoading] = useState(true);
- const [selectedDate, setSelectedDate] = useState<string>('');
- const toggleDrawer = (index: number) => {
- setOpenDrawer(openDrawer === index ? null : index);
- setSelectedDrawer(index);
- };
- const [defaultCar, setDefaultCar] = useState(null);
- const [isDefaultCarLoading, setIsDefaultCarLoading] = useState(true);
- const [availableDate, setAvailableDate] = useState<string[]>([]);
- const [car, setCar] = useState([]);
- const [selectedCarID, setSelectedCarID] = useState('');
- const [selectedChargingGun, setSelectedChargingGun] = useState('');
- const [chargingBasedOnWatt, setChargingBasedOnWatt] = useState(true);
- const [stopChargingUponBatteryFull, setStopChargingUponBatteryFull] = useState(false);
- const [selectedCar, setSelectedCar] = useState('');
- const [selectedDuration, setSelectedDuration] = useState('');
- const { width: screenWidth, height: screenHeight } = Dimensions.get('window');
- const [price, setPrice] = useState(0);
- const layoutWidth = screenWidth;
- const layoutHeight = screenHeight * 0.32;
- const { userID, setUserID } = useUserInfoStore();
- const [formattedDates, setFormattedDates] = useState([]);
- const params = useLocalSearchParams();
- const chargeStationID = params.chargeStationID as string;
- const chargeStationName = params.chargeStationName as string;
- const chargeStationAddress = params.chargeStationAddress as string;
- const chargeStationLat = params.chargeStationLat as string;
- const chargeStationLng = params.chargeStationLng as string;
- const [selectedWatt, setSelectedWatt] = useState('');
- const [availableConnectorDropdownOptions, setAvailableConnectorDropdownOptions] = useState([]);
- const [carCapacitance, setCarCapacitance] = useState('');
- const [currentLocation, setCurrentLocation] = useState<Location.LocationObject | null>(null);
- const [distance, setDistance] = useState<string | null>(null);
- const [upcomingReservations, setUpcomingReservation] = useState([]);
- const [carLoadingState, setCarLoadingState] = useState(false);
- const [isDateLoading, setIsDateLoading] = useState(false);
- const [dataResponse, setDataResponse] = useState([]);
- //check for unpaid penalties
- useEffect(() => {
- const checkUnpaidPenalties = async () => {
- try {
- const reservationHistories = await chargeStationService.fetchReservationHistories();
- const unpaidPenalties = reservationHistories.filter(
- (reservation) => reservation.penalty_fee > 0 && reservation.penalty_paid_status === false
- );
- if (unpaidPenalties.length > 0) {
- const mostRecentUnpaidReservation = unpaidPenalties.reduce((mostRecent, current) => {
- return new Date(mostRecent.created_at) > new Date(current.created_at) ? mostRecent : current;
- }, unpaidPenalties[0]);
- Alert.alert(
- '未付罰款',
- '您有未支付的罰款。請先支付罰款後再開始充電。',
- [
- {
- text: '查看詳情',
- onPress: () => {
- // Navigate to a page showing penalty details
- router.push({
- pathname: '(auth)/(tabs)/(home)/penaltyPaymentPage',
- params: {
- book_time: mostRecentUnpaidReservation.book_time,
- end_time: mostRecentUnpaidReservation.end_time,
- actual_end_time: mostRecentUnpaidReservation.actual_end_time,
- penalty_fee: mostRecentUnpaidReservation.penalty_fee,
- format_order_id: mostRecentUnpaidReservation.format_order_id,
- id: mostRecentUnpaidReservation.id,
- stationName:
- mostRecentUnpaidReservation.connector.EquipmentID.StationID.snapshot
- .StationName,
- address:
- mostRecentUnpaidReservation.connector.EquipmentID.StationID.snapshot
- .Address
- }
- });
- }
- },
- {
- text: '返回',
- onPress: () => {
- if (router.canGoBack()) {
- router.back();
- } else {
- router.push('/mainPage');
- }
- }
- }
- ],
- { cancelable: false }
- );
- }
- } catch (error) {
- console.error('Error checking unpaid penalties:', error);
- // Handle the error appropriately (e.g., show an error message to the user)
- }
- };
- checkUnpaidPenalties();
- }, []);
- const handleSendingSize = async (watt) => {
- try {
- setIsLoading(true);
- const wattValue = parseInt(watt.split(' ')[0]);
- console.log('wattValue', wattValue);
- let size: number;
- //make the duration based on watt
- switch (wattValue) {
- case 20:
- size = 25;
- break;
- case 25:
- size = 30;
- break;
- case 30:
- size = 40;
- break;
- case 40:
- size = 45;
- break;
- default:
- console.error('Invalid selectedWatt value');
- return; // Exit the function if selectedWatt is invalid
- }
- const response = await chargeStationService.getReservationWithSize(size);
- if (response) {
- setDataResponse(response);
- // console.log('respoasdasdasdnse', response);
- const uniqueDates = new Set();
- response.forEach((item) => {
- item.timeSlot.forEach((slot) => {
- uniqueDates.add(slot.date);
- });
- });
- const availableDates = Array.from(uniqueDates).sort();
- setAvailableDate(availableDates);
- // console.log('formattedDates', formattedDates);
- } else {
- console.log('No response from getReservationWithSize');
- }
- } catch (error) {
- console.error('Error in handleSendingSize:', error);
- // Handle the error appropriately, maybe show an alert to the user
- } finally {
- setIsLoading(false);
- }
- };
- //get location
- useEffect(() => {
- const getCurrentLocation = async () => {
- let { status } = await Location.requestForegroundPermissionsAsync();
- if (status !== 'granted') {
- console.error('Permission to access location was denied');
- return;
- }
- let location = await Location.getLastKnownPositionAsync({});
- setCurrentLocation(location);
- };
- getCurrentLocation();
- }, []);
- useEffect(() => {
- const fetchPrice = async () => {
- try {
- const price = await chargeStationService.fetchChargeStationPrice(chargeStationID);
- setPrice(price);
- } catch (error) {
- console.error('Error fetching price:', error);
- }
- };
- fetchPrice();
- }, []);
-
- const connectorIDToLabelMap = {
- '101708240502475001': '1',
- '101708240502476001': '2',
- '101708240502477001': '3',
- '101708240502478001': '4',
- '101708240502474001': '5',
- '101708240502474002': '6'
- };
- const connectorIDToLabelMapArray = [
- { value: '101708240502475001', label: '1' },
- { value: '101708240502476001', label: '2' },
- { value: '101708240502477001', label: '3' },
- { value: '101708240502478001', label: '4' },
- { value: '101708240502474001', label: '5' },
- { value: '101708240502474002', label: '6' }
- ];
- const formatDateString = (dateString: string) => {
- const [year, month, day] = dateString.split('-');
- return `${month}/${day}`;
- };
- const handleNavigationPress = () => {
- const latitude = chargeStationLat;
- const longitude = chargeStationLng;
- const label = encodeURIComponent(chargeStationName);
- // Google Maps App URL
- const googleMapsUrl = `https://www.google.com/maps/search/?api=1&query=${latitude},${longitude}`;
- // Fallback URL for web browser
- const webUrl = `https://www.google.com/maps/dir/?api=1&destination=${latitude},${longitude}`;
- Linking.canOpenURL(googleMapsUrl)
- .then((supported) => {
- if (supported) {
- Linking.openURL(googleMapsUrl);
- } else {
- Linking.openURL(webUrl).catch((err) => {
- console.error('An error occurred', err);
- Alert.alert(
- 'Error',
- "Unable to open Google Maps. Please make sure it's installed on your device.",
- [{ text: 'OK' }],
- { cancelable: false }
- );
- });
- }
- })
- .catch((err) => console.error('An error occurred', err));
- };
- const handleDateToTimeSlot = (date: string, connectorId: string) => {
- // Find the correct connector object
- const connectorData = dataResponse.find((item) => item.connector === connectorId);
- if (!connectorData) {
- console.error(`No data found for connector ${connectorId}`);
- setAvailableTimeSlots([]);
- return;
- }
- // Find the timeSlot object for the selected date
- const selectedTimeSlot = connectorData.timeSlot.find((slot) => slot.date === date);
- if (!selectedTimeSlot) {
- console.error(`No time slots found for date ${date}`);
- setAvailableTimeSlots([]);
- return;
- }
- const now = new Date();
- const selectedDateObj = new Date(date);
- const isToday = selectedDateObj.toDateString() === now.toDateString();
- let filteredSlots = selectedTimeSlot.availableTime;
- if (isToday) {
- filteredSlots = filteredSlots.filter((slot) => {
- const [hours, minutes] = slot.startTime.split(':').map(Number);
- const slotTime = new Date(selectedDateObj);
- slotTime.setHours(hours, minutes, 0, 0);
- return slotTime > now;
- });
- }
- setAvailableTimeSlots(filteredSlots);
- };
- const handleConfirmation = (value: any) => {
- setModalVisible(true);
- const selectedOption = formattedConnectorDropdownOptions.find((option) => option.value === value);
- const label = selectedOption ? selectedOption.label : '';
- setRouterParams({
- pathname: '/bookingConfirmationPage',
- params: {
- chargeStationName,
- chargeStationAddress,
- chargeStationID,
- connectorID: value,
- connectorLabel: label,
- userID,
- carCapacitance: carCapacitance,
- carID: selectedCarID,
- carName: selectedCar,
- date: selectedDate,
- bookTime: selectedTime,
- chargingMethod: stopChargingUponBatteryFull ? 'stopChargingUponBatteryFull' : 'chargingBasedOnWatt',
- chargingWatt: selectedWatt || '',
- price: price
- }
- });
- };
- const handleModalConfirm = () => {
- setModalVisible(false);
- if (routerParams) {
- router.push(routerParams);
- }
- };
- return (
- <SafeAreaView
- style={{
- flex: 1,
- backgroundColor: 'white'
- }}
- edges={['right', 'top', 'left']}
- >
- <ScrollView className="flex-1 bg-white" showsVerticalScrollIndicator={false}>
- <View className="pb-4 ">
- <View className="ml-[5%] pt-8">
- <Pressable
- style={{ alignSelf: 'flex-start' }}
- onPress={() => {
- if (router.canGoBack()) {
- router.back();
- } else {
- router.replace('./');
- }
- }}
- >
- <PreviousPageBlackSvg />
- </Pressable>
- <Text className="text-3xl mt-8">{chargeStationName}</Text>
- <View className="flex-column">
- <View className="flex-row justify-between items-center mr-[5%]">
- <Text className="text-base" style={styles.grayColor}>
- {chargeStationAddress}
- </Text>
- <NormalButton
- title={
- <View className="flex-row items-center justify-center text-center space-x-1">
- <DirectionLogoSvg />
- <Text className="text-base">路線</Text>
- </View>
- }
- // onPress={() => console.log('路線')}
- onPress={handleNavigationPress}
- extendedStyle={{
- backgroundColor: '#E3F2F8',
- borderRadius: 61,
- paddingHorizontal: 20,
- paddingVertical: 8
- }}
- />
- </View>
- <View className="flex-row space-x-2 items-center">
- <CheckMarkLogoSvg />
- <Text>Walk-In</Text>
- {/* <Text>{distance}</Text> */}
- </View>
- </View>
- </View>
- </View>
- <View>
- {stopChargingUponBatteryFull === true || selectedWatt !== '' ? (
- <Pressable
- onPress={() => {
- setSelectedDuration('');
- setChargingBasedOnWatt(false);
- setStopChargingUponBatteryFull(false);
- setSelectedTime('');
- setSelectedDate('');
- setSelectedWatt('');
- setOpenDrawer(1);
- setSelectedDrawer(1);
- setSelectedChargingGun('');
- }}
- >
- <View className="mx-[5%] ">
- <View className="flex-row items-center pt-4">
- <Text className="text-lg pr-2 text-[#34667c]">選擇充電方案</Text>
- <CheckMarkLogoSvg />
- </View>
- <Text className="text-lg pb-4">
- {selectedWatt !== '' ? `按每道電 - ${selectedWatt.split('~')[0]}` : '充滿停機'}
- </Text>
- </View>
- </Pressable>
- ) : (
- <AccordionItem
- title="選擇充電方案"
- isOpen={openDrawer === 1}
- onToggle={() => {}}
- isSelected={selectedDrawer === 1}
- >
- <View className="flex-row justify-between mt-2 mb-3">
- <Pressable
- className={`border rounded-lg border-[#34667c] w-[47%] items-center bg-white ${
- chargingBasedOnWatt ? 'bg-[#34667c] ' : ''
- }`}
- onPress={() => {
- setChargingBasedOnWatt(!chargingBasedOnWatt);
- setStopChargingUponBatteryFull(false);
- }}
- >
- <Text
- className={`text-base p-2 text-[#34667c] ${
- chargingBasedOnWatt ? ' text-white' : 'text-[#34667c]'
- }`}
- >
- 按每度電
- </Text>
- </Pressable>
- {/* <Pressable
- onPress={() => {
- setStopChargingUponBatteryFull(!stopChargingUponBatteryFull);
- setChargingBasedOnWatt(false);
- setSelectedDrawer(2);
- setOpenDrawer(2);
- }}
- className={`border rounded-lg border-[#34667c] w-[47%] items-center bg-white ${
- stopChargingUponBatteryFull ? ' bg-[#34667c]' : ''
- }`}
- >
- <Text
- className={`text-base p-2 text-[#34667c] ${
- stopChargingUponBatteryFull ? ' text-white' : 'text-[#34667c]'
- }`}
- >
- 充滿停機
- </Text>
- </Pressable> */}
- </View>
- {chargingBasedOnWatt === true && (
- <View className="flex-row w-full justify-between mb-3">
- {['20 kWh~25mins', '25 kWh~30mins', '30 kWh~40mins', '40 kWh~45mins'].map(
- (watt) => (
- <Pressable
- key={watt}
- className={`${
- selectedWatt === watt ? 'bg-[#34667c] ' : 'bg-white'
- } border border-[#34667c] rounded-lg w-[22%] items-center`}
- onPress={() => {
- setSelectedWatt(watt);
- setOpenDrawer(2);
- setSelectedDrawer(2);
- handleSendingSize(watt);
- }}
- >
- <Text
- className={`text-base pt-2 pl-2 pr-2 ${
- selectedWatt === watt ? 'text-white' : 'text-[#34667c]'
- } `}
- >
- {watt.split('~')[0]}
- </Text>
- <Text className="text-xs pt-0 pb-1 text-[#666666]">
- {watt.split('~')[1]}
- </Text>
- </Pressable>
- )
- )}
- </View>
- )}
- </AccordionItem>
- )}
- {/* select gun */}
- {/* select gun */}
- <View className="">
- {selectedChargingGun !== '' ? (
- <Pressable
- onPress={() => {
- setSelectedChargingGun('');
- setOpenDrawer(2);
- setSelectedDrawer(2);
- }}
- >
- <View className="mx-[5%]">
- <View className="flex-row items-center pt-4">
- <Text className="text-lg pr-2 text-[#34667c]">選擇充電座</Text>
- <CheckMarkLogoSvg />
- </View>
- <View className="text-lg pb-4 flex flex-row items-center">
- <Text className="text-[#34667c] font-[600] text-2xl pr-2">
- {connectorIDToLabelMap[selectedChargingGun]}
- </Text>
- <Text className="text-lg">號充電座</Text>
- </View>
- </View>
- </Pressable>
- ) : (
- <AccordionItem
- title="選擇充電座"
- isOpen={openDrawer === 2}
- onToggle={() => {
- if (selectedWatt) {
- toggleDrawer(2);
- }
- }}
- isSelected={selectedDrawer === 2}
- >
- {selectedWatt !== '' ? (
- <View className="">
- <DropdownSelect
- dropdownOptions={connectorIDToLabelMapArray}
- placeholder={'選擇充電座號碼'}
- onSelect={(value) => {
- setSelectedChargingGun(value);
- setSelectedDrawer(3);
- setOpenDrawer(3);
- }}
- extendedStyle={{
- borderColor: '#34667c',
- marginTop: 4,
- padding: 12
- }}
- />
- <Image
- style={{
- width: layoutWidth * 0.9,
- height: layoutHeight
- }}
- resizeMode="contain"
- source={require('../../assets/floorPlan1.png')}
- />
- </View>
- ) : (
- <Text className="text-base text-gray-500 py-2">請先選擇充電方案</Text>
- )}
- </AccordionItem>
- )}
- </View>
- <Modal
- isVisible={isModalVisible}
- // onBackdropPress={() => setModalVisible(false)}
- backdropOpacity={0.5}
- animationIn="fadeIn"
- animationOut="fadeOut"
- >
- <View style={styles.modalContent}>
- <Text className="text-2xl font-[500] text-[#34667c] mb-6">
- 已選擇日期時間: {formatDateString(selectedDate)} - {selectedTime}
- </Text>
- <Text style={styles.modalText} className="text-[#34667c]">
- 若客戶逾時超過15分鐘,系統將視作自動放棄預約,客戶需要重新預約一次。
- 本公司有權保留全數費用,恕不退還。按下確認代表您已閱讀並同意上述條款。
- </Text>
- <NormalButton
- title={<Text className="text-white">我確認</Text>}
- onPress={handleModalConfirm}
- extendedStyle={styles.confirmButton}
- />
- </View>
- </Modal>
- {selectedDate !== '' && selectedTime !== '' ? (
- <>
- <Pressable
- onPress={() => {
- setOpenDrawer(3);
- setSelectedDrawer(3);
- setSelectedDate('');
- setSelectedTime('');
- }}
- >
- <View className="mx-[5%] ">
- <View className="flex-row items-center pt-4">
- <Text className="text-lg pr-2 text-[#34667c]">選擇日期</Text>
- <CheckMarkLogoSvg />
- </View>
- <Text className="text-lg pb-4">
- {formatDateString(selectedDate)} - {selectedTime}
- </Text>
- </View>
- </Pressable>
- </>
- ) : (
- <AccordionItem
- title="選擇日期 (月/日)"
- isOpen={openDrawer === 3}
- onToggle={() => {
- if (stopChargingUponBatteryFull !== false || selectedDuration !== '') {
- toggleDrawer(3);
- }
- }}
- isSelected={selectedDrawer === 3}
- >
- {isDateLoading ? (
- <View className="flex-1 items-center justify-center py-4">
- <ActivityIndicator size="large" color="#34667c" />
- </View>
- ) : (
- <View className="flex-row w-full flex-wrap mb-1 ">
- {availableDate.map((date) => (
- <Pressable
- key={date}
- className={`${
- selectedDate === date ? 'bg-[#34667c] ' : 'bg-white'
- } border border-[#34667c] rounded-lg w-[22%] items-center mt-1 mr-1 mb-1`}
- onPress={() => {
- setSelectedDate(date);
- handleDateToTimeSlot(date, selectedChargingGun);
- }}
- >
- <Text
- className={`text-base p-2 ${
- selectedDate === date ? 'text-white' : 'text-[#34667c]'
- } `}
- >
- {formatDateString(date)}
- </Text>
- </Pressable>
- ))}
- </View>
- )}
- {selectedDate !== '' && (
- <>
- <Text className="text-lg pr-2 ">選擇時間</Text>
- {isLoading ? (
- <View className="flex-1 mb-2">
- <ActivityIndicator />
- </View>
- ) : (
- <View className="flex-row w-full mb-3 flex-wrap my-2 ">
- {availableTimeSlots.map((slot, index) => (
- <Pressable
- key={index}
- className={`${
- selectedTime === slot.startTime ? 'bg-[#34667c] ' : 'bg-white'
- } border border-[#34667c] mr-2 rounded-lg w-[22%] items-center mb-2`}
- onPress={() => {
- setSelectedTime(slot.startTime);
- setRouterParams({
- pathname: '/bookingConfirmationPage',
- params: {
- chargeStationName,
- chargeStationAddress,
- chargeStationID,
- connectorID: selectedChargingGun,
- connectorLabel:
- connectorIDToLabelMap[selectedChargingGun],
- userID,
- carCapacitance: carCapacitance,
- carID: selectedCarID,
- carName: selectedCar,
- date: selectedDate,
- bookTime: slot.startTime,
- endTime: slot.endTime,
- chargingMethod: stopChargingUponBatteryFull
- ? 'stopChargingUponBatteryFull'
- : 'chargingBasedOnWatt',
- chargingWatt: selectedWatt || '',
- price: price
- }
- });
- setModalVisible(true);
- }}
- >
- <Text
- className={`text-base p-2 ${
- selectedTime === slot.startTime
- ? 'text-white'
- : 'text-[#34667c]'
- } `}
- >
- {slot.startTime}
- </Text>
- </Pressable>
- ))}
- </View>
- )}
- </>
- )}
- </AccordionItem>
- )}
- {/* <View className="">
- <AccordionItem
- title="選擇充電座"
- isOpen={openDrawer === 3}
- onToggle={() => {
- if (selectedTime) {
- // toggleDrawer(3);
- }
- }}
- isSelected={selectedDrawer === 3}
- >
- <View className="">
- <DropdownSelect
- dropdownOptions={formattedConnectorDropdownOptions}
- placeholder={'選擇充電座號碼'}
- onSelect={(value) => {
- setSelectedChargingGun(value);
- handleConfirmation(value);
- }}
- extendedStyle={{
- borderColor: '#34667c',
- marginTop: 4,
- padding: 12
- }}
- />
- <Image
- style={{
- width: layoutWidth * 0.9,
- height: layoutHeight
- }}
- resizeMode="contain"
- source={require('../../assets/floorPlan1.png')}
- />
- <Modal
- isVisible={isModalVisible}
- // onBackdropPress={() => setModalVisible(false)}
- backdropOpacity={0.5}
- animationIn="fadeIn"
- animationOut="fadeOut"
- >
- <View style={styles.modalContent}>
- <Text style={styles.modalText}>
- 若客戶逾時超過15分鐘,系統將視作自動放棄預約,客戶需要重新預約一次。
- 本公司有權保留全數費用,恕不退還。按下確認代表您已閱讀並同意上述條款。
- </Text>
- <NormalButton
- title={<Text className="text-white">我確認</Text>}
- onPress={handleModalConfirm}
- extendedStyle={styles.confirmButton}
- />
- </View>
- </Modal>
- </View>
- </AccordionItem>
- </View> */}
- </View>
- <View className="flex-1">
- <Text className="text-xl pb-2 mt-6" style={styles.text}>
- 充電站資訊
- </Text>
- <View className="h-[250px]">
- <ChargingStationTabView titles={['預約充電事項', '其他']} />
- </View>
- </View>
- </ScrollView>
- </SafeAreaView>
- );
- };
- 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
- },
- modalContent: {
- backgroundColor: 'white',
- padding: 22,
- justifyContent: 'center',
- alignItems: 'center',
- borderRadius: 4,
- borderColor: 'rgba(0, 0, 0, 0.1)'
- },
- modalText: {
- fontSize: 18,
- marginBottom: 12,
- textAlign: 'center'
- },
- confirmButton: {
- backgroundColor: '#34667c',
- paddingHorizontal: 30,
- paddingVertical: 10,
- borderRadius: 5
- },
- text: {
- fontWeight: 300,
- color: '#000000'
- }
- });
|