import { NavigationProp } from '@react-navigation/native'; import React, { FC, useCallback, useEffect, useState } from 'react'; import { ActivityIndicator } from 'react-native'; import { Header, Loading, PageWrapper } from 'src/components'; import { Colors } from 'src/theme'; import { FlashList } from '@shopify/flash-list'; import { StoreType, storage } from 'src/storage'; import { FilterButton, FilterModal } from '../../TravellersScreen/Components/FilterModal'; import { useGetUsersFromRegionMutation, useGetUsersWhoVisitedDareMutation, useGetUsersWhoVisitetRegionMutation } from '@api/regions'; import { Profile } from './Profile'; import { RankingDropdown } from '../../TravellersScreen/utils/types'; import { dataRanking } from '../../TravellersScreen/utils'; import { Ranking } from '../../TravellersScreen'; type Props = { navigation: NavigationProp; route: any; }; const UsersListScreen: FC = ({ navigation, route }) => { const regionId = route.params?.regionId; const type = route.params?.type; const { mutateAsync: getUsersFromRegion } = useGetUsersFromRegionMutation(); const { mutateAsync: getUsersWhoVisitedRegion } = useGetUsersWhoVisitetRegionMutation(); const { mutateAsync: getUsersWhoVisitedDare } = useGetUsersWhoVisitedDareMutation(); const token = storage.get('token', StoreType.STRING); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [selectedUsers, setSelectedUsers] = useState([]); const [filteredUsers, setFilteredUsers] = useState([]); const isFromHere = route.params?.isFromHere; const [isModalVisible, setModalVisible] = useState(false); const [confirmedValueRanking, setConfirmedValueRanking] = useState(); const [masterCountries, setMasterCountries] = useState([]); const [maxPages, setMaxPages] = useState(1); const [page, setPage] = useState(0); const [isLoadingMore, setIsLoadingMore] = useState(false); const [filter, setFilter] = useState<{ age: number | undefined; ranking: string | undefined; country: string | undefined; }>({ age: undefined, ranking: undefined, country: undefined }); useEffect(() => { setFilteredUsers(selectedUsers); }, [selectedUsers]); useEffect(() => { applySort(); }, [filter]); useEffect(() => { const getNextPage = async () => { if (isFromHere) { await getUsersFromRegion( { id: regionId, page, sort: filter.ranking, age: filter.age }, { onSuccess: (data) => { setIsLoadingMore(false); setUsers((prevState) => [...prevState, ...data?.data?.users]); setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]); } } ); } else if (type === 'nm') { await getUsersWhoVisitedRegion( { id: regionId, page, sort: filter.ranking, age: filter.age, country: filter.country }, { onSuccess: (data) => { setIsLoadingMore(false); setUsers((prevState) => [...prevState, ...data?.data?.users]); setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]); } } ); } else { await getUsersWhoVisitedDare( { id: regionId, page, sort: filter.ranking, age: filter.age, country: filter.country }, { onSuccess: (data) => { setIsLoadingMore(false); setUsers((prevState) => [...prevState, ...data?.data?.users]); setSelectedUsers((prevState) => [...prevState, ...data?.data?.users]); } } ); } }; if (page !== 0) { getNextPage(); } }, [page]); const applySort = async () => { if (isFromHere) { await getUsersFromRegion( { id: regionId, page, sort: filter.ranking, age: filter.age }, { onSuccess: (data) => { setUsers(data?.data?.users); setSelectedUsers(data?.data?.users); setMaxPages(data?.data?.max_pages); setLoading(false); } } ); } else if (type === 'nm') { await getUsersWhoVisitedRegion( { id: regionId, page, sort: filter.ranking, age: filter.age, country: filter.country }, { onSuccess: (data) => { setUsers(data?.data?.users); setSelectedUsers(data?.data?.users); setMaxPages(data?.data?.max_pages); setMasterCountries(convertData(data?.data?.countries) ?? []); setLoading(false); } } ); } else { await getUsersWhoVisitedDare( { id: regionId, page, sort: filter.ranking, age: filter.age, country: filter.country }, { onSuccess: (data) => { setUsers(data?.data?.users); setSelectedUsers(data?.data?.users); setMaxPages(data?.data?.max_pages); setMasterCountries(convertData(data?.data?.countries) ?? []); setLoading(false); } } ); } }; const convertData = (data: { [key: string]: { country: string; flag: string } }) => { return Object.entries(data).map(([key, value]) => ({ two: key, name: value.country, flag: value.flag })); }; const handleEndReached = useCallback(() => { if (users && page < maxPages && !isLoadingMore) { setIsLoadingMore(true); setPage((prevPage) => prevPage + 1); } }, [users, page]); if (loading) return ; const ListFooter = ({ isLoading }: { isLoading: boolean }) => isLoading ? : null; return (
setModalVisible(!isModalVisible)} />} /> ( )} keyExtractor={(item) => item.user_id.toString()} contentContainerStyle={{ paddingBottom: 16, paddingTop: 8 }} showsVerticalScrollIndicator={false} onEndReached={handleEndReached} onEndReachedThreshold={0.2} ListFooterComponent={} /> setModalVisible(value)} applyFilter={(filterAge, filterRanking, filterCountry) => { setConfirmedValueRanking(filterRanking); setPage(0); setFilter({ age: filterAge?.value ? +filterAge?.value : undefined, ranking: filterRanking?.name, country: filterCountry?.two }); setModalVisible(false); }} countriesData={masterCountries} /> ); }; export default UsersListScreen;