123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- 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<NmRegion | null>(null);
- const [contentIndex, setContentIndex] = useState(0);
- const [nmRegions, setNmRegions] = useState<NmRegion[] | null>(null);
- const [filteredNmRegions, setFilteredNmRegions] = useState<NmRegion[] | null>(null);
- const [tccRegions, setTccRegions] = useState<TCCRegion[] | null>(null);
- const [filteredTccRegions, setFilteredTccRegions] = useState<TCCRegion[] | null>(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 }) => (
- <NmRegionItem item={item} openEditModal={handleOpenEditModal} updateNM={handleUpdateNM} />
- );
- const renderOption = (name: string) => (
- <View style={styles.dropdownOption}>
- <Text style={styles.placeholderStyle}>{name}</Text>
- </View>
- );
- return (
- <PageWrapper>
- <Header label="Regions" />
- <TouchableOpacity style={styles.megaSelector} onPress={() => setMegaSelectorVisible(true)}>
- <Text style={styles.megaButtonText}>{selectedMega?.name}</Text>
- <ChevronIcon width={18} height={18} />
- </TouchableOpacity>
- <View style={styles.buttonContainer}>
- <CustomButton
- title="All"
- onPress={() => setContentIndex(0)}
- isActive={contentIndex === 0}
- />
- <CustomButton
- title="Not visited"
- onPress={() => setContentIndex(1)}
- isActive={contentIndex === 1}
- />
- <CustomButton
- title="Visited"
- onPress={() => setContentIndex(2)}
- isActive={contentIndex === 2}
- />
- </View>
- <View style={styles.progressHeader}>
- <Text style={styles.textSmall}>Visited regions</Text>
- <Text style={styles.textSmall}>
- {nmRegions?.length
- ? `${total}/${nmRegions.length} • ${((total * 100) / nmRegions.length).toFixed(2)}%`
- : '0/0 • 100%'}
- </Text>
- </View>
- <Progress.Bar
- progress={nmRegions?.length ? total / nmRegions.length : 1}
- width={null}
- height={4}
- color={Colors.DARK_BLUE}
- borderWidth={0}
- borderRadius={5}
- unfilledColor={Colors.DARK_LIGHT}
- />
- {filteredNmRegions && (filteredNmRegions?.length || filteredTccRegions?.length) ? (
- <FlatList
- data={filteredNmRegions}
- renderItem={renderItem}
- keyExtractor={(item) => item.id.toString()}
- showsVerticalScrollIndicator={false}
- style={{ paddingTop: 8, marginBottom: 16 }}
- ListFooterComponent={
- filteredTccRegions && filteredTccRegions.length ? (
- <View style={{ marginTop: 8 }}>
- <Text style={[styles.textMedium, { textAlign: 'center' }]}>TCC regions</Text>
- {filteredTccRegions?.map((item) => (
- <TccRegionItem item={item} updateTCC={handleUpdateTCC} key={item.id} />
- ))}
- </View>
- ) : null
- }
- />
- ) : null}
- <ReactModal
- isVisible={megaSelectorVisible}
- onBackdropPress={() => setMegaSelectorVisible(false)}
- style={styles.modal}
- statusBarTranslucent={true}
- presentationStyle="overFullScreen"
- >
- <View style={styles.wrapper}>
- <ScrollView style={{ paddingBottom: 16 }} showsVerticalScrollIndicator={false}>
- {megaregions?.data?.map((mega) => (
- <TouchableOpacity
- key={mega.id}
- style={styles.btnOption}
- onPress={() => {
- setMegaSelectorVisible(false);
- setSelectedMega(mega);
- }}
- >
- <Text style={styles.btnOptionText}>{mega.name}</Text>
- </TouchableOpacity>
- ))}
- </ScrollView>
- </View>
- </ReactModal>
- <ReactModal
- isVisible={isEditModalVisible}
- onBackdropPress={() => setIsEditModalVisible(false)}
- style={styles.modal}
- statusBarTranslucent={true}
- presentationStyle="overFullScreen"
- >
- <View style={styles.modalContent}>
- <View style={styles.optionsContainer}>
- <View style={styles.rowWrapper}>
- <View style={styles.dropdownWrapper}>
- <Text style={styles.textSmall}>First visit</Text>
- <Dropdown
- style={styles.dropdown}
- placeholderStyle={styles.placeholderStyle}
- selectedTextStyle={styles.placeholderStyle}
- data={years}
- labelField="label"
- valueField="value"
- value={selectedFirstYear}
- placeholder="First visit"
- onChange={(item) => {
- setSelectedFirstYear(item.value);
- setSelectedLastYear(item.value);
- }}
- containerStyle={{ borderRadius: 4 }}
- renderItem={(item) => renderOption(item.label)}
- />
- </View>
- <View style={styles.dropdownWrapper}>
- <Text style={styles.textSmall}>Last visit</Text>
- <Dropdown
- style={styles.dropdown}
- placeholderStyle={styles.placeholderStyle}
- selectedTextStyle={styles.placeholderStyle}
- data={years.filter((item) => 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)}
- />
- </View>
- </View>
- <View style={styles.rowWrapper}>
- <View style={styles.dropdownWrapper}>
- <Text style={styles.textSmall}>Best visit quality</Text>
- <Dropdown
- style={styles.dropdown}
- placeholderStyle={styles.placeholderStyle}
- containerStyle={{ borderRadius: 4 }}
- selectedTextStyle={styles.placeholderStyle}
- data={qualityOptions}
- labelField="name"
- valueField="id"
- value={selectedQuality.id}
- placeholder="Best visit quality"
- onChange={(item) => setSelectedQuality(item)}
- renderItem={(item) => renderOption(item.name)}
- />
- </View>
- <View style={styles.dropdownWrapper}>
- <Text style={styles.textSmall}>No of visits</Text>
- <Dropdown
- style={styles.dropdown}
- placeholderStyle={styles.placeholderStyle}
- selectedTextStyle={styles.placeholderStyle}
- data={noOfVisits}
- labelField="label"
- valueField="value"
- value={selectedNoOfVisits}
- placeholder="No of visits"
- onChange={(item) => setSelectedNoOfVisits(item.value)}
- containerStyle={{ borderRadius: 4 }}
- renderItem={(item) => renderOption(item.label)}
- />
- </View>
- </View>
- </View>
- {/* <View style={styles.photosContent}>
- <Text style={styles.textMedium}>Photos</Text>
- <TouchableOpacity style={styles.addImgBtn}>
- <AddImgSvg fill={Colors.DARK_BLUE} />
- <Text style={styles.textSmall}>Add</Text>
- </TouchableOpacity>
- </View> */}
- <Button
- children="Done"
- onPress={() => {
- setIsEditModalVisible(false);
- currentItem?.id &&
- handleUpdateNM(
- currentItem.id,
- selectedFirstYear,
- selectedLastYear,
- selectedNoOfVisits,
- selectedQuality.id
- );
- }}
- />
- <Button
- children="Close"
- onPress={() => setIsEditModalVisible(false)}
- variant={ButtonVariants.OPACITY}
- containerStyles={styles.closeBtn}
- textStyles={{ color: Colors.DARK_BLUE }}
- />
- </View>
- </ReactModal>
- </PageWrapper>
- );
- };
- export default RegionsScreen;
|