mirror of
https://github.com/tooot-app/app
synced 2025-04-15 10:47:46 +02:00
Rewrite app start up procedure
This commit is contained in:
parent
7db153f2ae
commit
83b725b58d
120
App.tsx
120
App.tsx
@ -4,6 +4,7 @@ import { Index } from '@root/Index'
|
|||||||
import { persistor, store } from '@root/store'
|
import { persistor, store } from '@root/store'
|
||||||
import { resetLocal } from '@root/utils/slices/instancesSlice'
|
import { resetLocal } from '@root/utils/slices/instancesSlice'
|
||||||
import ThemeManager from '@utils/styles/ThemeManager'
|
import ThemeManager from '@utils/styles/ThemeManager'
|
||||||
|
import chalk from 'chalk'
|
||||||
import * as SplashScreen from 'expo-splash-screen'
|
import * as SplashScreen from 'expo-splash-screen'
|
||||||
import React, { useCallback, useEffect, useState } from 'react'
|
import React, { useCallback, useEffect, useState } from 'react'
|
||||||
import { enableScreens } from 'react-native-screens'
|
import { enableScreens } from 'react-native-screens'
|
||||||
@ -12,7 +13,23 @@ import { Provider } from 'react-redux'
|
|||||||
import { PersistGate } from 'redux-persist/integration/react'
|
import { PersistGate } from 'redux-persist/integration/react'
|
||||||
import * as Sentry from 'sentry-expo'
|
import * as Sentry from 'sentry-expo'
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (__DEV__) {
|
if (__DEV__) {
|
||||||
|
startingLog('log', 'initializing wdyr')
|
||||||
const whyDidYouRender = require('@welldone-software/why-did-you-render')
|
const whyDidYouRender = require('@welldone-software/why-did-you-render')
|
||||||
whyDidYouRender(React, {
|
whyDidYouRender(React, {
|
||||||
trackHooks: true,
|
trackHooks: true,
|
||||||
@ -20,12 +37,7 @@ if (__DEV__) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// onlineManager.setEventListener(setOnline => {
|
startingLog('log', 'initializing Sentry')
|
||||||
// return NetInfo.addEventListener(state => {
|
|
||||||
// setOnline(state.isConnected)
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
|
|
||||||
Sentry.init({
|
Sentry.init({
|
||||||
dsn:
|
dsn:
|
||||||
'https://c9e29aa05f774aca8f36def98244ce04@o389581.ingest.sentry.io/5571975',
|
'https://c9e29aa05f774aca8f36def98244ce04@o389581.ingest.sentry.io/5571975',
|
||||||
@ -33,24 +45,34 @@ Sentry.init({
|
|||||||
debug: __DEV__
|
debug: __DEV__
|
||||||
})
|
})
|
||||||
|
|
||||||
|
startingLog('log', 'initializing react-query')
|
||||||
const queryClient = new QueryClient()
|
const queryClient = new QueryClient()
|
||||||
|
|
||||||
|
startingLog('log', 'initializing native screen')
|
||||||
enableScreens()
|
enableScreens()
|
||||||
|
|
||||||
NetInfo.fetch().then(state => {
|
|
||||||
console.log('Connection type', state.type)
|
|
||||||
console.log('Is connected?', state.isConnected)
|
|
||||||
console.log('Is internet', state.isInternetReachable)
|
|
||||||
console.log('Details', state.details)
|
|
||||||
})
|
|
||||||
|
|
||||||
const App: React.FC = () => {
|
const App: React.FC = () => {
|
||||||
useEffect(() => onlineManager.setOnline(false), [])
|
startingLog('log', 'rendering App')
|
||||||
const [appLoaded, setAppLoaded] = useState(false)
|
const [appLoaded, setAppLoaded] = useState(false)
|
||||||
const [startVerification, setStartVerification] = useState(false)
|
|
||||||
const [localCorrupt, setLocalCorrupt] = useState(false)
|
const [localCorrupt, setLocalCorrupt] = useState(false)
|
||||||
|
|
||||||
|
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(() => {
|
useEffect(() => {
|
||||||
const delaySplash = async () => {
|
const delaySplash = async () => {
|
||||||
|
startingLog('log', 'delay splash')
|
||||||
try {
|
try {
|
||||||
await SplashScreen.preventAutoHideAsync()
|
await SplashScreen.preventAutoHideAsync()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -61,6 +83,7 @@ const App: React.FC = () => {
|
|||||||
}, [])
|
}, [])
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const hideSplash = async () => {
|
const hideSplash = async () => {
|
||||||
|
startingLog('log', 'hide splash')
|
||||||
try {
|
try {
|
||||||
await SplashScreen.hideAsync()
|
await SplashScreen.hideAsync()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -72,45 +95,54 @@ const App: React.FC = () => {
|
|||||||
}
|
}
|
||||||
}, [appLoaded])
|
}, [appLoaded])
|
||||||
|
|
||||||
const onBeforeLift = useCallback(() => setStartVerification(true), [])
|
const onBeforeLift = useCallback(() => {
|
||||||
useEffect(() => {
|
NetInfo.fetch().then(netInfo => {
|
||||||
const verifyCredentials = async () => {
|
startingLog('log', 'on before lift')
|
||||||
const localUrl = store.getState().instances.local.url
|
const localUrl = store.getState().instances.local.url
|
||||||
const localToken = store.getState().instances.local.token
|
const localToken = store.getState().instances.local.token
|
||||||
|
if (netInfo.isConnected) {
|
||||||
if (localUrl && localToken) {
|
startingLog('log', 'network connected')
|
||||||
client({
|
if (localUrl && localToken) {
|
||||||
method: 'get',
|
startingLog('log', 'checking locally stored credentials')
|
||||||
instance: 'remote',
|
client({
|
||||||
instanceDomain: localUrl,
|
method: 'get',
|
||||||
url: `accounts/verify_credentials`,
|
instance: 'remote',
|
||||||
headers: { Authorization: `Bearer ${localToken}` }
|
instanceDomain: localUrl,
|
||||||
})
|
url: `accounts/verify_credentials`,
|
||||||
.then(res => {
|
headers: { Authorization: `Bearer ${localToken}` }
|
||||||
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)
|
|
||||||
})
|
})
|
||||||
|
.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 {
|
} else {
|
||||||
|
startingLog('warn', 'network not connected')
|
||||||
setAppLoaded(true)
|
setAppLoaded(true)
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
|
}, [])
|
||||||
if (startVerification) {
|
|
||||||
verifyCredentials()
|
|
||||||
}
|
|
||||||
}, [startVerification])
|
|
||||||
|
|
||||||
const main = useCallback(
|
const main = useCallback(
|
||||||
bootstrapped => {
|
bootstrapped => {
|
||||||
|
startingLog('log', 'bootstrapped')
|
||||||
if (bootstrapped && appLoaded) {
|
if (bootstrapped && appLoaded) {
|
||||||
|
startingLog('log', 'loading actual app :)')
|
||||||
require('@root/i18n/i18n')
|
require('@root/i18n/i18n')
|
||||||
return (
|
return (
|
||||||
<ThemeManager>
|
<ThemeManager>
|
||||||
|
@ -5,7 +5,7 @@ import {
|
|||||||
NavigationContainerRef
|
NavigationContainerRef
|
||||||
} from '@react-navigation/native'
|
} from '@react-navigation/native'
|
||||||
|
|
||||||
import React, { useEffect, useRef } from 'react'
|
import React, { useEffect, useRef, useState } from 'react'
|
||||||
import { StatusBar } from 'react-native'
|
import { StatusBar } from 'react-native'
|
||||||
import Toast from 'react-native-toast-message'
|
import Toast from 'react-native-toast-message'
|
||||||
import { Feather } from '@expo/vector-icons'
|
import { Feather } from '@expo/vector-icons'
|
||||||
@ -30,6 +30,7 @@ import {
|
|||||||
import { useInfiniteQuery } from 'react-query'
|
import { useInfiniteQuery } from 'react-query'
|
||||||
import client from './api/client'
|
import client from './api/client'
|
||||||
import { timelineFetch } from './utils/fetches/timelineFetch'
|
import { timelineFetch } from './utils/fetches/timelineFetch'
|
||||||
|
import { useNetInfo } from '@react-native-community/netinfo'
|
||||||
|
|
||||||
const Tab = createBottomTabNavigator<RootStackParamList>()
|
const Tab = createBottomTabNavigator<RootStackParamList>()
|
||||||
|
|
||||||
@ -55,6 +56,19 @@ export const Index: React.FC<Props> = ({ localCorrupt }) => {
|
|||||||
dark = 'light-content'
|
dark = 'light-content'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isConnected = useNetInfo().isConnected
|
||||||
|
const [firstRender, setFirstRender] = useState(false)
|
||||||
|
useEffect(() => {
|
||||||
|
if (firstRender) {
|
||||||
|
// bug in netInfo on first render as false
|
||||||
|
if (isConnected !== false) {
|
||||||
|
toast({ type: 'error', content: '手机🈚️网络', autoHide: false })
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setFirstRender(true)
|
||||||
|
}
|
||||||
|
}, [isConnected, firstRender])
|
||||||
|
|
||||||
// On launch display login credentials corrupt information
|
// On launch display login credentials corrupt information
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const showLocalCorrect = localCorrupt
|
const showLocalCorrect = localCorrupt
|
||||||
|
@ -65,19 +65,21 @@ const client = async ({
|
|||||||
if (error.response) {
|
if (error.response) {
|
||||||
// The request was made and the server responded with a status code
|
// The request was made and the server responded with a status code
|
||||||
// that falls out of the range of 2xx
|
// that falls out of the range of 2xx
|
||||||
console.error('axios error', error.response)
|
console.error(
|
||||||
return Promise.reject({
|
ctx.bold(' API '),
|
||||||
headers: error.response.headers,
|
ctx.bold('response'),
|
||||||
body: error.response.data.error
|
error.response.status,
|
||||||
})
|
error.response.data.error
|
||||||
|
)
|
||||||
|
return Promise.reject(error.response)
|
||||||
} else if (error.request) {
|
} else if (error.request) {
|
||||||
// The request was made but no response was received
|
// The request was made but no response was received
|
||||||
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
|
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
|
||||||
// http.ClientRequest in node.js
|
// http.ClientRequest in node.js
|
||||||
console.error('axios error', error)
|
console.error(ctx.bold(' API '), ctx.bold('request'), error)
|
||||||
return Promise.reject()
|
return Promise.reject()
|
||||||
} else {
|
} else {
|
||||||
console.error('axios error', error.message)
|
console.error(ctx.bold(' API '), ctx.bold('other'), error.message)
|
||||||
return Promise.reject({ body: error.message })
|
return Promise.reject({ body: error.message })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -33,12 +33,12 @@ const toast = ({
|
|||||||
onHide
|
onHide
|
||||||
}: Params) => {
|
}: Params) => {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
type: type,
|
type,
|
||||||
position: position,
|
position,
|
||||||
text1: content,
|
text1: content,
|
||||||
text2: description,
|
text2: description,
|
||||||
visibilityTime: 2000,
|
visibilityTime: 1500,
|
||||||
autoHide: autoHide,
|
autoHide,
|
||||||
topOffset: 0,
|
topOffset: 0,
|
||||||
bottomOffset: 0,
|
bottomOffset: 0,
|
||||||
onShow: onShow,
|
onShow: onShow,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user