diff options
Diffstat (limited to 'src/App.web.tsx')
-rw-r--r-- | src/App.web.tsx | 103 |
1 files changed, 74 insertions, 29 deletions
diff --git a/src/App.web.tsx b/src/App.web.tsx index adad9ddb6..e939dda6d 100644 --- a/src/App.web.tsx +++ b/src/App.web.tsx @@ -1,59 +1,84 @@ import 'lib/sentry' // must be near top import React, {useState, useEffect} from 'react' -import {observer} from 'mobx-react-lite' import {QueryClientProvider} from '@tanstack/react-query' import {SafeAreaProvider} from 'react-native-safe-area-context' import {RootSiblingParent} from 'react-native-root-siblings' +import {enableFreeze} from 'react-native-screens' import 'view/icons' import {init as initPersistedState} from '#/state/persisted' +import {init as initReminders} from '#/state/shell/reminders' import {useColorMode} from 'state/shell' import * as analytics from 'lib/analytics/analytics' -import {RootStoreModel, setupState, RootStoreProvider} from './state' import {Shell} from 'view/shell/index' import {ToastContainer} from 'view/com/util/Toast.web' import {ThemeProvider} from 'lib/ThemeContext' import {queryClient} from 'lib/react-query' import {Provider as ShellStateProvider} from 'state/shell' +import {Provider as ModalStateProvider} from 'state/modals' +import {Provider as LightboxStateProvider} from 'state/lightbox' +import {Provider as MutedThreadsProvider} from 'state/muted-threads' +import {Provider as InvitesStateProvider} from 'state/invites' +import {Provider as PrefsStateProvider} from 'state/preferences' +import {Provider as LoggedOutViewProvider} from 'state/shell/logged-out' +import I18nProvider from './locale/i18nProvider' +import { + Provider as SessionProvider, + useSession, + useSessionApi, +} from 'state/session' +import {Provider as UnreadNotifsProvider} from 'state/queries/notifications/unread' +import * as persisted from '#/state/persisted' -const InnerApp = observer(function AppImpl() { +enableFreeze(true) + +function InnerApp() { + const {isInitialLoad, currentAccount} = useSession() + const {resumeSession} = useSessionApi() const colorMode = useColorMode() - const [rootStore, setRootStore] = useState<RootStoreModel | undefined>( - undefined, - ) // init useEffect(() => { - setupState().then(store => { - setRootStore(store) - analytics.init(store) - }) - }, []) + initReminders() + analytics.init() + const account = persisted.get('session').currentAccount + resumeSession(account) + }, [resumeSession]) // show nothing prior to init - if (!rootStore) { + if (isInitialLoad) { + // TODO add a loading state return null } + /* + * Session and initial state should be loaded prior to rendering below. + */ + return ( - <QueryClientProvider client={queryClient}> - <ThemeProvider theme={colorMode}> - <RootSiblingParent> - <analytics.Provider> - <RootStoreProvider value={rootStore}> - <SafeAreaProvider> - <Shell /> - </SafeAreaProvider> + <React.Fragment + // Resets the entire tree below when it changes: + key={currentAccount?.did}> + <LoggedOutViewProvider> + <UnreadNotifsProvider> + <ThemeProvider theme={colorMode}> + <analytics.Provider> + {/* All components should be within this provider */} + <RootSiblingParent> + <SafeAreaProvider> + <Shell /> + </SafeAreaProvider> + </RootSiblingParent> <ToastContainer /> - </RootStoreProvider> - </analytics.Provider> - </RootSiblingParent> - </ThemeProvider> - </QueryClientProvider> + </analytics.Provider> + </ThemeProvider> + </UnreadNotifsProvider> + </LoggedOutViewProvider> + </React.Fragment> ) -}) +} function App() { const [isReady, setReady] = useState(false) @@ -66,10 +91,30 @@ function App() { return null } + /* + * NOTE: only nothing here can depend on other data or session state, since + * that is set up in the InnerApp component above. + */ return ( - <ShellStateProvider> - <InnerApp /> - </ShellStateProvider> + <QueryClientProvider client={queryClient}> + <SessionProvider> + <ShellStateProvider> + <PrefsStateProvider> + <MutedThreadsProvider> + <InvitesStateProvider> + <ModalStateProvider> + <LightboxStateProvider> + <I18nProvider> + <InnerApp /> + </I18nProvider> + </LightboxStateProvider> + </ModalStateProvider> + </InvitesStateProvider> + </MutedThreadsProvider> + </PrefsStateProvider> + </ShellStateProvider> + </SessionProvider> + </QueryClientProvider> ) } |