import { useEffect, useRef } from 'react'; import { Text, TouchableOpacity, View, Image, Animated } from 'react-native'; import MarkIcon from 'assets/icons/mark.svg'; import EditSvg from 'assets/icons/travels-screens/pen-to-square.svg'; import CalendarSvg from 'assets/icons/travels-screens/calendar.svg'; import RotateSvg from 'assets/icons/travels-screens/rotate.svg'; import CheckSvg from 'assets/icons/travels-screens/circle-check.svg'; import CheckRegularSvg from 'assets/icons/travels-screens/circle-check-regular.svg'; import { styles } from './style'; import React from 'react'; import { Colors } from 'src/theme'; import { useNavigation } from '@react-navigation/native'; import { NAVIGATION_PAGES } from 'src/types'; interface Region { id: number; name: string; region_photos: string; visitors_count: number; } interface RegionPopupProps { region: Region; userAvatars: string[]; userData: any; openEditModal: () => void; updateNM: (region: number, first: number, last: number, visits: number, quality: number) => void; updateDare: (region: number, visits: 0 | 1) => void; disabled?: boolean; updateSlow: (id: number, v: boolean, s11: boolean, s31: boolean, s101: boolean) => void; openEditSlowModal: () => void; } const RegionPopup: React.FC = ({ region, userAvatars, userData, openEditModal, updateNM, updateDare, disabled, updateSlow, openEditSlowModal }) => { const fadeAnim = useRef(new Animated.Value(0)).current; const navigation = useNavigation(); useEffect(() => { Animated.timing(fadeAnim, { toValue: 1, duration: 300, useNativeDriver: true }).start(); }, [fadeAnim]); const splitRegionName = (fullName: string) => { const [name, ...rest] = fullName?.split(/ – | - /); const subname = rest?.join(' - '); return { regionTitle: name, regionSubtitle: subname ? subname : '' }; }; const { regionTitle, regionSubtitle } = splitRegionName(region.name); const regionImg = JSON.parse(region.region_photos)[0]; function formatNumber(number: number) { if (number >= 1000 && number < 10000) { return (number / 1000).toFixed(1) + 'k'; } else if (number >= 10000) { return (number / 1000).toFixed(0) + 'k'; } return number.toString(); } const formattedCount = formatNumber(region.visitors_count); const renderDurationIcon = (condition: 0 | 1) => condition ? : ; return ( { if (userData?.type === 'countries') { navigation.navigate( ...([ NAVIGATION_PAGES.COUNTRY_PREVIEW, { regionId: region.id, type: 'country', disabled } ] as never) ); } else { navigation.navigate( ...([ NAVIGATION_PAGES.REGION_PREVIEW, { regionId: region.id, type: userData?.type, disabled } ] as never) ); } }} style={{ flex: 1 }} > {regionImg && } {regionTitle} {regionSubtitle && {regionSubtitle}} {userData?.visited && userData?.first_visit_year > 1 && !disabled && ( {userData?.first_visit_year} )} {userData?.visited && userData?.type === 'nm' && !disabled && ( {userData.no_of_visits >= 10 ? '10+' : userData.no_of_visits} )} {userData?.visited && userData?.type === 'countries' && !disabled && ( {renderDurationIcon(userData.slow11)} 11+ days {renderDurationIcon(userData.slow31)} 31+ days {renderDurationIcon(userData.slow101)} 101+ days )} {(!userData?.visited || userData?.type === 'dare' || disabled) && ( {userAvatars?.map((avatar, index) => ( ))} {formattedCount} )} {userData?.visited && userData?.type !== 'dare' && !disabled ? ( ) : null} userData?.type === 'nm' ? updateNM( region.id, userData.visited ? 0 : 1, userData.visited ? 0 : 1, userData.visited ? 0 : 1, 3 ) : userData?.type === 'countries' ? updateSlow( region.id, !userData.visited, Boolean(userData.slow11), Boolean(userData.slow31), Boolean(userData.slow101) ) : updateDare(region.id, userData.visited ? 0 : 1) } > {userData?.visited && !disabled ? ( Visited ) : ( Mark Visited )} ); }; export default React.memo(RegionPopup);