setVehiclesTwo.tsx 5.8 KB

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