import React, { useEffect, useState } from 'react'; import { useFonts } from 'expo-font'; import { enableScreens } from 'react-native-screens'; import * as SplashScreen from 'expo-splash-screen'; import { Platform } from 'react-native'; import * as Notifications from 'expo-notifications'; import { createStackNavigator, TransitionPresets } from '@react-navigation/stack'; import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; import { createDrawerNavigator } from '@react-navigation/drawer'; import WelcomeScreen from './src/screens/WelcomeScreen'; import LoginScreen from './src/screens/LoginScreen'; import ResetPasswordScreen from './src/screens/ResetPasswordScreen'; import ResetPasswordDeepScreen from './src/screens/ResetPasswordDeepScreen'; import JoinUsScreen from './src/screens/RegisterScreen/JoinUs'; import EditAccount from './src/screens/RegisterScreen/EditAccount'; import MapScreen from './src/screens/InAppScreens/MapScreen'; import TravelsScreen from './src/screens/InAppScreens/TravelsScreen'; import ProfileScreen from './src/screens/InAppScreens/ProfileScreen'; import TravellersScreen from './src/screens/InAppScreens/TravellersScreen'; import { EditPersonalInfo } from './src/screens/InAppScreens/ProfileScreen/Profile/edit-personal-info'; import Settings from './src/screens/InAppScreens/ProfileScreen/Settings/'; import MasterRankingScreen from './src/screens/InAppScreens/TravellersScreen/MasterRankingScreen'; import LPIRanking from './src/screens/InAppScreens/TravellersScreen/LPIRankingScreen'; import InMemoriamScreen from './src/screens/InAppScreens/TravellersScreen/InMemoriamScreen'; import InHistoryScreen from './src/screens/InAppScreens/TravellersScreen/InHistoryScreen'; import UNMastersScreen from './src/screens/InAppScreens/TravellersScreen/UNMasters'; import StatisticsScreen from './src/screens/InAppScreens/TravellersScreen/StatisticsScreen'; import StatisticsListScreen from './src/screens/InAppScreens/TravellersScreen/StatisticsListScreen'; import TriumphsScreen from 'src/screens/InAppScreens/TravellersScreen/TriumphsScreen'; import SeriesRankingScreen from 'src/screens/InAppScreens/TravellersScreen/SeriesRankingScreen'; import SeriesRankingListScreen from 'src/screens/InAppScreens/TravellersScreen/SeriesRankingListScreen'; import UsersMapScreen from 'src/screens/InAppScreens/ProfileScreen/UsersMap'; import SeriesScreen from 'src/screens/InAppScreens/TravelsScreen/Series'; import { SeriesItemScreen } from 'src/screens/InAppScreens/TravelsScreen/SeriesItemScreen'; import EarthScreen from 'src/screens/InAppScreens/TravelsScreen/EarthScreen'; import PhotosScreen from 'src/screens/InAppScreens/TravelsScreen/PhotosScreen'; import MorePhotosScreen from 'src/screens/InAppScreens/TravelsScreen/MorePhotosScreen'; import AddPhotoScreen from 'src/screens/InAppScreens/TravelsScreen/AddPhotoScreen'; import TripsScreen from 'src/screens/InAppScreens/TravelsScreen/TripsScreen'; import AddNewTripScreen from 'src/screens/InAppScreens/TravelsScreen/AddNewTripScreen'; import AddRegionsScreen from 'src/screens/InAppScreens/TravelsScreen/AddRegionsScreen'; import CountriesScreen from 'src/screens/InAppScreens/TravelsScreen/CountriesScreen'; import RegionsScreen from 'src/screens/InAppScreens/TravelsScreen/RegionsScreen'; import DareScreen from 'src/screens/InAppScreens/TravelsScreen/DareScreen'; import FixersScreen from 'src/screens/InAppScreens/TravelsScreen/FixersScreen'; import AddNewFixerScreen from 'src/screens/InAppScreens/TravelsScreen/AddNewFixerScreen'; import FixersCommentsScreen from 'src/screens/InAppScreens/TravelsScreen/FixersCommentsScreen'; import { API, NAVIGATION_PAGES } from './src/types'; import { storage, StoreType } from './src/storage'; import { openDatabases } from './src/db'; import TabBarButton from './src/components/TabBarButton'; import { ParamListBase, RouteProp } from '@react-navigation/native'; import setupDatabaseAndSync from 'src/database'; import { MenuDrawer } from 'src/components'; import { API_URL, APP_VERSION } from 'src/constants'; import { InfoScreen, PlanInfoScreen, JoinInfoScreen, DiscoverInfoScreen, FirstStepsInfoScreen, CountriesInfoScreen, RegionsInfoScreen, EarthInfoScreen, DareInfoScreen, TripsInfoScreen, FixersInfoScreen } from 'src/screens/InfoScreens'; import RegionViewScreen from 'src/screens/InAppScreens/MapScreen/RegionViewScreen'; import UsersListScreen from 'src/screens/InAppScreens/MapScreen/UsersListScreen'; import SuggestSeriesScreen from 'src/screens/InAppScreens/TravelsScreen/SuggestSeriesScreen'; import MyFriendsScreen from 'src/screens/InAppScreens/ProfileScreen/MyFriendsScreen'; import CountryViewScreen from 'src/screens/InAppScreens/MapScreen/CountryViewScreen'; import { userApi } from '@api/user'; import axios from 'axios'; import PreviewScreen from 'src/screens/InAppScreens/ProfileScreen/ShareScreen'; import { PushNotificationProvider } from 'src/contexts/PushNotificationContext'; import NotificationsScreen from 'src/screens/NotificationsScreen'; import NotificationsListScreen from 'src/screens/NotificationsScreen/NotificationsListScreen'; import FriendsNotificationsScreen from 'src/screens/NotificationsScreen/FriendsNotificactionsScreen'; import MessagesNotificationsScreen from 'src/screens/NotificationsScreen/MessagesNotificationsScreen'; import SystemNotificationsScreen from 'src/screens/NotificationsScreen/SystemNotificationsScreen'; import MessagesScreen from 'src/screens/InAppScreens/MessagesScreen'; import ChatScreen from 'src/screens/InAppScreens/MessagesScreen/ChatScreen'; import { Splash } from 'src/components/SplashSpinner'; import { useMessagesStore } from 'src/stores/unreadMessagesStore'; import LocationSharingScreen from 'src/screens/LocationSharingScreen'; import { useFriendsNotificationsStore } from 'src/stores/friendsNotificationsStore'; import EventsScreen from 'src/screens/InAppScreens/TravelsScreen/EventsScreen'; import { NavigationProvider } from 'src/contexts/NavigationContext'; import FullMapScreen from 'src/screens/InAppScreens/MessagesScreen/FullMapScreen'; import EventScreen from 'src/screens/InAppScreens/TravelsScreen/EventScreen'; import GroupChatScreen from 'src/screens/InAppScreens/MessagesScreen/GroupChatScreen'; import GroupSettingScreen from 'src/screens/InAppScreens/MessagesScreen/GroupSettingsScreen'; enableScreens(); SplashScreen.preventAutoHideAsync(); const ScreenStack = createStackNavigator(); const BottomTab = createBottomTabNavigator(); const MapDrawer = createDrawerNavigator(); const Route = () => { const [token, setToken] = useState( storage.get('token', StoreType.STRING) as string ); const [fontsLoaded] = useFonts({ 'redhat-900': require('./assets/fonts/RedHatDisplay-Black-900.ttf'), 'redhat-700': require('./assets/fonts/RedHatDisplay-Bold-700.ttf'), 'redhat-600': require('./assets/fonts/RedHatDisplay-SemiBold-600.ttf'), 'montserrat-700': require('./assets/fonts/Montserrat-Bold.ttf'), 'montserrat-600': require('./assets/fonts/Montserrat-SemiBold.ttf'), 'montserrat-400': require('./assets/fonts/Montserrat-Regular.ttf') }); const [dbLoaded, setDbLoaded] = useState(false); const uid = storage.get('uid', StoreType.STRING); const updateNotificationStatus = useFriendsNotificationsStore( (state) => state.updateNotificationStatus ); const updateUnreadMessagesCount = useMessagesStore((state) => state.updateUnreadMessagesCount); const checkNmToken = async () => { if (token && uid) { try { const response = await axios.postForm( API_URL + '/' + API.CHECK_TOKEN, { token, user_id: +uid }, { headers: { Platform: Platform.OS, 'App-Version': APP_VERSION } } ); if (response.data.result !== 'OK') { handleLogout(); } } catch (error) { console.error('Error checking token:', error); } } }; const handleLogout = () => { setToken(null); storage.remove('token'); storage.remove('uid'); storage.remove('currentUserData'); storage.remove('showNomads'); storage.remove('filterSettings'); updateNotificationStatus(); updateUnreadMessagesCount(); }; const fetchAndSaveUserInfo = async () => { if (uid && token) { const profileData = await userApi.getProfileInfoData(token, +uid); const userInfo = { avatar: profileData?.data?.data?.user_data.avatar ?? '', first_name: profileData?.data?.data?.user_data.first_name, last_name: profileData?.data?.data?.user_data.last_name, homebase_flag: profileData?.data?.data?.user_data.flag1 }; storage.set('currentUserData', JSON.stringify(userInfo)); } }; useEffect(() => { const prepareApp = async () => { await checkNmToken(); // await checkTokenAndUpdate(); await openDatabases(); setDbLoaded(true); updateNotificationStatus(); updateUnreadMessagesCount(); }; prepareApp(); }, []); useEffect(() => { const hideSplashScreen = async () => { if (fontsLoaded) { await SplashScreen.hideAsync(); await fetchAndSaveUserInfo(); await setupDatabaseAndSync(); } }; hideSplashScreen(); }, [fontsLoaded]); const checkTokenAndUpdate = async () => { const storedToken = storage.get('deviceToken', StoreType.STRING); const { status } = await Notifications.getPermissionsAsync(); if (status !== 'granted') { return; } const currentToken = await Notifications.getDevicePushTokenAsync(); if (storedToken && currentToken?.data !== storedToken) { storage.set('deviceToken', currentToken.data); } }; if (!fontsLoaded || !dbLoaded) { return ; } const screenOptions = ({ route, navigation }: { route: RouteProp; navigation: any; }) => ({ headerShown: false, tabBarButton: (props: any) => ( ), tabBarStyle: { ...Platform.select({ android: { height: 58 } }) }, cardStyle: { backgroundColor: 'white' }, unmountOnBlur: true, gestureEnabled: Platform.OS === 'ios' ? true : false, lazy: false }); const regionViewScreenOptions = { ...screenOptions, ...(Platform.OS === 'ios' ? TransitionPresets.ModalSlideFromBottomIOS : {}), contentStyle: { flex: 1 } }; const BottomTabNavigator = () => ( {() => ( )} {() => ( )} {() => ( )} {() => ( )} {() => ( )} ); return ( {() => ( }> )} ); }; export default Route;