import React, {useEffect} from 'react'; import * as Sentry from '@sentry/react-native'; import {Severity} from '@sentry/types'; import AsyncStorage from '@react-native-async-storage/async-storage'; import {QueryClient, QueryClientProvider} from 'react-query'; import SplashScreen from 'react-native-splash-screen'; import {SafeAreaProvider} from 'react-native-safe-area-context'; import {NavigationContainer} from '@react-navigation/native'; import Loader from '@components/Loader'; import Navigation from '@navigation/index'; import {TncProvider} from '@contexts/tnc'; import useUser, {UserProvider, ACCESS_TOKEN} from '@contexts/user'; import { issuanceServiceInstance, cloudWalletServiceInstance, } from '@services/Axios'; import {LoaderProvider} from '@contexts/loader'; import {SENTRY_DSN, ENV} from '@constants/api'; const queryClient = new QueryClient(); const Wrapper = () => { const {getAccessToken, user, logout, isTokenExpired, getPhoneNumber} = useUser(); useEffect(() => SplashScreen.hide(), []); useEffect(() => { (async () => { if (!user?.accessToken) { await getAccessToken(); } else { const tokenExpired = await isTokenExpired(); const phoneNumber = await getPhoneNumber(); if (!!user?.accessToken && tokenExpired) { Sentry.captureMessage( `Logout fn called, Mobile Number : ${phoneNumber} / Access Token : ${user?.accessToken} / tokenExpired : ${tokenExpired} `, Severity.Log, ); await logout(); return; } // Add a Issuance request interceptor issuanceServiceInstance.interceptors.request.use( async config => { const value = await AsyncStorage.getItem(ACCESS_TOKEN); if (config?.headers && !!value) { config.headers.Authorization = value; } return config; }, error => Promise.reject(error), ); // Add a Issuance response interceptor issuanceServiceInstance.interceptors.response.use( response => response, async error => { if (error?.response?.status === 401) { Sentry.captureMessage( `Logout fn called, Mobile Number : ${phoneNumber} / Access Token : ${ user?.accessToken } / tokenExpired : ${tokenExpired} / Error : ${JSON.stringify( error?.response, )}`, Severity.Error, ); await logout(); return; } return Promise.reject(error); }, ); // Add a Cloud Service request interceptor cloudWalletServiceInstance.interceptors.request.use( async config => { const value = await AsyncStorage.getItem(ACCESS_TOKEN); if (config?.headers && !!value) { config.headers.Authorization = `Bearer ${value}`; } return config; }, error => Promise.reject(error), ); // Add a response interceptor cloudWalletServiceInstance.interceptors.response.use( response => response, async error => { if (error?.response?.status === 401) { Sentry.captureMessage( `Cloud Wallet API 401,Logout fn called, Mobile Number : ${phoneNumber} / Access Token : ${ user?.accessToken } / tokenExpired : ${tokenExpired} / Error : ${JSON.stringify( error?.response, )}`, Severity.Error, ); await logout(); return; } return Promise.reject(error); }, ); } })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [user?.accessToken]); return ( ); }; const App = () => { useEffect(() => { Sentry.init({ dsn: SENTRY_DSN, tracesSampleRate: 1.0, environment: ENV, }); }, []); return ( ); }; export default Sentry.wrap(App);