index.tsx 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. import { NavigationProp } from '@react-navigation/native';
  2. import React, { FC, useCallback, useEffect, useState } from 'react';
  3. import { ActivityIndicator } from 'react-native';
  4. import { Header, Loading, PageWrapper } from 'src/components';
  5. import { Colors } from 'src/theme';
  6. import { FlashList } from '@shopify/flash-list';
  7. import { StoreType, storage } from 'src/storage';
  8. import { FilterButton, FilterModal } from '../../TravellersScreen/Components/FilterModal';
  9. import {
  10. useGetUsersFromRegionMutation,
  11. useGetUsersWhoVisitedDareMutation,
  12. useGetUsersWhoVisitetRegionMutation
  13. } from '@api/regions';
  14. import { Profile } from './Profile';
  15. import { RankingDropdown } from '../../TravellersScreen/utils/types';
  16. import { dataRanking } from '../../TravellersScreen/utils';
  17. import { Ranking } from '../../TravellersScreen';
  18. import { useGetFriendsMutation } from '@api/friends';
  19. type Props = {
  20. navigation: NavigationProp<any>;
  21. route: any;
  22. };
  23. const UsersListScreen: FC<Props> = ({ navigation, route }) => {
  24. const id = route.params?.id;
  25. const type = route.params?.type;
  26. const { mutateAsync: getUsersFromRegion } = useGetUsersFromRegionMutation();
  27. const { mutateAsync: getUsersWhoVisitedRegion } = useGetUsersWhoVisitetRegionMutation();
  28. const { mutateAsync: getUsersWhoVisitedDare } = useGetUsersWhoVisitedDareMutation();
  29. const { mutateAsync: getFriends } = useGetFriendsMutation();
  30. const token = storage.get('token', StoreType.STRING);
  31. const [users, setUsers] = useState<any[]>([]);
  32. const [loading, setLoading] = useState(true);
  33. const [selectedUsers, setSelectedUsers] = useState<any[]>([]);
  34. const [filteredUsers, setFilteredUsers] = useState<Ranking[]>([]);
  35. const isFromHere = route.params?.isFromHere;
  36. const [isModalVisible, setModalVisible] = useState(false);
  37. const [confirmedValueRanking, setConfirmedValueRanking] = useState<RankingDropdown | null>();
  38. const [masterCountries, setMasterCountries] = useState<any>([]);
  39. const [maxPages, setMaxPages] = useState(1);
  40. const [page, setPage] = useState(0);
  41. const [isLoadingMore, setIsLoadingMore] = useState(false);
  42. const [filter, setFilter] = useState<{
  43. age: number | undefined;
  44. ranking: string | undefined;
  45. country: string | undefined;
  46. }>({ age: undefined, ranking: undefined, country: undefined });
  47. useEffect(() => {
  48. setFilteredUsers(selectedUsers);
  49. }, [selectedUsers]);
  50. useEffect(() => {
  51. applySort();
  52. }, [filter]);
  53. useEffect(() => {
  54. const getNextPage = async () => {
  55. if (isFromHere) {
  56. await getUsersFromRegion(
  57. {
  58. id,
  59. page,
  60. sort: filter.ranking,
  61. age: filter.age
  62. },
  63. {
  64. onSuccess: (data) => {
  65. setIsLoadingMore(false);
  66. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  67. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  68. }
  69. }
  70. );
  71. } else if (type === 'nm') {
  72. await getUsersWhoVisitedRegion(
  73. {
  74. id,
  75. page,
  76. sort: filter.ranking,
  77. age: filter.age,
  78. country: filter.country
  79. },
  80. {
  81. onSuccess: (data) => {
  82. setIsLoadingMore(false);
  83. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  84. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  85. }
  86. }
  87. );
  88. } else if (type === 'friends') {
  89. await getFriends(
  90. {
  91. id,
  92. page,
  93. sort: filter.ranking,
  94. age: filter.age,
  95. country: filter.country
  96. },
  97. {
  98. onSuccess: (data) => {
  99. setIsLoadingMore(false);
  100. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  101. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  102. }
  103. }
  104. );
  105. } else {
  106. await getUsersWhoVisitedDare(
  107. {
  108. id,
  109. page,
  110. sort: filter.ranking,
  111. age: filter.age,
  112. country: filter.country
  113. },
  114. {
  115. onSuccess: (data) => {
  116. setIsLoadingMore(false);
  117. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  118. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  119. }
  120. }
  121. );
  122. }
  123. };
  124. if (page !== 0) {
  125. getNextPage();
  126. }
  127. }, [page]);
  128. const applySort = async () => {
  129. if (isFromHere) {
  130. await getUsersFromRegion(
  131. {
  132. id,
  133. page,
  134. sort: filter.ranking,
  135. age: filter.age
  136. },
  137. {
  138. onSuccess: (data) => {
  139. setUsers(data?.data?.users);
  140. setSelectedUsers(data?.data?.users);
  141. setMaxPages(data?.data?.max_pages);
  142. setLoading(false);
  143. }
  144. }
  145. );
  146. } else if (type === 'nm') {
  147. await getUsersWhoVisitedRegion(
  148. {
  149. id,
  150. page,
  151. sort: filter.ranking,
  152. age: filter.age,
  153. country: filter.country
  154. },
  155. {
  156. onSuccess: (data) => {
  157. setUsers(data?.data?.users);
  158. setSelectedUsers(data?.data?.users);
  159. setMaxPages(data?.data?.max_pages);
  160. !masterCountries.length && setMasterCountries(convertData(data?.data?.countries) ?? []);
  161. setLoading(false);
  162. }
  163. }
  164. );
  165. } else if (type === 'friends') {
  166. await getFriends(
  167. {
  168. id,
  169. page,
  170. sort: filter.ranking,
  171. age: filter.age,
  172. country: filter.country
  173. },
  174. {
  175. onSuccess: (data) => {
  176. setUsers(data?.data?.users);
  177. setSelectedUsers(data?.data?.users);
  178. setMaxPages(data?.data?.max_pages);
  179. !masterCountries.length && setMasterCountries(convertData(data?.data?.countries) ?? []);
  180. setLoading(false);
  181. }
  182. }
  183. );
  184. } else {
  185. await getUsersWhoVisitedDare(
  186. {
  187. id,
  188. page,
  189. sort: filter.ranking,
  190. age: filter.age,
  191. country: filter.country
  192. },
  193. {
  194. onSuccess: (data) => {
  195. setUsers(data?.data?.users);
  196. setSelectedUsers(data?.data?.users);
  197. setMaxPages(data?.data?.max_pages);
  198. !masterCountries.length && setMasterCountries(convertData(data?.data?.countries) ?? []);
  199. setLoading(false);
  200. }
  201. }
  202. );
  203. }
  204. };
  205. const convertData = (data: { [key: string]: { country: string; flag: string } }) => {
  206. let formatedCountries = [{ two: 'all', name: 'ALL', flag: '' }];
  207. formatedCountries.push(
  208. ...Object.entries(data).map(([key, value]) => ({
  209. two: key,
  210. name: value.country,
  211. flag: value.flag
  212. }))
  213. );
  214. return formatedCountries;
  215. };
  216. const handleEndReached = useCallback(() => {
  217. if (users && page < maxPages && !isLoadingMore) {
  218. setIsLoadingMore(true);
  219. setPage((prevPage) => prevPage + 1);
  220. }
  221. }, [users, page]);
  222. if (loading) return <Loading />;
  223. const ListFooter = ({ isLoading }: { isLoading: boolean }) =>
  224. isLoading ? <ActivityIndicator size="large" color={Colors.DARK_BLUE} /> : null;
  225. return (
  226. <PageWrapper>
  227. <Header
  228. label={isFromHere ? 'From here' : type === 'friends' ? 'Friends' : 'Been here'}
  229. rightElement={<FilterButton onPress={() => setModalVisible(!isModalVisible)} />}
  230. />
  231. <FlashList
  232. viewabilityConfig={{
  233. waitForInteraction: true,
  234. itemVisiblePercentThreshold: 50,
  235. minimumViewTime: 1000
  236. }}
  237. estimatedItemSize={50}
  238. data={filteredUsers}
  239. renderItem={({ item, index }) => (
  240. <Profile
  241. userId={item.user_id}
  242. key={index}
  243. index={index}
  244. first_name={item.first_name}
  245. last_name={item.last_name}
  246. avatar={item.avatar}
  247. date_of_birth={item.age}
  248. homebase_flag={item.flag1}
  249. homebase2_flag={item.flag2}
  250. score={[
  251. item.score_nm,
  252. item.score_dare,
  253. item.score_un,
  254. item.score_unp,
  255. item.score_tcc,
  256. item.score_deep,
  257. item.score_yes,
  258. item.score_slow,
  259. item.score_whs,
  260. item.score_kye,
  261. item.score_tbt
  262. ]}
  263. active_score={
  264. confirmedValueRanking ? confirmedValueRanking.value - 1 : dataRanking[0].value - 1
  265. }
  266. tbt_score={item.score_tbt}
  267. tbt_rank={item.rank_tbt}
  268. badge_tbt={item.badge_tbt}
  269. badge_1281={item.badge_1281}
  270. badge_un={item.badge_un}
  271. auth={item.auth}
  272. />
  273. )}
  274. keyExtractor={(item) => item.user_id.toString()}
  275. contentContainerStyle={{ paddingBottom: 16, paddingTop: 8 }}
  276. showsVerticalScrollIndicator={false}
  277. onEndReached={handleEndReached}
  278. onEndReachedThreshold={0.2}
  279. ListFooterComponent={<ListFooter isLoading={isLoadingMore} />}
  280. />
  281. <FilterModal
  282. isModalVisible={isModalVisible}
  283. setModalVisible={(value) => setModalVisible(value)}
  284. applyFilter={(filterAge, filterRanking, filterCountry) => {
  285. setConfirmedValueRanking(filterRanking);
  286. setPage(0);
  287. setFilter({
  288. age: filterAge?.value ? +filterAge?.value : undefined,
  289. ranking: filterRanking?.name,
  290. country:
  291. filterCountry?.two && filterCountry?.two !== 'all' ? filterCountry?.two : undefined
  292. });
  293. setModalVisible(false);
  294. }}
  295. countriesData={masterCountries}
  296. isCountryHidden={isFromHere}
  297. />
  298. </PageWrapper>
  299. );
  300. };
  301. export default UsersListScreen;