import React, { useCallback } from 'react'; import { View, Text, Image, TouchableOpacity, ScrollView } from 'react-native'; import { Colors } from 'src/theme'; import { styles } from './styles'; import { Loading } from 'src/components'; import CheckSvg from 'assets/icons/mark.svg'; import CloseSVG from 'assets/icons/close.svg'; import { API_HOST } from 'src/constants'; import { FlashList } from '@shopify/flash-list'; interface Mega { id: number; name: string; regions: { id: number; name: string; flag1: string; flag2: string | null; }[]; transits: number[]; visits: number[]; } interface Region { id: number; name: string; flag1: string; flag2: string | null; country_id: number; } const RegionsRenderer = ({ type, regions, setIsModalVisible }: { type: string; regions: any; setIsModalVisible: (value: boolean) => void; }) => { const flashlistConfig = { waitForInteraction: true, itemVisiblePercentThreshold: 50, minimumViewTime: 1000 }; const getOpacity = useCallback( (item: any, mega?: Mega) => { switch (type) { case 'nm': case 'mqp': return mega?.visits.includes(item.id) ? 1 : 0.4; case 'un': case 'unp': case 'tcc': return regions.data[1].includes(item.name) ? 1 : 0.4; case 'slow': return item.visited === 1 ? 1 : 0.4; case 'whs': return item.visited ? 1 : 0.4; default: return 1; } }, [type, regions?.data] ); const renderRegion = useCallback( (item: any, mega?: Mega) => { return ( {item?.flag2 ? ( ) : null} {type === 'slow' ? item.country : item?.name} {type === 'nm' && ( {regions.data.firsts[item?.id] && regions.data.firsts[item?.id] !== 1 ? ( {regions.data.firsts[item?.id]} ) : null} {regions.data.last[item?.id] && regions.data.last[item?.id] !== 1 ? ( {regions.data.last[item?.id]} ) : null} )} {type === 'yes' && ( {regions.data[1][item?.id] && regions.data[1][item?.id].year !== 1 ? ( {regions.data[1][item?.id].year} ) : null} {regions.data[1][item?.id] ? ( {regions.data[1][item?.id].score} ) : null} )} {type === 'slow' && ( {item.slow11 === 1 ? ( ) : null} {item.slow31 === 1 ? ( ) : null} {item.slow101 === 1 ? ( ) : null} )} ); }, [getOpacity, regions?.data, type] ); const renderMegaregion = useCallback( ({ item }: { item: Mega }) => { return ( {type === 'nm' ? '- ' : ''} {item.name} {' '} - {item.visits.length}/{item.regions.length} ( {((item.visits.length * 100) / item.regions.length).toFixed(2)}%) {type === 'nm' && ( First {'\n'} visited Last {'\n'} visit )} {item.regions?.map((region: any) => ( {renderRegion(region, item)} ))} ); }, [flashlistConfig, renderRegion, type] ); const renderContent = () => { const renderHeader = (headerText: string) => ( setIsModalVisible(false)} /> ); switch (type) { case 'nm': case 'mqp': return ( <> {renderHeader(type === 'nm' ? 'NM' : 'DARE')} megaregion?.id?.toString()} showsVerticalScrollIndicator={false} nestedScrollEnabled={true} contentContainerStyle={{ paddingTop: 8 }} /> ); case 'un': case 'unp': case 'tcc': return ( <> {renderHeader(type === 'un' ? 'UN' : type === 'unp' ? 'UN+' : 'TCC')} renderRegion(region.item)} keyExtractor={(region: Region) => region.name} showsVerticalScrollIndicator={false} contentContainerStyle={{ paddingTop: 8 }} ListHeaderComponent={() => ( {type === 'un' ? 'Countries' : 'Territories'} {' '} - {regions.data[3]}/{regions.data[2]} ( {((regions.data[3] * 100) / regions.data[2]).toFixed(2)}%) )} /> ); case 'slow': return ( <> {renderHeader('SLOW')} renderRegion(region.item)} keyExtractor={(region: Region) => region.country_id.toString()} showsVerticalScrollIndicator={false} contentContainerStyle={{ paddingTop: 8 }} ListHeaderComponent={() => { return ( Countries Slow11 Slow31 Slow101 ); }} /> ); case 'yes': const calcTotalScore = ( values: { year: number; score: number; country: string; }[] ) => { const totalScore = values.reduce((accumulator, item) => { return accumulator + item.score; }, 0); return totalScore; }; return ( <> {renderHeader('YES')} renderRegion(region.item)} keyExtractor={(region: Region) => region.id.toString()} showsVerticalScrollIndicator={false} contentContainerStyle={{ paddingTop: 8 }} ListHeaderComponent={() => { return ( Countries {' total score '} {calcTotalScore(Object.values(regions.data[1]))} Last visit Score ); }} /> ); case 'whs': return ( <> {renderHeader('WHS')} renderRegion(region.item)} keyExtractor={(region: Region) => region.name} showsVerticalScrollIndicator={false} contentContainerStyle={{ paddingTop: 8 }} /> ); } }; return {regions?.data ? renderContent() : }; }; const RegionsModalHeader = ({ textHeader, onRequestClose, rightElement }: { textHeader: string; onRequestClose: () => void; rightElement?: any; }) => { return ( {textHeader} {rightElement ? rightElement : } ); }; export default RegionsRenderer;