registerChooseVehiclesTwo.tsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. interface CarModel {
  2. name: string;
  3. year: number;
  4. id: string;
  5. }
  6. import React, { useEffect, useState } from 'react';
  7. import { View, Text, Image, Pressable, StyleSheet, ScrollView } from 'react-native';
  8. import { FlashList } from '@shopify/flash-list';
  9. import { router, useLocalSearchParams } from 'expo-router';
  10. import { SafeAreaView } from 'react-native-safe-area-context';
  11. import { useNavigation } from '@react-navigation/native';
  12. import { set } from 'date-fns';
  13. import useVehicleStore from '../../providers/vehicle_store';
  14. import { PreviousPageBlackSvg } from '../../component/global/SVG';
  15. interface CarType {
  16. id: number;
  17. name: string;
  18. }
  19. const RegisterChooseVehiclesTwo = () => {
  20. const { brandId, brandName, carTypes } = useLocalSearchParams<{
  21. brandId: string;
  22. brandName: string;
  23. carTypes: string;
  24. }>();
  25. const [parsedCarTypes, setParsedCarTypes] = useState<CarType[]>([]);
  26. useEffect(() => {
  27. if (carTypes) {
  28. const parsed = JSON.parse(carTypes);
  29. setParsedCarTypes(parsed);
  30. console.log(parsed);
  31. }
  32. }, [carTypes]);
  33. const {
  34. vehicleBrand,
  35. vehicleModel,
  36. BrandID,
  37. ModelID,
  38. licensePlate,
  39. setVehicleBrand,
  40. setVehicleModel,
  41. setBrandID,
  42. setModelID,
  43. setLicensePlate
  44. } = useVehicleStore();
  45. const logoPath = `../../../../../assets/${vehicleBrand.toLowerCase()}.png`;
  46. const [carModels, setCarModels] = useState<CarModel[]>([]);
  47. const navigation = useNavigation();
  48. // const brandLogos = {
  49. // audi: require('../../../../../assets/audi.png'),
  50. // acura: require('../../../../../assets/acura.png'),
  51. // bmw: require('../../../../../assets/bmw.png'),
  52. // byd: require('../../../../../assets/byd.png'),
  53. // chevrolet: require('../../../../../assets/chevrolet.png'),
  54. // cadillac: require('../../../../../assets/cadillac.png'),
  55. // ford: require('../../../../../assets/ford.png'),
  56. // fiat: require('../../../../../assets/fiat.png'),
  57. // genesis: require('../../../../../assets/genesis.png'),
  58. // honda: require('../../../../../assets/honda.png'),
  59. // hyundai: require('../../../../../assets/hyundai.png'),
  60. // jaguar: require('../../../../../assets/jaguar.png'),
  61. // kia: require('../../../../../assets/kia.png'),
  62. // 'mercedes-benz': require('../../../../../assets/benz.png'),
  63. // mini: require('../../../../../assets/mini.png'),
  64. // mazda: require('../../../../../assets/mazda.png'),
  65. // nissan: require('../../../../../assets/nissan.png'),
  66. // porsche: require('../../../../../assets/porsche.png'),
  67. // subaru: require('../../../../../assets/subaru.png'),
  68. // tesla: require('../../../../../assets/tesla.png'),
  69. // toyota: require('../../../../../assets/toyota.png'),
  70. // volkswagen: require('../../../../../assets/volkswagen.png'),
  71. // volvo: require('../../../../../assets/volvo.png'),
  72. // default: require('../../../../../assets/bmw.png') // Make sure to add a default logo
  73. // };
  74. // const getBrandLogo = (brand: string) => {
  75. // const logoKey = brand.toLowerCase().replace(/\s+/g, '-');
  76. // return brandLogos[logoKey] || brandLogos.default;
  77. // };
  78. const renderModelItem = ({ item: model }: { item: CarModel }) => (
  79. <>
  80. <Pressable
  81. className="flex-1 items-center justify-center py-6"
  82. onPress={() => {
  83. console.log(`Selected model: ${model.name}`);
  84. console.log(`selected type id: ${model.id}`);
  85. setVehicleModel(model.name);
  86. setModelID(model.id);
  87. navigation.pop(2);
  88. }}
  89. >
  90. <Text style={styles.modelYear} className="pb-1">
  91. {model.year}
  92. </Text>
  93. <Text style={styles.modelName}>{model.name}</Text>
  94. </Pressable>
  95. <View className="border-t mx-4 border-[#CCCCCC]" />
  96. </>
  97. );
  98. return (
  99. <SafeAreaView className="flex-1 bg-white" edges={['top', 'right', 'left']}>
  100. <ScrollView showsVerticalScrollIndicator={false} className="flex-1 mx-[5%]">
  101. <View style={{ marginTop: 25 }}>
  102. <Pressable
  103. className="self-start"
  104. onPress={() => {
  105. if (router.canGoBack()) {
  106. router.back();
  107. } else {
  108. router.replace('/accountMainPage');
  109. }
  110. }}
  111. >
  112. <PreviousPageBlackSvg />
  113. </Pressable>
  114. <Text
  115. style={{
  116. fontSize: 30,
  117. marginTop: 25,
  118. marginBottom: 10
  119. }}
  120. >
  121. 選擇車輛型號
  122. </Text>
  123. <View className="flex flex-row items-center space-x-8">
  124. {/* <Image source={getBrandLogo(vehicleBrand)} className="w-20 h-20 " resizeMode="contain" /> */}
  125. <Text className="text-4xl italic tracking-wider">{vehicleBrand}</Text>
  126. </View>
  127. </View>
  128. <View className="flex-1">
  129. <FlashList
  130. data={parsedCarTypes}
  131. renderItem={renderModelItem}
  132. keyExtractor={(item) => item.name}
  133. estimatedItemSize={30}
  134. numColumns={1}
  135. />
  136. </View>
  137. </ScrollView>
  138. </SafeAreaView>
  139. );
  140. };
  141. const styles = StyleSheet.create({
  142. modelItem: {
  143. flex: 1,
  144. height: 100,
  145. justifyContent: 'center',
  146. alignItems: 'center',
  147. backgroundColor: '#F0F0F0',
  148. margin: 5,
  149. borderRadius: 10
  150. },
  151. modelName: {
  152. fontSize: 16,
  153. fontWeight: 'bold'
  154. },
  155. modelYear: {
  156. fontSize: 14,
  157. color: '#666'
  158. }
  159. });
  160. export default RegisterChooseVehiclesTwo;