瀏覽代碼

perf: 充电站新增收费详情

kuns 1 月之前
父節點
當前提交
b67a4dd5d1

+ 5 - 5
component/chargingPage/noChargingOngoingPageComponent.tsx

@@ -10,20 +10,19 @@ import { chargeStationService } from '../../service/chargeStationService';
 // const MAX_RETRIES = 3; // Maximum number of retry attempts
 
 const NoChargingOngoingPageComponent = () => {
-    const [newAvailableConnectors, setNewAvailableConnectors] = useState([]);
+    const [newAvailableConnectors, setNewAvailableConnectors] = useState<any>([]);
     useFocusEffect(
         useCallback(() => {
             let isMounted = true; // Simple cleanup flag
             const fetchAllConnectors = async () => {
                 try {
                     const newAvailableConnectors = await chargeStationService.NewfetchAvailableConnectors();
-
                     // Only update state if component is still mounted
                     if (isMounted) {
                         // Sort the connectors based on stationID
                         const sortedConnectors = [...newAvailableConnectors].sort((a, b) => {
                             // Custom sorting order
-                            const order = {
+                            const order: Record<string, number> = {
                                 '2405311022116801000': 1, // 觀塘偉業街
                                 '2411291610329331000': 2, // 黃竹坑
                                 '2501161430118231000': 3 // 沙頭角
@@ -66,7 +65,8 @@ const NoChargingOngoingPageComponent = () => {
                             availableConnectors: item.availableConnectors,
                             imageSource: item.image,
                             stationLng: item.stationLng,
-                            stationLat: item.stationLat
+                            stationLat: item.stationLat,
+                            pricemodel_id: item.pricemodel_id
                         }
                     });
                 }}
@@ -120,7 +120,7 @@ const NoChargingOngoingPageComponent = () => {
                             <Text className="text-lg mx-[5%] mb-6">立刻前往Crazy Charge 充電站充電吧!</Text>
 
                             <View>
-                                {newAvailableConnectors?.map((item, index) => (
+                                {newAvailableConnectors?.map((item: any, index: number) => (
                                     <View key={index}>
                                         <View className="border-b border-gray-200" />
                                         <StationRow item={item} key={index} />

+ 48 - 20
component/resultDetailPage/resultDetailPageComponent.tsx

@@ -20,25 +20,53 @@ import { SafeAreaView } from 'react-native-safe-area-context';
 import { chargeStationService } from '../../service/chargeStationService';
 import * as Location from 'expo-location';
 import { calculateDistance } from '../global/distanceCalculator';
+import { ChargingDetails, Remark, PriceWeek, Special } from '../../service/type/chargeStationType';
 
 interface ChargingStationTabViewProps {
     titles: string[];
+    pricemodel_id: string;
 }
-interface StationCoordinates {
-    StationLat: number;
-    StationLng: number;
+interface ChargingPeriod{
+    event_name: string;
+    price: number;
+    from: string;
+    to: string;
 }
-
-const ChargingStationTabView: React.FC<ChargingStationTabViewProps> = ({ titles }) => {
+const ChargingStationTabView: React.FC<ChargingStationTabViewProps> = ({ titles, pricemodel_id }) => {
     const layout = useWindowDimensions();
+    const [list, setList] = useState<ChargingPeriod []>([])
+    const [strWeek, setStrWeek] = useState<string>('') 
+    useEffect(() => { 
+        chargeStationService.fetchElectricityPrice(pricemodel_id || 'a').then(res => {
+            const date = new Date();
+            const str = (date.toLocaleString('en-US', { weekday: 'short' })).toLowerCase();
+            setStrWeek(date.toLocaleString('zh', { weekday: 'long' }))
+            const newList = [] as ChargingPeriod[]
+            res?.forEach((item) => {
+                const obj = item[str as keyof PriceWeek]
+                newList.push({event_name: item.event_name, price: obj.price, from: obj.from, to: obj.to})
+                setList(newList)
+            })
+        })
+    }, [pricemodel_id])
 
     //tab 1
     const FirstRoute = () => (
         <ScrollView style={{ flex: 1, marginHorizontal: '5%' }}>
-            <Text className="text-lg" style={styles.text}>
-                由於充電站車流眾多, 敬請客戶務必於預約時間的十五分鐘內到達充電站。
-                若客戶逾時超過15分鐘,系統將視作自動放棄預約,客戶需要重新預約一次。 本公司有權保留全數費用,恕不退還。
-            </Text>
+            <View>
+                <View className='w-full flex-row justify-between mt-4 pr-10'>
+                    <Text style={styles.leftLable}>時段</Text>
+                    <Text style={styles.rightLable}>價格(/度)</Text>
+                </View>
+                {
+                    list.map((item, index) => (
+                        <View key={index} className='w-full flex-row justify-between mt-3 pr-14'>
+                            <Text style={styles.leftLable}>{item.event_name}({item.from}-{item.to}):</Text>
+                            <Text style={styles.rightLable}>${item.price}</Text>
+                        </View>
+                    ))
+                }
+            </View>
         </ScrollView>
     );
 
@@ -104,22 +132,15 @@ const ResultDetailPageComponent = () => {
     const chargeStationID = params.chargeStationID as string;
     const chargeStationName = params.chargeStationName as string;
     const chargeStationAddress = params.chargeStationAddress as string;
-    const availableConnectorsFromParams = params.availableConnectors;
+    const pricemodel_id = params.pricemodel_id as string;
     const imageSourceProps = params.imageSource;
     const stationLng = params.stationLng as string;
     const stationLat = params.stationLat as string;
     const [isLoading, setIsLoading] = useState(true);
     const [imageSource, setImageSource] = useState();
-    // const chargeStationLat = params.chargeStationLat as string;
-    // const chargeStationLng = params.chargeStationLng as string;
     const [currentLocation, setCurrentLocation] = useState<Location.LocationObject | null>(null);
-    const [distance, setDistance] = useState<string | null>(null);
-    const [coordinates, setCoordinates] = useState<StationCoordinates | null>(null);
     const [price, setPrice] = useState('');
-    const [availableConnectors, setAvailableConnectors] = useState<number | null>(
-        availableConnectorsFromParams ? Number(availableConnectorsFromParams) : null
-    );
-    const [newAvailableConnectors, setNewAvailableConnectors] = useState([]);
+    const [newAvailableConnectors, setNewAvailableConnectors] = useState<any>([]);
     useEffect(() => {
         const imgObj = imageSourceProps? {uri: imageSourceProps} : require('../../assets/dummyStationPicture.png')
         setImageSource(imgObj);
@@ -304,7 +325,7 @@ const ResultDetailPageComponent = () => {
                     <Text className="text-xl pb-2 mx-[5%]" style={styles.text}>
                         充電站資訊
                     </Text>
-                    <ChargingStationTabView titles={['預約充電事項', '其他']} />
+                    <ChargingStationTabView titles={['收費詳情', '其他']} pricemodel_id={pricemodel_id} />
                 </View>
             </ScrollView>
         </SafeAreaView>
@@ -317,5 +338,12 @@ const styles = StyleSheet.create({
     text: {
         fontWeight: 300,
         color: '#000000'
-    }
+    },
+    leftLable: {
+        fontSize: 17,
+        color:'#000000',
+    },
+    rightLable: {
+        fontSize: 17
+    },
 });

+ 7 - 23
component/searchPage/searchResultComponent.tsx

@@ -170,12 +170,7 @@ const SearchResultComponent = () => {
 
         if (currentLocation) {
             const TabItems = await Promise.all(
-                fetchedStations.map(async (station) => {
-                    // const distance = await calculateDistance(
-                    //     Number(station.StationLat),
-                    //     Number(station.StationLng),
-                    //     currentLocation
-                    // );
+                fetchedStations.map(async (station: any) => {
 
                     return {
                         chargeStationAddress: station.Address,
@@ -207,17 +202,6 @@ const SearchResultComponent = () => {
             return `${distanceInKm.toFixed(1)}公里`;
         }
     };
-    const stationImages = {
-        //沙頭角
-        '2501161430118231000': require('../../assets/dummyStationPicture5.jpeg'),
-        //黃竹坑
-        '2411291610329331000': require('../../assets/dummyStationPicture4.jpeg'),
-        //觀塘
-        '2405311022116801000': require('../../assets/dummyStationPicture.png')
-    };
-
-    // const imageSource = stationImages[stationID] || require('../../assets/dummyStationPicture.png');
-    // ************************************************************************************************************************************************
     return (
         <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
             <SafeAreaView className="flex-1" edges={['top', 'left', 'right']}>
@@ -264,8 +248,8 @@ const SearchResultComponent = () => {
                                                 setSearchInput(item.chargeStationName);
                                                 setFilteredItems([]);
                                                 handleRegionChange({
-                                                    latitude: item.lat,
-                                                    longitude: item.lng,
+                                                    latitude: item.lat as number,
+                                                    longitude: item.lng as number,
                                                     latitudeDelta: 0.01,
                                                     longitudeDelta: 0.01
                                                 });
@@ -300,8 +284,8 @@ const SearchResultComponent = () => {
                             <Marker
                                 key={index}
                                 coordinate={{
-                                    latitude: item.lat,
-                                    longitude: item.lng
+                                    latitude: item.lat as number,
+                                    longitude: item.lng as number
                                 }}
                                 title={item.chargeStationName}
                                 description={item.chargeStationAddress}
@@ -324,8 +308,8 @@ const SearchResultComponent = () => {
                                                     key={index}
                                                     onPress={() => {
                                                         handleRegionChange({
-                                                            latitude: item.lat,
-                                                            longitude: item.lng,
+                                                            latitude: item.lat as number,
+                                                            longitude: item.lng as number,
                                                             latitudeDelta: 0.01,
                                                             longitudeDelta: 0.01
                                                         });

+ 3 - 3
service/chargeStationService.tsx

@@ -177,7 +177,6 @@ class ChargeStationService {
                 return response.data.data.map((station: any) => {
                     // const snapshotData = JSON.parse(station.snapshot);
                     const snapshotData = station.snapshot;
-
                     const availableConnectors = station?.Equipments?.reduce((count: number, equipment: any) => {
                         return (
                             count +
@@ -191,7 +190,8 @@ class ChargeStationService {
                         address: snapshotData.Address,
                         image: station?.image,
                         stationLng: snapshotData.StationLng,
-                        stationLat: snapshotData.StationLat
+                        stationLat: snapshotData.StationLat,
+                        pricemodel_id: station.pricemodel_id,
                     };
                 });
             }
@@ -592,7 +592,7 @@ class ChargeStationService {
             if (response.status === 200 || response.status === 201) {
                 return response.data as ElectricityPrice [];
             } else {
-                return [];
+                return [] as ElectricityPrice []
             }
         } catch (error) {
             console.log(error);

+ 7 - 6
service/type/chargeStationType.ts

@@ -207,12 +207,7 @@ export interface Special {
 	to: string;
 	price: number;
 }
-
-export interface ElectricityPrice {
-	createdAt: string;
-	updatedAt: string;
-	id: string;
-	event_name: string;
+export interface PriceWeek {
 	mon: Mon;
 	tue: Tue;
 	wed: Wed;
@@ -220,6 +215,12 @@ export interface ElectricityPrice {
 	fri: Fri;
 	sat: Sat;
 	sun: Sun;
+}
+export interface ElectricityPrice extends PriceWeek {
+	createdAt: string;
+	updatedAt: string;
+	id: string;
+	event_name: string;
 	special: Special;
 	is_active: boolean;
 	expire_date: string;