interface AlphabetSection {
letter: string;
brands: CarBrand[];
}
import React, { useEffect, useState } from 'react';
import { View, Text, Image, Pressable, StyleSheet, ScrollView, ActivityIndicator } from 'react-native';
import { FlashList } from '@shopify/flash-list';
import { router } from 'expo-router';
import useVehicleStore from '../../../../../providers/vehicle_store';
import { PreviousPageBlackSvg } from '../../../../../component/global/SVG';
import { SafeAreaView } from 'react-native-safe-area-context';
import { chargeStationService } from '../../../../../service/chargeStationService';
const SetVehiclesOne = () => {
const [loading, setLoading] = useState(true);
const [carData, setCarData] = useState();
const [extractedCarNameAndImgUrl, setExtractedCarNameAndImgUrl] = useState('');
const [processedCarData, setProcessedCarData] = useState([]);
const {
vehicleBrand,
vehicleModel,
BrandID,
ModelID,
licensePlate,
setVehicleBrand,
setVehicleModel,
setBrandID,
setModelID,
setLicensePlate
} = useVehicleStore();
//this uses getCarBrand to create an array of object with 2 keys: name and img_url
useEffect(() => {
const fetchCarBrand = async () => {
try {
const response = await chargeStationService.fetchCarBrand();
if (response) {
const processedData = await Promise.all(
response.data.map(async (car) => ({
...car,
logo: await chargeStationService.getProcessedCarImageUrl(car.img_url)
}))
);
setProcessedCarData(processedData);
}
} catch (error) {
console.log(error);
} finally {
setLoading(false);
}
};
fetchCarBrand();
}, []);
useEffect(() => {
console.log('Zustand VehicleBrand', vehicleBrand);
console.log('Zustand BrandID', BrandID);
console.log('Zustand VehicleModel', vehicleModel);
console.log('Zustand ModelID', ModelID);
}, [processedCarData]);
const renderBrandItem = ({ item: brand }: { item }) => (
{
setVehicleBrand(brand.name);
setBrandID(brand.id);
router.push({
pathname: 'setVehiclesTwo',
params: {
brandId: brand.id.toString(),
brandName: brand.name,
carTypes: JSON.stringify(brand.car_types)
}
});
}}
>
{brand.name}
);
const renderAlphabetSection = ({ item: section }: { item: AlphabetSection }) => (
{section.letter}
{section.brands.map((brand) => renderBrandItem({ item: brand }))}
);
return (
{
if (router.canGoBack()) {
router.back();
} else {
router.replace('/accountMainPage');
}
}}
>
選擇品牌
{loading ? (
) : (
a.name.localeCompare(b.name))
.reduce((acc, brand) => {
const letter = brand.name[0].toUpperCase();
const existingSection = acc.find((section) => section.letter === letter);
if (existingSection) {
existingSection.brands.push(brand);
} else {
acc.push({ letter, brands: [brand] });
}
return acc;
}, [] as AlphabetSection[])}
renderItem={renderAlphabetSection}
keyExtractor={(item) => item.letter}
/>
)}
{/*
{
const letter = brand.name[0].toUpperCase();
const existingSection = acc.find((section) => section.letter === letter);
if (existingSection) {
existingSection.brands.push(brand);
} else {
acc.push({ letter, brands: [brand] });
}
return acc;
}, [] as AlphabetSection[])}
renderItem={renderAlphabetSection}
keyExtractor={(item) => item.letter}
/>
*/}
);
};
const styles = StyleSheet.create({
letterHeader: {
backgroundColor: '#E3F2F8',
padding: 10,
marginVertical: 10
},
letterText: {
color: '#02677D',
fontSize: 14,
fontWeight: 'bold'
},
brandRow: {
flexDirection: 'row',
flexWrap: 'wrap'
},
brandItem: {
width: '33.33%',
alignItems: 'center',
padding: 10
},
logo: {
width: 80,
height: 80
},
brandName: {
marginTop: 5,
textAlign: 'center'
}
});
export default SetVehiclesOne;