import React, { FC, useCallback, useEffect, useState } from 'react'; import { View, Text, Image, TouchableOpacity, Platform } from 'react-native'; import ImageView from 'better-react-native-image-viewing'; import { styles } from '../RegionViewScreen/styles'; import { Button, HorizontalTabView, Loading, Modal as ReactModal } from 'src/components'; import { CommonActions, useFocusEffect } from '@react-navigation/native'; import { Colors } from 'src/theme'; import { ScrollView } from 'react-native-gesture-handler'; import { styles as ButtonStyles } from 'src/components/RegionPopup/style'; import { usePostSetToggleItem } from '@api/series'; import { NAVIGATION_PAGES } from 'src/types'; import { API_HOST } from 'src/constants'; import { StoreType, storage } from 'src/storage'; import { ButtonVariants } from 'src/types/components'; import { useRegion } from 'src/contexts/RegionContext'; import formatNumber from '../../TravelsScreen/utils/formatNumber'; import { PhotosData, Props, SeriesData, SeriesGroup, SeriesItem } from '../RegionViewScreen/types'; import ImageCarousel from '../RegionViewScreen/ImageCarousel'; import TravelSeriesList from '../RegionViewScreen/TravelSeriesList'; import { useGetCountryDataQuery } from '@api/countries'; import EditModal from '../../TravelsScreen/Components/EditSlowModal'; import MarkIcon from 'assets/icons/mark.svg'; import ChevronLeft from 'assets/icons/chevron-left.svg'; import CaseSvg from 'assets/icons/briefcase.svg'; import HouseSvg from 'assets/icons/house.svg'; import EditSvg from 'assets/icons/travels-screens/pen-to-square.svg'; import CheckSvg from 'assets/icons/travels-screens/circle-check.svg'; import CheckRegularSvg from 'assets/icons/travels-screens/circle-check-regular.svg'; import MapSvg from 'assets/icons/travels-screens/map-location.svg'; const CountryViewScreen: FC = ({ navigation, route }) => { const countryId = route.params?.regionId; const disabled = route.params?.disabled; const token = storage.get('token', StoreType.STRING) as string; const [isLoading, setIsLoading] = useState(true); const [isModalVisible, setModalVisible] = useState(false); const [currentImageIndex, setCurrentImageIndex] = useState(0); const [activeIndex, setActiveIndex] = useState(0); const [indexSeries, setIndexSeries] = useState(0); const [routes, setRoutes] = useState([]); const [series, setSeries] = useState([]); const [photos, setPhotos] = useState([]); const [name, setName] = useState(''); const { data } = useGetCountryDataQuery(countryId, true, token && token); const { mutate: updateSeriesItem } = usePostSetToggleItem(); const [isInfoModalVisible, setIsInfoModalVisible] = useState(false); const [infoItem, setInfoItem] = useState(null); const [isEditSlowModalVisible, setIsEditSlowModalVisible] = useState(false); const { handleUpdateSlow: updateSlow, userData: regionData, setUserData: setRegionData, handleUpdateSlowList } = useRegion(); useEffect(() => { navigation.getParent()?.setOptions({ tabBarStyle: { display: 'flex', ...Platform.select({ android: { height: 58 } }) } }); }, [navigation]); useFocusEffect( useCallback(() => { const fetchGroups = async () => { let staticGroups = []; const routesData = data?.data?.series?.map((item) => ({ key: item.series_id?.toString(), title: item.series_name, series_id: item.series_id, icon: item.icon, items: item.items })); routesData && staticGroups.push(...routesData); setPhotos( data?.data?.photos?.map((item) => ({ ...item, uriSmall: `${API_HOST}/ajax/pic/${item.id}/small`, uri: `${API_HOST}/ajax/pic/${item.id}/full` })) ?? [] ); setName(data?.data.name ?? ''); setSeries(data?.data?.series || []); setRoutes(staticGroups); if (regionData?.id !== countryId) { setRegionData(data?.data || {}); } setIsLoading(false); }; if (data && data.result === 'OK') { fetchGroups(); } }, [data]) ); const handleCheckboxChange = useCallback( async (item: SeriesItem, double: boolean, seriesId: number) => { setSeries((currentData) => { const groupIndex = currentData.findIndex((group) => group?.series_id === seriesId); if (groupIndex === -1) return currentData; const newData = [...currentData]; const newGroup = { ...newData[groupIndex] }; newGroup.items = newGroup.items.map((subItem) => subItem.id === item.id ? { ...subItem, ...(double ? { visited_double: subItem.visited_double === 0 ? 1 : 0 } : { visited: subItem.visited === 0 ? 1 : 0 }) } : subItem ); newData[groupIndex] = newGroup; return newData; }); const itemData = { token: token, series_id: seriesId, item_id: item.id, checked: (item.visited === 1 ? 0 : 1) as 0 | 1, double: (double && !item.visited_double ? 1 : 0) as 0 | 1 }; try { updateSeriesItem(itemData); } catch (error) { console.error('Failed to update checkbox state', error); } }, [token, updateSeriesItem] ); const openModal = (index: number) => { setCurrentImageIndex(index); setModalVisible(true); }; if (isLoading) return ; const handleUpdateSlowModal = ( id: number, v: boolean, s11: boolean, s31: boolean, s101: boolean ) => { const updatedSlow = { ...regionData, visited: v, slow11: Number(s11) as 0 | 1, slow31: Number(s31) as 0 | 1, slow101: Number(s101) as 0 | 1 }; const updatedSlowData = { token, id, v, s11, s31, s101 }; route.params?.isTravelsScreen ? handleUpdateSlowList(id, v, s11, s31, s101) : updateSlow(id, v, s11, s31, s101); updatedSlow && setRegionData(updatedSlow); }; const handleUpdateSlow = () => { route.params?.isTravelsScreen ? handleUpdateSlowList( countryId, !regionData.visited, Boolean(regionData.slow11), Boolean(regionData.slow31), Boolean(regionData.slow101) ) : updateSlow( countryId, !regionData.visited, Boolean(regionData.slow11), Boolean(regionData.slow31), Boolean(regionData.slow101) ); setRegionData({ ...regionData, visited: !regionData.visited }); }; const renderDurationIcon = (condition: 0 | 1) => condition ? : ; return ( { navigation.goBack(); }} style={styles.backButton} > {photos.length > 0 ? ( ) : ( No image available at this location )} { route.params?.isTravelsScreen || route.params?.isProfileScreen ? navigation.dispatch( CommonActions.reset({ index: 1, routes: [ { name: NAVIGATION_PAGES.IN_APP_MAP_TAB, state: { routes: [ { name: NAVIGATION_PAGES.MAP_TAB, params: { id: countryId, type: 'countries' } } ] } } ] }) ) : navigation.goBack(); }} style={styles.goToMapBtn} > {regionData?.visited && !disabled && ( {renderDurationIcon(regionData.slow11)} 11+ days {renderDurationIcon(regionData.slow31)} 31+ days {renderDurationIcon(regionData.slow101)} 101+ days )} {name} {regionData?.visited && !disabled ? ( setIsEditSlowModalVisible(true)} style={ButtonStyles.editBtn} > ) : null} {!disabled ? ( {regionData?.visited ? ( Visited ) : ( Mark Visited )} ) : null} {data?.data.users_from_country_count ?? 0 > 0 ? ( navigation.navigate( ...([ NAVIGATION_PAGES.USERS_LIST, { id: countryId, isFromHere: true, type: 'country' } ] as never) ) } > {data?.data.users_from_country && data?.data.users_from_country.length > 0 && data?.data.users_from_country?.map((user, index: number) => ( ))} {formatNumber(data?.data?.users_from_country_count ?? 0)} ) : ( )} {data?.data.users_who_visited_country_count ?? 0 > 0 ? ( navigation.navigate( ...([ NAVIGATION_PAGES.USERS_LIST, { id: countryId, isFromHere: false, type: 'country' } ] as never) ) } > {data?.data.users_who_visited_country && data?.data.users_who_visited_country.length > 0 && data?.data.users_who_visited_country?.map((user, index) => ( ))} {formatNumber(data?.data.users_who_visited_country_count ?? 0)} ) : ( )} {series.length > 0 ? ( <> TRAVEL SERIES } /> ) : null} setModalVisible(false)} backgroundColor={Colors.DARK_BLUE} onImageIndexChange={setActiveIndex} FooterComponent={({ imageIndex }) => ( {photos[imageIndex].title} { setModalVisible(false); navigation.navigate( ...([ NAVIGATION_PAGES.PUBLIC_PROFILE_VIEW, { userId: photos[imageIndex].user_id, hideTabBar: true } ] as never) ); }} disabled={disabled} style={styles.imageOwner} > {photos[imageIndex].first_name} {photos[imageIndex].last_name} )} /> {infoItem?.name} {infoItem?.description}