mirror of https://github.com/tooot-app/app
126 lines
3.2 KiB
TypeScript
126 lines
3.2 KiB
TypeScript
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'
|
|
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 * as Sentry from 'sentry-expo'
|
|
|
|
if (__DEV__) {
|
|
const whyDidYouRender = require('@welldone-software/why-did-you-render')
|
|
whyDidYouRender(React, {
|
|
trackHooks: true,
|
|
hotReloadBufferMs: 1000
|
|
})
|
|
}
|
|
|
|
Sentry.init({
|
|
dsn:
|
|
'https://c9e29aa05f774aca8f36def98244ce04@o389581.ingest.sentry.io/5571975',
|
|
enableInExpoDevelopment: false,
|
|
debug: __DEV__
|
|
})
|
|
|
|
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 (
|
|
<ThemeManager>
|
|
<Index localCorrupt={localCorrupt} />
|
|
</ThemeManager>
|
|
)
|
|
} else {
|
|
return null
|
|
}
|
|
},
|
|
[appLoaded]
|
|
)
|
|
|
|
return (
|
|
<QueryClientProvider client={queryClient}>
|
|
<Provider store={store}>
|
|
<PersistGate
|
|
persistor={persistor}
|
|
onBeforeLift={onBeforeLift}
|
|
children={main}
|
|
/>
|
|
</Provider>
|
|
</QueryClientProvider>
|
|
)
|
|
}
|
|
|
|
export default App
|