import React, { FC, useCallback, useEffect, useState } from 'react'; import { View, Text, Image, TouchableOpacity, Platform, FlatList } from 'react-native'; import { styles } from '../RegionViewScreen/styles'; import { Button, CustomImageViewer, 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 { fetchCountryUserData, 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'; import { useGetRegionQeQuery } from '@api/myRegions'; 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 { mutateAsync: mutateCountriesData } = fetchCountryUserData(); // const { data: regionsQe } = useGetRegionQeQuery(undefined, countryId, String(token), true); const { mutate: updateSeriesItem } = usePostSetToggleItem(); const [isInfoModalVisible, setIsInfoModalVisible] = useState(false); const [infoItem, setInfoItem] = useState(null); const [isEditSlowModalVisible, setIsEditSlowModalVisible] = useState(false); // const [regionsData, setRegionsData] = useState(null); // const [daresData, setDaresData] = useState(null); // const [index, setIndex] = useState(0); // const [countryRoutes] = useState([ // { key: 'regions', title: 'NM regions' }, // { key: 'dare', title: 'DARE places' }, // { key: 'series', title: 'Series' } // ]); const { handleUpdateSlow: updateSlow, userData: regionData, setUserData: setRegionData, handleUpdateSlowList } = useRegion(); useFocusEffect(() => { navigation.getParent()?.setOptions({ tabBarStyle: { display: 'flex', ...Platform.select({ android: { // height: 58 } }) } }); }); 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?.slice(0, 100).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); }; // const fetchCountryData = async () => { // await mutateCountriesData( // { id: countryId, token }, // { // onSuccess: (data) => { // setRegionData({ type: 'countries', id: countryId, ...data.data }); // } // } // ); // }; if (data && data.result === 'OK') { fetchGroups(); // fetchCountryData(); } }, [data]) ); // useEffect(() => { // if (regionsQe && regionsQe.result === 'OK') { // setRegionsData(regionsQe.data.out_regs); // setDaresData(regionsQe.data.out_dare); // } // }, [regionsQe]); 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 renderScene = ({ route }: { route: any }) => { // return ; // }; 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)} onPress={() => navigation.navigate(NAVIGATION_PAGES.EDIT_COUNTRY_DATA, { countryId: countryId, countryName: name, countryFlag: regionData?.flag, slow11: regionData?.slow11, slow31: regionData?.slow31, slow101: regionData?.slow101 }) } style={ButtonStyles.editBtn} > ) : null} */} {!disabled ? ( navigation.navigate(NAVIGATION_PAGES.EDIT_COUNTRY_DATA, { countryId: countryId, countryName: name, countryFlag: regionData?.flag, slow11: regionData?.slow11, slow31: regionData?.slow31, slow101: regionData?.slow101, isSlowList: false }) : handleUpdateSlow } > {regionData?.visited ? ( Edit ) : ( 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)} ) : ( )} {/* { setIndex(i); }} lazy={true} renderTabBar={(props) => ( ( {route.title} )} /> )} /> */} {/* {index === 0 && ( <> {regionsData && regionsData.length > 0 ? ( `region-${item.id}`} showsVerticalScrollIndicator={false} initialNumToRender={15} contentContainerStyle={{ paddingBottom: 16, gap: 10 }} scrollEnabled={false} renderItem={({ item }) => { const [regionName, ...rest] = item.region_name?.split(/ – | - /); const subname = rest?.join(' - '); return ( navigation.navigate( ...([ NAVIGATION_PAGES.REGION_PREVIEW, { regionId: item.id, type: 'nm', disabled } ] as never) ) } > {item.flag_1 && ( )} {item.flag_2 && ( )} {regionName} {subname} ); }} /> ) : null} )} */} {/* {index === 1 && ( <> {daresData && daresData.length > 0 ? ( `dare-${item.id}`} showsVerticalScrollIndicator={false} initialNumToRender={15} contentContainerStyle={{ paddingBottom: 16, gap: 10 }} scrollEnabled={false} renderItem={({ item }) => { const [regionName, ...rest] = item.name?.split(/ – | - /); const subname = rest?.join(' - '); return ( navigation.navigate( ...([ NAVIGATION_PAGES.REGION_PREVIEW, { regionId: item.id, type: 'dare', disabled } ] as never) ) } > {item.flag1 && ( )} {item.flag2 && ( )} {regionName} {subname} ); }} /> ) : null} )} */} {/* {index === 2 && ( <> */} {series.length > 0 ? ( <> TRAVEL SERIES } /> ) : null} {/* )} */} setModalVisible(false)} onImageIndexChange={setActiveIndex} backgroundColor={Colors.DARK_BLUE} renderFooter={(imageIndex: number) => ( {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}