123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- import React, { FC, useEffect, useState } from 'react';
- import { View, StyleSheet } from 'react-native';
- import { NavigationProp } from '@react-navigation/native';
- import { PageWrapper, Header, Input, WarningModal } from 'src/components';
- import { FlashList } from '@shopify/flash-list';
- import SearchIcon from 'assets/icons/search.svg';
- import { applyModalSort, dataRanking } from '../../TravellersScreen/utils';
- import { RankingDropdown } from '../../TravellersScreen/utils/types';
- import { Profile } from '../../MapScreen/UsersListScreen/Profile';
- import { FilterButton, FilterModal } from '../../TravellersScreen/Components/FilterModal';
- import { usePostGetCountriesRanking } from '@api/ranking';
- import OptionsModal from '../Components/OptionsModal';
- import { SheetManager } from 'react-native-actions-sheet';
- import { storage, StoreType } from 'src/storage';
- type Props = {
- navigation: NavigationProp<any>;
- route: any;
- };
- const ParticipantsListScreen: FC<Props> = ({ navigation, route }) => {
- const { participants, eventId, isHost } = route.params;
- const token = storage.get('token', StoreType.STRING);
- const { data: masterCountries } = usePostGetCountriesRanking();
- const [allParticipants, setAllParticipants] = useState(participants);
- const [searchQuery, setSearchQuery] = useState('');
- const [filteredData, setFilteredData] = useState<any[]>([]);
- const [confirmedValueRanking, setConfirmedValueRanking] = useState<RankingDropdown | null>();
- const [isModalVisible, setModalVisible] = useState(false);
- const [modalState, setModalState] = useState({
- isWarningVisible: false,
- title: '',
- buttonTitle: '',
- message: '',
- action: () => {}
- });
- useEffect(() => {
- if (allParticipants) {
- setFilteredData(allParticipants);
- }
- }, [allParticipants]);
- const handleSearch = (text: string) => {
- if (text && allParticipants) {
- const searchData =
- allParticipants?.filter((item: any) => {
- const itemData = item.first_name
- ? item.first_name.toLowerCase() + ' ' + item.last_name?.toLowerCase()
- : ''.toLowerCase();
- const textData = text.toLowerCase();
- return itemData.indexOf(textData) > -1;
- }) ?? [];
- setFilteredData(searchData);
- setSearchQuery(text);
- } else {
- setFilteredData(allParticipants ?? []);
- setSearchQuery(text);
- }
- };
- const handleFilterParticipants = (userId: number) => {
- setAllParticipants(allParticipants.filter((p: any) => p.user_id !== userId));
- };
- const handleOptionPress = (user: any) => {
- SheetManager.show('host-options-modal', {
- payload: {
- eventId,
- userId: user.user_id,
- name: user.first_name + ' ' + user.last_name,
- token,
- filterParticipants: () => handleFilterParticipants(user.user_id),
- setIsWarningVisible: setModalState
- } as any
- });
- };
- return (
- <PageWrapper>
- <Header
- label="Participants"
- rightElement={<FilterButton onPress={() => setModalVisible(!isModalVisible)} />}
- />
- <View style={styles.container}>
- <Input
- inputMode={'search'}
- placeholder={'Search nomads'}
- onChange={handleSearch}
- value={searchQuery}
- icon={<SearchIcon fill={'#C8C8C8'} width={14} height={14} />}
- />
- <FlashList
- viewabilityConfig={{
- waitForInteraction: true,
- itemVisiblePercentThreshold: 50,
- minimumViewTime: 1000
- }}
- estimatedItemSize={50}
- data={filteredData || []}
- renderItem={({ item, index }) => (
- <Profile
- withMenu={isHost}
- onPressOption={() => handleOptionPress(item)}
- userId={item.user_id}
- key={index}
- index={index}
- first_name={item.first_name}
- last_name={item.last_name}
- avatar={item.avatar ? '/img/avatars/' + item.avatar : null}
- date_of_birth={item.age}
- homebase_flag={'/img/flags_new/' + item.flag1}
- homebase2_flag={item.flag2 ? '/img/flags_new/' + item.flag2 : null}
- score={[
- item.score_nm,
- item.score_un,
- item.score_unp,
- item.score_dare,
- item.score_tcc,
- item.score_deep,
- item.score_slow,
- item.score_yes,
- item.score_kye,
- item.score_whs,
- item.score_tbt
- ]}
- active_score={
- confirmedValueRanking ? confirmedValueRanking.value - 1 : dataRanking[0].value - 1
- }
- tbt_score={item.score_tbt}
- tbt_rank={item.rank_tbt}
- badge_tbt={item.badge_tbt}
- badge_1281={item.badge_1281}
- badge_un={item.badge_un}
- badge_un_25={item.badge_un_25}
- badge_un_50={item.badge_un_50}
- badge_un_75={item.badge_un_75}
- badge_un_100={item.badge_un_100}
- badge_un_150={item.badge_un_150}
- badge_premium={item.badge_premium}
- auth={item.auth}
- />
- )}
- keyExtractor={(item) => item.user_id.toString()}
- contentContainerStyle={{ paddingBottom: 16, paddingTop: 8 }}
- showsVerticalScrollIndicator={false}
- />
- </View>
- <FilterModal
- isModalVisible={isModalVisible}
- setModalVisible={(value) => setModalVisible(value)}
- applyFilter={(filterAge, filterRanking, filterCountry) => {
- setConfirmedValueRanking(filterRanking);
- setFilteredData(
- applyModalSort(
- allParticipants ?? [],
- filterAge,
- filterRanking ?? dataRanking[0],
- filterCountry
- )
- );
- setModalVisible(false);
- }}
- countriesData={masterCountries ? masterCountries.data : []}
- />
- <OptionsModal />
- <WarningModal
- type={'delete'}
- isVisible={modalState.isWarningVisible}
- buttonTitle={modalState.buttonTitle}
- message={modalState.message}
- action={modalState.action}
- onClose={() => setModalState({ ...modalState, isWarningVisible: false })}
- title={modalState.title}
- />
- </PageWrapper>
- );
- };
- const styles = StyleSheet.create({
- container: {
- backgroundColor: 'white',
- gap: 16,
- flex: 1
- }
- });
- export default ParticipantsListScreen;
|