registerChooseVehiclesTwo.tsx 6.0 KB

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