import * as SplashScreen from 'expo-splash-screen' import React, { useCallback, useEffect, useState } from 'react' import { enableScreens } from 'react-native-screens' import { QueryClient, QueryClientProvider } from 'react-query' import { Provider } from 'react-redux' import { PersistGate } from 'redux-persist/integration/react' import client from '@root/api/client' import { Index } from '@root/Index' import { persistor, store } from '@root/store' import { resetLocal } from '@root/utils/slices/instancesSlice' import ThemeManager from '@utils/styles/ThemeManager' if (__DEV__) { const whyDidYouRender = require('@welldone-software/why-did-you-render') whyDidYouRender(React, { trackHooks: true, hotReloadBufferMs: 1000 }) } const queryClient = new QueryClient() enableScreens() const App: React.FC = () => { const [appLoaded, setAppLoaded] = useState(false) const [startVerification, setStartVerification] = useState(false) const [localCorrupt, setLocalCorrupt] = useState(false) useEffect(() => { const delaySplash = async () => { try { await SplashScreen.preventAutoHideAsync() } catch (e) { console.warn(e) } } delaySplash() }, []) useEffect(() => { const hideSplash = async () => { try { await SplashScreen.hideAsync() } catch (e) { console.warn(e) } } if (appLoaded) { hideSplash() } }, [appLoaded]) const onBeforeLift = useCallback(() => setStartVerification(true), []) useEffect(() => { const verifyCredentials = async () => { const localUrl = store.getState().instances.local.url const localToken = store.getState().instances.local.token if (localUrl && localToken) { client({ method: 'get', instance: 'remote', instanceDomain: localUrl, url: `accounts/verify_credentials`, headers: { Authorization: `Bearer ${localToken}` } }) .then(res => { if (res.body.id !== store.getState().instances.local.account.id) { store.dispatch(resetLocal()) setLocalCorrupt(true) } setAppLoaded(true) }) .catch(() => { store.dispatch(resetLocal()) setLocalCorrupt(true) setAppLoaded(true) }) } else { setAppLoaded(true) } } if (startVerification) { verifyCredentials() } }, [startVerification]) const main = useCallback( bootstrapped => { if (bootstrapped && appLoaded) { require('@root/i18n/i18n') return ( ) } else { return null } }, [appLoaded] ) return ( ) } export default App