index.tsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  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. import {
  20. useGetUsersFromCountryMutation,
  21. useGetUsersWhoVisitedCountryMutation
  22. } from '@api/countries';
  23. import { useGetUsersWhoTickesSeriesMutation } from '@api/series';
  24. type Props = {
  25. navigation: NavigationProp<any>;
  26. route: any;
  27. };
  28. const UsersListScreen: FC<Props> = ({ navigation, route }) => {
  29. const id = route.params?.id;
  30. const type = route.params?.type;
  31. const { mutateAsync: getUsersFromRegion } = useGetUsersFromRegionMutation();
  32. const { mutateAsync: getUsersWhoVisitedRegion } = useGetUsersWhoVisitetRegionMutation();
  33. const { mutateAsync: getUsersWhoVisitedDare } = useGetUsersWhoVisitedDareMutation();
  34. const { mutateAsync: getUsersFromCountry } = useGetUsersFromCountryMutation();
  35. const { mutateAsync: getUsersWhoVisitedCountry } = useGetUsersWhoVisitedCountryMutation();
  36. const { mutateAsync: getFriends } = useGetFriendsMutation();
  37. const { mutateAsync: getUsersWhoTickedSeries } = useGetUsersWhoTickesSeriesMutation();
  38. const [users, setUsers] = useState<any[]>([]);
  39. const [loading, setLoading] = useState(true);
  40. const [selectedUsers, setSelectedUsers] = useState<any[]>([]);
  41. const [filteredUsers, setFilteredUsers] = useState<Ranking[]>([]);
  42. const isFromHere = route.params?.isFromHere;
  43. const [isModalVisible, setModalVisible] = useState(false);
  44. const [confirmedValueRanking, setConfirmedValueRanking] = useState<RankingDropdown | null>();
  45. const [masterCountries, setMasterCountries] = useState<any>([]);
  46. const [maxPages, setMaxPages] = useState(1);
  47. const [page, setPage] = useState(0);
  48. const [isLoadingMore, setIsLoadingMore] = useState(false);
  49. const [filter, setFilter] = useState<{
  50. age: number | undefined;
  51. ranking: string | undefined;
  52. country: string | undefined;
  53. }>({ age: undefined, ranking: undefined, country: undefined });
  54. useEffect(() => {
  55. setFilteredUsers(selectedUsers);
  56. }, [selectedUsers]);
  57. useEffect(() => {
  58. applySort();
  59. }, [filter]);
  60. useEffect(() => {
  61. const getNextPage = async () => {
  62. if (isFromHere && type === 'nm') {
  63. await getUsersFromRegion(
  64. {
  65. id,
  66. page,
  67. sort: filter.ranking,
  68. age: filter.age
  69. },
  70. {
  71. onSuccess: (data) => {
  72. setIsLoadingMore(false);
  73. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  74. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  75. }
  76. }
  77. );
  78. } else if (type === 'nm') {
  79. await getUsersWhoVisitedRegion(
  80. {
  81. id,
  82. page,
  83. sort: filter.ranking,
  84. age: filter.age,
  85. country: filter.country
  86. },
  87. {
  88. onSuccess: (data) => {
  89. setIsLoadingMore(false);
  90. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  91. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  92. }
  93. }
  94. );
  95. } else if (type === 'friends') {
  96. await getFriends(
  97. {
  98. id,
  99. page,
  100. sort: filter.ranking,
  101. age: filter.age,
  102. country: filter.country
  103. },
  104. {
  105. onSuccess: (data) => {
  106. setIsLoadingMore(false);
  107. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  108. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  109. }
  110. }
  111. );
  112. } else if (isFromHere && type === 'country') {
  113. await getUsersFromCountry(
  114. {
  115. id,
  116. page,
  117. sort: filter.ranking,
  118. age: filter.age
  119. },
  120. {
  121. onSuccess: (data) => {
  122. setIsLoadingMore(false);
  123. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  124. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  125. }
  126. }
  127. );
  128. } else if (type === 'country') {
  129. await getUsersWhoVisitedCountry(
  130. {
  131. id,
  132. page,
  133. sort: filter.ranking,
  134. age: filter.age,
  135. country: filter.country
  136. },
  137. {
  138. onSuccess: (data) => {
  139. setIsLoadingMore(false);
  140. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  141. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  142. }
  143. }
  144. );
  145. } else if (type === 'series') {
  146. await getUsersWhoTickedSeries(
  147. {
  148. id,
  149. page,
  150. sort: filter.ranking,
  151. age: filter.age,
  152. country: filter.country
  153. },
  154. {
  155. onSuccess: (data) => {
  156. setIsLoadingMore(false);
  157. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  158. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  159. }
  160. }
  161. );
  162. } else {
  163. await getUsersWhoVisitedDare(
  164. {
  165. id,
  166. page,
  167. sort: filter.ranking,
  168. age: filter.age,
  169. country: filter.country
  170. },
  171. {
  172. onSuccess: (data) => {
  173. setIsLoadingMore(false);
  174. setUsers((prevState) => [...prevState, ...data?.data?.users]);
  175. setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]);
  176. }
  177. }
  178. );
  179. }
  180. };
  181. if (page !== 0) {
  182. getNextPage();
  183. }
  184. }, [page]);
  185. const applySort = async () => {
  186. if (isFromHere && type === 'nm') {
  187. await getUsersFromRegion(
  188. {
  189. id,
  190. page,
  191. sort: filter.ranking,
  192. age: filter.age
  193. },
  194. {
  195. onSuccess: (data) => {
  196. setUsers(data?.data?.users);
  197. setSelectedUsers(data?.data?.users);
  198. setMaxPages(data?.data?.max_pages);
  199. setLoading(false);
  200. }
  201. }
  202. );
  203. } else if (type === 'nm') {
  204. await getUsersWhoVisitedRegion(
  205. {
  206. id,
  207. page,
  208. sort: filter.ranking,
  209. age: filter.age,
  210. country: filter.country
  211. },
  212. {
  213. onSuccess: (data) => {
  214. setUsers(data?.data?.users);
  215. setSelectedUsers(data?.data?.users);
  216. setMaxPages(data?.data?.max_pages);
  217. !masterCountries.length && setMasterCountries(convertData(data?.data?.countries) ?? []);
  218. setLoading(false);
  219. }
  220. }
  221. );
  222. } else if (isFromHere && type === 'country') {
  223. await getUsersFromCountry(
  224. {
  225. id,
  226. page,
  227. sort: filter.ranking,
  228. age: filter.age
  229. },
  230. {
  231. onSuccess: (data) => {
  232. setUsers(data?.data?.users);
  233. setSelectedUsers(data?.data?.users);
  234. setMaxPages(data?.data?.max_pages);
  235. setLoading(false);
  236. }
  237. }
  238. );
  239. } else if (type === 'country') {
  240. await getUsersWhoVisitedCountry(
  241. {
  242. id,
  243. page,
  244. sort: filter.ranking,
  245. age: filter.age,
  246. country: filter.country
  247. },
  248. {
  249. onSuccess: (data) => {
  250. setUsers(data?.data?.users);
  251. setSelectedUsers(data?.data?.users);
  252. setMaxPages(data?.data?.max_pages);
  253. !masterCountries?.length &&
  254. setMasterCountries(convertData(data?.data?.countries) ?? []);
  255. setLoading(false);
  256. }
  257. }
  258. );
  259. } else if (type === 'friends') {
  260. await getFriends(
  261. {
  262. id,
  263. page,
  264. sort: filter.ranking,
  265. age: filter.age,
  266. country: filter.country
  267. },
  268. {
  269. onSuccess: (data) => {
  270. setUsers(data?.data?.users);
  271. setSelectedUsers(data?.data?.users);
  272. setMaxPages(data?.data?.max_pages);
  273. !masterCountries?.length &&
  274. setMasterCountries(convertData(data?.data?.countries) ?? []);
  275. setLoading(false);
  276. }
  277. }
  278. );
  279. } else if (type === 'series') {
  280. await getUsersWhoTickedSeries(
  281. {
  282. id,
  283. page,
  284. sort: filter.ranking,
  285. age: filter.age,
  286. country: filter.country
  287. },
  288. {
  289. onSuccess: (data) => {
  290. setUsers(data?.data?.users);
  291. setSelectedUsers(data?.data?.users);
  292. setMaxPages(data?.data?.max_pages);
  293. !masterCountries?.length &&
  294. setMasterCountries(convertData(data?.data?.countries) ?? []);
  295. setLoading(false);
  296. }
  297. }
  298. );
  299. } else {
  300. await getUsersWhoVisitedDare(
  301. {
  302. id,
  303. page,
  304. sort: filter.ranking,
  305. age: filter.age,
  306. country: filter.country
  307. },
  308. {
  309. onSuccess: (data) => {
  310. setUsers(data?.data?.users);
  311. setSelectedUsers(data?.data?.users);
  312. setMaxPages(data?.data?.max_pages);
  313. !masterCountries?.length &&
  314. setMasterCountries(convertData(data?.data?.countries) ?? []);
  315. setLoading(false);
  316. }
  317. }
  318. );
  319. }
  320. };
  321. const convertData = (data: { [key: string]: { country: string; flag: string } }) => {
  322. let formatedCountries = [{ two: 'all', name: 'ALL', flag: '' }];
  323. data &&
  324. formatedCountries.push(
  325. ...Object.entries(data).map(([key, value]) => ({
  326. two: key,
  327. name: value.country,
  328. flag: value.flag
  329. }))
  330. );
  331. return formatedCountries;
  332. };
  333. const handleEndReached = useCallback(() => {
  334. if (users && page < maxPages && !isLoadingMore) {
  335. setIsLoadingMore(true);
  336. setPage((prevPage) => prevPage + 1);
  337. }
  338. }, [users, page]);
  339. if (loading) return <Loading />;
  340. const ListFooter = ({ isLoading }: { isLoading: boolean }) =>
  341. isLoading ? <ActivityIndicator size="large" color={Colors.DARK_BLUE} /> : null;
  342. return (
  343. <PageWrapper>
  344. <Header
  345. label={isFromHere ? 'From here' : type === 'friends' ? 'Friends' : 'Been here'}
  346. rightElement={<FilterButton onPress={() => setModalVisible(!isModalVisible)} />}
  347. />
  348. <FlashList
  349. viewabilityConfig={{
  350. waitForInteraction: true,
  351. itemVisiblePercentThreshold: 50,
  352. minimumViewTime: 1000
  353. }}
  354. data={filteredUsers}
  355. renderItem={({ item, index }) => (
  356. <Profile
  357. userId={item.user_id}
  358. key={index}
  359. index={index}
  360. first_name={item.first_name}
  361. last_name={item.last_name}
  362. avatar={item.avatar}
  363. date_of_birth={item.age}
  364. homebase_flag={item.flag1}
  365. homebase2_flag={item.flag2}
  366. score={[
  367. item.score_nm,
  368. item.score_un,
  369. item.score_unp,
  370. item.score_dare,
  371. item.score_tcc,
  372. item.score_deep,
  373. item.score_slow,
  374. item.score_yes,
  375. item.score_kye,
  376. item.score_whs,
  377. item.score_tbt
  378. ]}
  379. active_score={
  380. confirmedValueRanking ? confirmedValueRanking.value - 1 : dataRanking[0].value - 1
  381. }
  382. tbt_score={item.score_tbt}
  383. tbt_rank={item.rank_tbt}
  384. badge_tbt={item.badge_tbt}
  385. badge_1281={item.badge_1281}
  386. badge_un={item.badge_un}
  387. badge_un_25={item.badge_un_25}
  388. badge_un_50={item.badge_un_50}
  389. badge_un_75={item.badge_un_75}
  390. badge_un_100={item.badge_un_100}
  391. badge_un_150={item.badge_un_150}
  392. badge_premium={item.badge_premium}
  393. auth={item.auth}
  394. />
  395. )}
  396. keyExtractor={(item) => item.user_id.toString()}
  397. contentContainerStyle={{ paddingBottom: 16, paddingTop: 8 }}
  398. showsVerticalScrollIndicator={false}
  399. onEndReached={handleEndReached}
  400. onEndReachedThreshold={0.2}
  401. ListFooterComponent={<ListFooter isLoading={isLoadingMore} />}
  402. />
  403. <FilterModal
  404. isModalVisible={isModalVisible}
  405. setModalVisible={(value) => setModalVisible(value)}
  406. applyFilter={(filterAge, filterRanking, filterCountry) => {
  407. setConfirmedValueRanking(filterRanking);
  408. setPage(0);
  409. setFilter({
  410. age: filterAge?.value ? +filterAge?.value : undefined,
  411. ranking: filterRanking?.name,
  412. country:
  413. filterCountry?.two && filterCountry?.two !== 'all' ? filterCountry?.two : undefined
  414. });
  415. setModalVisible(false);
  416. }}
  417. countriesData={masterCountries}
  418. isCountryHidden={isFromHere}
  419. />
  420. </PageWrapper>
  421. );
  422. };
  423. export default UsersListScreen;