setVehiclesTwo.tsx 6.0 KB

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