tooot/App.tsx

176 lines
5.0 KiB
TypeScript
Raw Normal View History

2020-12-28 16:54:19 +01:00
import NetInfo from '@react-native-community/netinfo'
2020-12-27 18:43:49 +01:00
import client from '@root/api/client'
2020-12-29 01:09:22 +01:00
import Index from '@root/Index'
2020-12-27 18:43:49 +01:00
import { persistor, store } from '@root/store'
import { resetLocal } from '@root/utils/slices/instancesSlice'
import ThemeManager from '@utils/styles/ThemeManager'
2020-12-28 23:20:18 +01:00
import chalk from 'chalk'
2020-12-29 16:19:04 +01:00
import * as Analytics from 'expo-firebase-analytics'
import * as SplashScreen from 'expo-splash-screen'
import React, { useCallback, useEffect, useState } from 'react'
2020-12-25 18:20:09 +01:00
import { enableScreens } from 'react-native-screens'
2020-12-28 16:54:19 +01:00
import { onlineManager, QueryClient, QueryClientProvider } from 'react-query'
2020-11-21 13:19:05 +01:00
import { Provider } from 'react-redux'
import { PersistGate } from 'redux-persist/integration/react'
2020-12-27 18:43:49 +01:00
import * as Sentry from 'sentry-expo'
2020-12-28 23:20:18 +01:00
const ctx = new chalk.Instance({ level: 3 })
const startingLog = (type: 'log' | 'warn' | 'error', message: string) => {
switch (type) {
case 'log':
console.log(ctx.bgBlue.bold(' Start up ') + ' ' + message)
break
case 'warn':
console.log(ctx.bgBlue.bold(' Start up ') + ' ' + message)
break
case 'error':
console.log(ctx.bgBlue.bold(' Start up ') + ' ' + message)
break
}
}
2020-12-26 12:59:16 +01:00
if (__DEV__) {
2020-12-29 16:19:04 +01:00
Analytics.setDebugModeEnabled(true)
2020-12-28 23:20:18 +01:00
startingLog('log', 'initializing wdyr')
2020-12-26 12:59:16 +01:00
const whyDidYouRender = require('@welldone-software/why-did-you-render')
whyDidYouRender(React, {
trackHooks: true,
hotReloadBufferMs: 1000
})
}
2020-11-17 23:57:23 +01:00
2020-12-28 23:20:18 +01:00
startingLog('log', 'initializing Sentry')
2020-12-27 18:43:49 +01:00
Sentry.init({
dsn:
'https://c9e29aa05f774aca8f36def98244ce04@o389581.ingest.sentry.io/5571975',
enableInExpoDevelopment: false,
debug: __DEV__
})
2020-12-28 23:20:18 +01:00
startingLog('log', 'initializing react-query')
2020-12-25 18:20:09 +01:00
const queryClient = new QueryClient()
2020-12-28 23:20:18 +01:00
startingLog('log', 'initializing native screen')
2020-12-25 18:20:09 +01:00
enableScreens()
2020-11-23 00:07:32 +01:00
const App: React.FC = () => {
2020-12-28 23:20:18 +01:00
startingLog('log', 'rendering App')
const [appLoaded, setAppLoaded] = useState(false)
const [localCorrupt, setLocalCorrupt] = useState(false)
2020-12-28 23:20:18 +01:00
useEffect(() => {
const onlineState = onlineManager.setEventListener(setOnline => {
startingLog('log', 'added onlineManager listener')
return NetInfo.addEventListener(state => {
startingLog('warn', `setting online state ${state.isConnected}`)
// @ts-ignore
setOnline(state.isConnected)
})
})
return () => {
onlineState
}
}, [])
useEffect(() => {
const delaySplash = async () => {
2020-12-28 23:20:18 +01:00
startingLog('log', 'delay splash')
try {
await SplashScreen.preventAutoHideAsync()
} catch (e) {
console.warn(e)
}
}
delaySplash()
}, [])
useEffect(() => {
const hideSplash = async () => {
2020-12-28 23:20:18 +01:00
startingLog('log', 'hide splash')
try {
await SplashScreen.hideAsync()
} catch (e) {
console.warn(e)
}
}
if (appLoaded) {
hideSplash()
}
}, [appLoaded])
2020-12-28 23:20:18 +01:00
const onBeforeLift = useCallback(() => {
NetInfo.fetch().then(netInfo => {
startingLog('log', 'on before lift')
const localUrl = store.getState().instances.local.url
const localToken = store.getState().instances.local.token
2020-12-28 23:20:18 +01:00
if (netInfo.isConnected) {
startingLog('log', 'network connected')
if (localUrl && localToken) {
startingLog('log', 'checking locally stored credentials')
client({
method: 'get',
instance: 'remote',
instanceDomain: localUrl,
url: `accounts/verify_credentials`,
headers: { Authorization: `Bearer ${localToken}` }
})
2020-12-28 23:20:18 +01:00
.then(res => {
startingLog('log', 'local credential check passed')
if (res.body.id !== store.getState().instances.local.account.id) {
store.dispatch(resetLocal())
setLocalCorrupt(true)
}
setAppLoaded(true)
})
.catch(error => {
startingLog('error', 'local credential check failed')
if (error.status && typeof error.status === 'number') {
store.dispatch(resetLocal())
setLocalCorrupt(true)
}
setAppLoaded(true)
})
} else {
startingLog('log', 'no local credential found')
setAppLoaded(true)
}
} else {
2020-12-28 23:20:18 +01:00
startingLog('warn', 'network not connected')
setAppLoaded(true)
}
2020-12-28 23:20:18 +01:00
})
}, [])
const main = useCallback(
bootstrapped => {
2020-12-28 23:20:18 +01:00
startingLog('log', 'bootstrapped')
if (bootstrapped && appLoaded) {
2020-12-28 23:20:18 +01:00
startingLog('log', 'loading actual app :)')
require('@root/i18n/i18n')
return (
<ThemeManager>
<Index localCorrupt={localCorrupt} />
</ThemeManager>
)
} else {
return null
}
},
[appLoaded]
)
2020-11-23 00:07:32 +01:00
return (
2020-12-21 23:30:26 +01:00
<QueryClientProvider client={queryClient}>
<Provider store={store}>
<PersistGate
persistor={persistor}
onBeforeLift={onBeforeLift}
children={main}
/>
2020-12-21 23:30:26 +01:00
</Provider>
</QueryClientProvider>
2020-11-23 00:07:32 +01:00
)
}
2020-10-31 21:04:46 +01:00
2021-01-01 23:10:47 +01:00
export default React.memo(App, () => true)