Browse Source

check nm token

Viktoriia 11 months ago
parent
commit
cb909bae92
2 changed files with 69 additions and 19 deletions
  1. 63 17
      Route.tsx
  2. 6 2
      src/types/api.ts

+ 63 - 17
Route.tsx

@@ -1,7 +1,7 @@
 import React, { useEffect, useState } from 'react';
 import { useFonts } from 'expo-font';
 import * as SplashScreen from 'expo-splash-screen';
-import { Platform } from 'react-native';
+import { AppState, Platform } from 'react-native';
 import * as Notifications from 'expo-notifications';
 
 import { createStackNavigator, TransitionPresets } from '@react-navigation/stack';
@@ -48,7 +48,7 @@ import CountriesScreen from 'src/screens/InAppScreens/TravelsScreen/CountriesScr
 import RegionsScreen from 'src/screens/InAppScreens/TravelsScreen/RegionsScreen';
 import DareScreen from 'src/screens/InAppScreens/TravelsScreen/DareScreen';
 
-import { NAVIGATION_PAGES } from './src/types';
+import { API, NAVIGATION_PAGES } from './src/types';
 import { storage, StoreType } from './src/storage';
 import { openDatabases } from './src/db';
 
@@ -56,7 +56,7 @@ import TabBarButton from './src/components/TabBarButton';
 import { ParamListBase, RouteProp } from '@react-navigation/native';
 import setupDatabaseAndSync from 'src/database';
 import { MenuDrawer } from 'src/components';
-import { setFastestMapHost } from 'src/constants';
+import { API_URL, setFastestMapHost } from 'src/constants';
 import { determineFastestServer } from 'src/utils/determineServer';
 import {
   InfoScreen,
@@ -77,6 +77,8 @@ import SuggestSeriesScreen from 'src/screens/InAppScreens/TravelsScreen/SuggestS
 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 { useNotification } from 'src/contexts/NotificationContext';
 
 enableScreens();
 
@@ -87,7 +89,9 @@ const MapDrawer = createDrawerNavigator();
 SplashScreen.preventAutoHideAsync();
 
 const Route = () => {
-  const token = storage.get('token', StoreType.STRING) as string;
+  const [token, setToken] = useState<string | null>(
+    storage.get('token', StoreType.STRING) as string
+  );
 
   const [fontsLoaded] = useFonts({
     'redhat-900': require('./assets/fonts/RedHatDisplay-Black-900.ttf'),
@@ -99,28 +103,69 @@ const Route = () => {
   });
   const [dbLoaded, setDbLoaded] = useState(false);
   const uid = storage.get('uid', StoreType.STRING);
-  const hasUserInfo = storage.get('currentUserData', StoreType.STRING);
+  const [appState, setAppState] = useState<string>(AppState.currentState);
+  const { updateNotificationStatus } = useNotification();
 
   useEffect(() => {
-    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));
+    const handleAppStateChange = async (nextAppState: string) => {
+      if (appState.match(/inactive|background/) && nextAppState === 'active') {
+        console.log('Додаток було згорнуто і знову відкрито');
+        await checkNmToken();
       }
+      setAppState(nextAppState);
+    };
+
+    const subscription = AppState.addEventListener('change', handleAppStateChange);
+
+    return () => {
+      subscription.remove();
     };
+  }, [appState]);
+
+  const checkNmToken = async () => {
+    if (token && uid) {
+      try {
+        const response = await axios.postForm(API_URL + '/' + API.CHECK_TOKEN, {
+          token,
+          user_id: +uid
+        });
+
+        if (response.data.result !== 'OK') {
+          handleLogout();
+        }
+      } catch (error) {
+        console.error('Error checking token:', error);
+      }
+    }
+  };
 
-    fetchAndSaveUserInfo();
-  }, [hasUserInfo]);
+  const handleLogout = () => {
+    setToken(null);
+    storage.remove('token');
+    storage.remove('uid');
+    storage.remove('currentUserData');
+    storage.remove('visitedTilesUrl');
+    storage.remove('filterSettings');
+    updateNotificationStatus();
+  };
+
+  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 () => {
       // checkTokenAndUpdate();
+      await checkNmToken();
       await findFastestServer();
       await openDatabases();
       setDbLoaded(true);
@@ -142,6 +187,7 @@ const Route = () => {
     const hideSplashScreen = async () => {
       if (fontsLoaded && dbLoaded) {
         await SplashScreen.hideAsync();
+        await fetchAndSaveUserInfo();
         await setupDatabaseAndSync();
       }
     };

+ 6 - 2
src/types/api.ts

@@ -110,7 +110,9 @@ export enum API_ENDPOINT {
   GET_USERS_WHO_VISITED_COUNTRY = 'get-users-who-visited-country',
   GET_COUNTRY_USER_DATA = 'get-user-data-country-app',
   GET_MAP_YEARS = 'get-map-years',
-  GET_SERIES_LIST = 'get-list'
+  GET_SERIES_LIST = 'get-list',
+  SET_NOTIFICATION_TOKEN = 'save-notification-token',
+  CHECK_TOKEN = 'check-token'
 }
 
 export enum API {
@@ -200,7 +202,9 @@ export enum API {
   GET_USERS_WHO_VISITED_COUNTRY = `${API_ROUTE.COUNTRIES}/${API_ENDPOINT.GET_USERS_WHO_VISITED_COUNTRY}`,
   GET_COUNTRY_USER_DATA = `${API_ROUTE.COUNTRIES}/${API_ENDPOINT.GET_COUNTRY_USER_DATA}`,
   GET_MAP_YEARS = `${API_ROUTE.PROFILE}/${API_ENDPOINT.GET_MAP_YEARS}`,
-  GET_SERIES_LIST = `${API_ROUTE.SERIES}/${API_ENDPOINT.GET_SERIES_LIST}`
+  GET_SERIES_LIST = `${API_ROUTE.SERIES}/${API_ENDPOINT.GET_SERIES_LIST}`,
+  SET_NOTIFICATION_TOKEN = `${API_ROUTE.USER}/${API_ENDPOINT.SET_NOTIFICATION_TOKEN}`,
+  CHECK_TOKEN = `${API_ROUTE.APP}/${API_ENDPOINT.CHECK_TOKEN}`
 }
 
 export type BaseAxiosError = AxiosError;