NmRegionItem.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import React from 'react';
  2. import { View, Text, TouchableOpacity, Image } from 'react-native';
  3. import { NmRegion } from '../../utils/types';
  4. import { Colors } from 'src/theme';
  5. import { styles } from './styles';
  6. import { API_HOST } from 'src/constants';
  7. import useRegionData from '../../utils/useRegionData';
  8. import formatNumber from '../../utils/formatNumber';
  9. import MarkIcon from 'assets/icons/mark.svg';
  10. import EditSvg from 'assets/icons/travels-screens/pen-to-square.svg';
  11. import CalendarSvg from 'assets/icons/travels-screens/calendar.svg';
  12. import RotateSvg from 'assets/icons/travels-screens/rotate.svg';
  13. export const NmRegionItem = React.memo(
  14. ({
  15. item,
  16. openEditModal,
  17. updateNM,
  18. token
  19. }: {
  20. item: NmRegion;
  21. openEditModal: (item: NmRegion) => void;
  22. updateNM: (
  23. region: number,
  24. first: number,
  25. last: number,
  26. visits: number,
  27. quality: number
  28. ) => void;
  29. token: string;
  30. }) => {
  31. const [name, ...rest] = item.region_name?.split(/ – | - /);
  32. const subname = rest?.join(' - ');
  33. const { regionData, avatars } = useRegionData(item.id);
  34. const regionImg = regionData ? JSON.parse(regionData?.region_photos)[0] : '';
  35. const formattedCount = regionData ? formatNumber(regionData?.visitors_count) : 0;
  36. return (
  37. <View style={styles.regionItem}>
  38. <View style={styles.regionItemHeader}>
  39. {regionImg && (
  40. <Image source={{ uri: regionImg, cache: 'force-cache' }} style={styles.regionImage} />
  41. )}
  42. <View style={{ gap: 6, flex: 1 }}>
  43. <Text style={styles.regionItemName}>{name}</Text>
  44. <Text style={styles.regionItemSubname}>{subname}</Text>
  45. </View>
  46. <View style={{ flexDirection: 'row', alignSelf: 'flex-start' }}>
  47. <Image
  48. source={{ uri: `${API_HOST}/img/flags_new/${item.flag_1}` }}
  49. style={styles.flag}
  50. />
  51. {item.flag_2 && (
  52. <Image
  53. source={{ uri: `${API_HOST}/img/flags_new/${item.flag_2}` }}
  54. style={[styles.flag, { marginLeft: -5 }]}
  55. />
  56. )}
  57. </View>
  58. </View>
  59. <View style={styles.divider} />
  60. <View style={styles.regionItemContent}>
  61. {item.visits > 0 && item.year > 1 && token && (
  62. <View style={styles.infoContent}>
  63. <CalendarSvg height={18} width={18} fill={Colors.DARK_BLUE} />
  64. <Text style={styles.visitedButtonText}>{item.year}</Text>
  65. </View>
  66. )}
  67. {item.visits > 0 && token && (
  68. <View style={styles.infoContent}>
  69. <RotateSvg fill={Colors.DARK_BLUE} />
  70. <Text style={styles.visitedButtonText}>
  71. {item.visits >= 10 ? '10+' : item.visits}
  72. </Text>
  73. </View>
  74. )}
  75. {(item.visits <= 0 || !token) && avatars && (
  76. <View style={styles.userContainer}>
  77. <View style={styles.userImageContainer}>
  78. {avatars &&
  79. avatars?.map((avatar, index) => (
  80. <Image key={index} source={{ uri: avatar }} style={styles.userImage} />
  81. ))}
  82. <View style={styles.userCountContainer}>
  83. <Text style={styles.userCount}>{formattedCount}</Text>
  84. </View>
  85. </View>
  86. </View>
  87. )}
  88. {token && (
  89. <View style={styles.btnContainer}>
  90. {item.visits > 0 ? (
  91. <TouchableOpacity onPress={() => openEditModal(item)} style={styles.editBtn}>
  92. <EditSvg width={14} height={14} />
  93. </TouchableOpacity>
  94. ) : null}
  95. <TouchableOpacity
  96. style={[
  97. styles.btn,
  98. item.visits > 0 ? styles.visitedButton : styles.markVisitedButton
  99. ]}
  100. onPress={() =>
  101. updateNM(
  102. item.id,
  103. item.visits > 0 ? 0 : 1,
  104. item.visits > 0 ? 0 : 1,
  105. item.visits > 0 ? 0 : 1,
  106. 3
  107. )
  108. }
  109. >
  110. {item.visits > 0 ? (
  111. <View style={styles.visitedContainer}>
  112. <MarkIcon width={16} height={16} />
  113. <Text style={styles.visitedButtonText}>Visited</Text>
  114. </View>
  115. ) : (
  116. <Text style={[styles.markVisitedButtonText]}>Mark visited</Text>
  117. )}
  118. </TouchableOpacity>
  119. </View>
  120. )}
  121. </View>
  122. </View>
  123. );
  124. }
  125. );