import React, { useCallback, useEffect, useState } from 'react'; import { View, Text, TouchableOpacity, ScrollView, FlatList } from 'react-native'; import ReactModal from 'react-native-modal'; import * as Progress from 'react-native-progress'; import { useFocusEffect } from '@react-navigation/native'; import { Dropdown } from 'react-native-searchable-dropdown-kj'; import moment from 'moment'; import { Button, Header, PageWrapper } from 'src/components'; import { CustomButton } from '../Components'; import { StoreType, storage } from 'src/storage'; import { NmRegion, TCCRegion } from '../utils/types'; import { Colors } from 'src/theme'; import { styles } from './styles'; import { useGetMegaregionsQuery, useGetRegionQeQuery, usePostSetNmRegionMutation, usePostSetTCCRegionMutation } from '@api/myRegions'; import { ButtonVariants } from 'src/types/components'; import { noOfVisits, qualityOptions } from '../utils/constants'; import ChevronIcon from 'assets/icons/travels-screens/down-arrow.svg'; import AddImgSvg from 'assets/icons/travels-screens/add-img.svg'; import { NmRegionItem } from '../Components/MyRegionsItems/NmRegionItem'; import { TccRegionItem } from '../Components/MyRegionsItems/TccRegionItem'; const RegionsScreen = () => { const token = storage.get('token', StoreType.STRING) as string; const { data: megaregions } = useGetMegaregionsQuery(token, true); const [megaSelectorVisible, setMegaSelectorVisible] = useState(false); const [selectedMega, setSelectedMega] = useState<{ name: string; id: number }>({ id: 1, name: 'SOUTHERN EUROPE' }); const { data: regionsQe } = useGetRegionQeQuery(selectedMega.id, token, true); const [total, setTotal] = useState(0); const [isEditModalVisible, setIsEditModalVisible] = useState(false); const [currentItem, setCurrentItem] = useState(null); const [contentIndex, setContentIndex] = useState(0); const [nmRegions, setNmRegions] = useState(null); const [filteredNmRegions, setFilteredNmRegions] = useState(null); const [tccRegions, setTccRegions] = useState(null); const [filteredTccRegions, setFilteredTccRegions] = useState(null); const { mutate: updateNM } = usePostSetNmRegionMutation(); const { mutate: updateTCC } = usePostSetTCCRegionMutation(); const [selectedQuality, setSelectedQuality] = useState(qualityOptions[2]); const [selectedFirstYear, setSelectedFirstYear] = useState(1); const [selectedLastYear, setSelectedLastYear] = useState(1); const [years, setYears] = useState<{ label: string; value: number }[]>([]); const [selectedNoOfVisits, setSelectedNoOfVisits] = useState(1); const handleOpenEditModal = (item: NmRegion) => { setCurrentItem(item); setSelectedFirstYear(item.year); setSelectedLastYear(item.last); setSelectedNoOfVisits(item.visits); setSelectedQuality( qualityOptions.find((quality) => quality.id === item.quality) || qualityOptions[2] ); setIsEditModalVisible(true); }; const handleUpdateNM = useCallback( (region: number, first: number, last: number, visits: number, quality: number) => { const updatedNM = nmRegions?.map((item) => { if (item.id === region) { return { ...item, year: first, last, quality, visits }; } return item; }); const updatedNMData = { token, region, first, last, visits, quality }; updateNM(updatedNMData); updatedNM && setNmRegions(updatedNM); }, [nmRegions] ); const handleUpdateTCC = useCallback( (region: number, visits: 0 | 1) => { const updatedTCC = tccRegions?.map((item) => { if (item.id === region) { return { ...item, visited: visits }; } return item; }); const updatedTCCData = { token, region, visits }; updateTCC(updatedTCCData); updatedTCC && setTccRegions(updatedTCC); }, [tccRegions] ); useEffect(() => { if (nmRegions && nmRegions.length) { calcTotalCountries(); } }, [nmRegions]); useEffect(() => { if (regionsQe && regionsQe.result === 'OK') { setNmRegions(regionsQe.data.out_regs); setTccRegions(regionsQe.data.out_tcc); } }, [regionsQe]); useEffect(() => { if (megaregions && megaregions.result === 'OK') { setContentIndex(0); } }, [selectedMega]); useEffect(() => { switch (contentIndex) { case 0: setFilteredNmRegions(nmRegions); setFilteredTccRegions(tccRegions); break; case 1: setFilteredNmRegions(nmRegions?.filter((item) => item.visits <= 0) || []); setFilteredTccRegions(tccRegions?.filter((item) => item.visited <= 0) || []); break; case 2: setFilteredNmRegions(nmRegions?.filter((item) => item.visits > 0) || []); setFilteredTccRegions(tccRegions?.filter((item) => item.visited > 0) || []); break; } }, [contentIndex, nmRegions, tccRegions]); useFocusEffect( useCallback(() => { if (megaregions && megaregions.result === 'OK') { setSelectedMega(megaregions.data[1]); const currentYear = moment().year(); let yearSelector: { label: string; value: number }[] = [{ label: 'visited', value: 1 }]; for (let i = currentYear; i >= 1951; i--) { yearSelector.push({ label: i.toString(), value: i }); } setYears(yearSelector); } }, [megaregions]) ); const calcTotalCountries = () => { const visited = nmRegions?.filter((item) => item.visits > 0).length || 0; setTotal(visited); }; const renderItem = ({ item }: { item: NmRegion }) => ( ); const renderOption = (name: string) => ( {name} ); return (
setMegaSelectorVisible(true)}> {selectedMega?.name} setContentIndex(0)} isActive={contentIndex === 0} /> setContentIndex(1)} isActive={contentIndex === 1} /> setContentIndex(2)} isActive={contentIndex === 2} /> Visited regions {nmRegions?.length ? `${total}/${nmRegions.length} • ${((total * 100) / nmRegions.length).toFixed(2)}%` : '0/0 • 100%'} {filteredNmRegions && (filteredNmRegions?.length || filteredTccRegions?.length) ? ( item.id.toString()} showsVerticalScrollIndicator={false} style={{ paddingTop: 8, marginBottom: 16 }} ListFooterComponent={ filteredTccRegions && filteredTccRegions.length ? ( TCC regions {filteredTccRegions?.map((item) => ( ))} ) : null } /> ) : null} setMegaSelectorVisible(false)} style={styles.modal} statusBarTranslucent={true} presentationStyle="overFullScreen" > {megaregions?.data?.map((mega) => ( { setMegaSelectorVisible(false); setSelectedMega(mega); }} > {mega.name} ))} setIsEditModalVisible(false)} style={styles.modal} statusBarTranslucent={true} presentationStyle="overFullScreen" > First visit { setSelectedFirstYear(item.value); setSelectedLastYear(item.value); }} containerStyle={{ borderRadius: 4 }} renderItem={(item) => renderOption(item.label)} /> Last visit item.value >= selectedFirstYear || item.value === 1)} labelField="label" valueField="value" value={selectedLastYear} placeholder="Last visit" onChange={(item) => setSelectedLastYear(item.value)} containerStyle={{ borderRadius: 4 }} renderItem={(item) => renderOption(item.label)} /> Best visit quality setSelectedQuality(item)} renderItem={(item) => renderOption(item.name)} /> No of visits setSelectedNoOfVisits(item.value)} containerStyle={{ borderRadius: 4 }} renderItem={(item) => renderOption(item.label)} /> {/* Photos Add */}