import Svg, { Path, Rect } from 'react-native-svg'; import * as React from 'react'; import { View, Text, useWindowDimensions, StyleSheet, Image, ImageSourcePropType, Pressable, ActivityIndicator } from 'react-native'; import { TabView, SceneMap, TabBar } from 'react-native-tab-view'; import { FlashList } from '@shopify/flash-list'; import { SafeAreaView } from 'react-native-safe-area-context'; import { router } from 'expo-router'; import { CheckMarkLogoSvg, CrossLogoSvg } from '../global/SVG'; import { useEffect, useState } from 'react'; import { chargeStationService } from '../../service/chargeStationService'; import * as Location from 'expo-location'; import { calculateDistance } from '../global/distanceCalculator'; interface TabItem { imgURL: ImageSourcePropType; date: string; time: string; chargeStationName: string; chargeStationAddress: string; distance: string; stationID: string; lat: string; lng: string; } interface TabViewComponentProps { titles: string[]; tabItems: TabItem[]; } const ReservationLocationPage = () => { const [stations, setStations] = useState([]); const [TabItems, setTabItems] = useState([]); const [currentLocation, setCurrentLocation] = useState(null); 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); }; useEffect(() => { getCurrentLocation(); }, []); const LocationTabComponent: React.FC = ({ titles, tabItems }) => { const FirstRoute = () => ( {TabItems.length > 0 ? ( { return ( router.push({ pathname: '/resultDetailPage', params: { chargeStationAddress: item.chargeStationAddress, chargeStationName: item.chargeStationName, chargeStationID: item.stationID, chargeStationLng: item.lng, chargeStationLat: item.lat } }) } style={({ pressed }) => [ styles.container, { backgroundColor: pressed ? '#e7f2f8' : '#ffffff' } ]} > {item.chargeStationName} {item.chargeStationAddress} Walk-in {item.distance} ); }} /> ) : ( )} ); //tab 2 const SecondRoute = () => ( { return ( router.push({ pathname: '/resultDetailPage', params: { chargeStationAddress: item.chargeStationAddress, chargeStationName: item.chargeStationName, chargeStationLng: item.lng, chargeStationLat: item.lat } }) } style={({ pressed }) => [ styles.container, { backgroundColor: pressed ? '#e7f2f8' : '#ffffff' } ]} > {item.chargeStationName} {item.chargeStationAddress} Walk-in {item.distance} ); }} /> ); const renderScene = SceneMap({ firstRoute: FirstRoute, secondRoute: SecondRoute }); const [routes] = React.useState([ { key: 'firstRoute', title: titles[0] }, { key: 'secondRoute', title: titles[1] } ]); const [index, setIndex] = React.useState(0); const renderTabBar = (props: any) => ( ); return ( ( {route.title} ) }} /> ); }; const styles = StyleSheet.create({ container: { flexDirection: 'row' }, image: { width: 100, height: 100, marginTop: 15, marginRight: 15, borderRadius: 10 }, textContainer: { flexDirection: 'column', gap: 4, marginTop: 15 } }); // const fetchStations = async () => { // const fetchedStations = await chargeStationService.fetchChargeStations(); // setStations(fetchedStations); // const TabItems = fetchedStations.map((station) => ({ // chargeStationAddress: station.Address, // chargeStationName: station.StationName, // lng: station.StationLng, // lat: station.StationLat, // date: '今天', // stationID: station.StationID, // imgURL: require('../../assets/dummyStationPicture.png'), // distance: '400米' // })); // setTabItems(TabItems); // }; // fetchStations(); // }, []); const fetchStations = async () => { const fetchedStations = await chargeStationService.fetchChargeStations(); setStations(fetchedStations); if (currentLocation) { const TabItems = await Promise.all( fetchedStations.map(async (station) => { const distance = await calculateDistance( Number(station.StationLat), Number(station.StationLng), currentLocation ); return { chargeStationAddress: station.Address, chargeStationName: station.StationName, lng: station.StationLng, lat: station.StationLat, date: '今天', stationID: station.StationID, imgURL: require('../../assets/dummyStationPicture.png'), distance: distance !== null ? formatDistance(distance) : 'N/A' }; }) ); setTabItems(TabItems); } }; useEffect(() => { if (currentLocation) { fetchStations(); } }, [currentLocation]); const formatDistance = (distanceInMeters: number): string => { if (distanceInMeters < 1000) { return `${Math.round(distanceInMeters)}米`; } else { const distanceInKm = distanceInMeters / 1000; return `${distanceInKm.toFixed(1)}公里`; } }; return ( { if (router.canGoBack()) { router.back(); } else { router.replace('/'); } }} > 預約地點 router.push('searchPage')}> 搜尋充電站或地區.. ); }; export default ReservationLocationPage;