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;