mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at new-image-api 204 lines 8.0 kB view raw
1import '#/lib/sentry' // must be near top 2import '#/view/icons' 3import './style.css' 4 5import React, {useEffect, useState} from 'react' 6import {RootSiblingParent} from 'react-native-root-siblings' 7import {SafeAreaProvider} from 'react-native-safe-area-context' 8import {msg} from '@lingui/macro' 9import {useLingui} from '@lingui/react' 10 11import {QueryProvider} from '#/lib/react-query' 12import {Provider as StatsigProvider} from '#/lib/statsig/statsig' 13import {ThemeProvider} from '#/lib/ThemeContext' 14import I18nProvider from '#/locale/i18nProvider' 15import {logger} from '#/logger' 16import {Provider as A11yProvider} from '#/state/a11y' 17import {Provider as MutedThreadsProvider} from '#/state/cache/thread-mutes' 18import {Provider as DialogStateProvider} from '#/state/dialogs' 19import {listenSessionDropped} from '#/state/events' 20import { 21 beginResolveGeolocation, 22 ensureGeolocationResolved, 23 Provider as GeolocationProvider, 24} from '#/state/geolocation' 25import {Provider as InvitesStateProvider} from '#/state/invites' 26import {Provider as LightboxStateProvider} from '#/state/lightbox' 27import {MessagesProvider} from '#/state/messages' 28import {Provider as ModalStateProvider} from '#/state/modals' 29import {init as initPersistedState} from '#/state/persisted' 30import {Provider as PrefsStateProvider} from '#/state/preferences' 31import {Provider as LabelDefsProvider} from '#/state/preferences/label-defs' 32import {Provider as ModerationOptsProvider} from '#/state/preferences/moderation-opts' 33import {Provider as UnreadNotifsProvider} from '#/state/queries/notifications/unread' 34import { 35 Provider as SessionProvider, 36 SessionAccount, 37 useSession, 38 useSessionApi, 39} from '#/state/session' 40import {readLastActiveAccount} from '#/state/session/util' 41import {Provider as ShellStateProvider} from '#/state/shell' 42import {Provider as ComposerProvider} from '#/state/shell/composer' 43import {Provider as LightStatusBarProvider} from '#/state/shell/light-status-bar' 44import {Provider as LoggedOutViewProvider} from '#/state/shell/logged-out' 45import {Provider as ProgressGuideProvider} from '#/state/shell/progress-guide' 46import {Provider as SelectedFeedProvider} from '#/state/shell/selected-feed' 47import {Provider as StarterPackProvider} from '#/state/shell/starter-pack' 48import {Provider as HiddenRepliesProvider} from '#/state/threadgate-hidden-replies' 49import {Provider as ActiveVideoProvider} from '#/view/com/util/post-embeds/ActiveVideoWebContext' 50import {Provider as VideoVolumeProvider} from '#/view/com/util/post-embeds/VideoVolumeContext' 51import * as Toast from '#/view/com/util/Toast' 52import {ToastContainer} from '#/view/com/util/Toast.web' 53import {Shell} from '#/view/shell/index' 54import {ThemeProvider as Alf} from '#/alf' 55import {useColorModeTheme} from '#/alf/util/useColorModeTheme' 56import {NuxDialogs} from '#/components/dialogs/nuxs' 57import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry' 58import {Provider as IntentDialogProvider} from '#/components/intents/IntentDialogs' 59import {Provider as PortalProvider} from '#/components/Portal' 60import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider' 61 62/** 63 * Begin geolocation ASAP 64 */ 65beginResolveGeolocation() 66 67function InnerApp() { 68 const [isReady, setIsReady] = React.useState(false) 69 const {currentAccount} = useSession() 70 const {resumeSession} = useSessionApi() 71 const theme = useColorModeTheme() 72 const {_} = useLingui() 73 const hasCheckedReferrer = useStarterPackEntry() 74 75 // init 76 useEffect(() => { 77 async function onLaunch(account?: SessionAccount) { 78 try { 79 if (account) { 80 await resumeSession(account) 81 } 82 } catch (e) { 83 logger.error(`session: resumeSession failed`, {message: e}) 84 } finally { 85 setIsReady(true) 86 } 87 } 88 const account = readLastActiveAccount() 89 onLaunch(account) 90 }, [resumeSession]) 91 92 useEffect(() => { 93 return listenSessionDropped(() => { 94 Toast.show( 95 _(msg`Sorry! Your session expired. Please log in again.`), 96 'info', 97 ) 98 }) 99 }, [_]) 100 101 // wait for session to resume 102 if (!isReady || !hasCheckedReferrer) return null 103 104 return ( 105 <Alf theme={theme}> 106 <ThemeProvider theme={theme}> 107 <RootSiblingParent> 108 <VideoVolumeProvider> 109 <ActiveVideoProvider> 110 <React.Fragment 111 // Resets the entire tree below when it changes: 112 key={currentAccount?.did}> 113 <QueryProvider currentDid={currentAccount?.did}> 114 <ComposerProvider> 115 <StatsigProvider> 116 <MessagesProvider> 117 {/* LabelDefsProvider MUST come before ModerationOptsProvider */} 118 <LabelDefsProvider> 119 <ModerationOptsProvider> 120 <LoggedOutViewProvider> 121 <SelectedFeedProvider> 122 <HiddenRepliesProvider> 123 <UnreadNotifsProvider> 124 <BackgroundNotificationPreferencesProvider> 125 <MutedThreadsProvider> 126 <SafeAreaProvider> 127 <ProgressGuideProvider> 128 <Shell /> 129 <NuxDialogs /> 130 </ProgressGuideProvider> 131 </SafeAreaProvider> 132 </MutedThreadsProvider> 133 </BackgroundNotificationPreferencesProvider> 134 </UnreadNotifsProvider> 135 </HiddenRepliesProvider> 136 </SelectedFeedProvider> 137 </LoggedOutViewProvider> 138 </ModerationOptsProvider> 139 </LabelDefsProvider> 140 </MessagesProvider> 141 </StatsigProvider> 142 </ComposerProvider> 143 </QueryProvider> 144 <ToastContainer /> 145 </React.Fragment> 146 </ActiveVideoProvider> 147 </VideoVolumeProvider> 148 </RootSiblingParent> 149 </ThemeProvider> 150 </Alf> 151 ) 152} 153 154function App() { 155 const [isReady, setReady] = useState(false) 156 157 React.useEffect(() => { 158 Promise.all([initPersistedState(), ensureGeolocationResolved()]).then(() => 159 setReady(true), 160 ) 161 }, []) 162 163 if (!isReady) { 164 return null 165 } 166 167 /* 168 * NOTE: only nothing here can depend on other data or session state, since 169 * that is set up in the InnerApp component above. 170 */ 171 return ( 172 <GeolocationProvider> 173 <A11yProvider> 174 <SessionProvider> 175 <PrefsStateProvider> 176 <I18nProvider> 177 <ShellStateProvider> 178 <InvitesStateProvider> 179 <ModalStateProvider> 180 <DialogStateProvider> 181 <LightboxStateProvider> 182 <PortalProvider> 183 <StarterPackProvider> 184 <IntentDialogProvider> 185 <LightStatusBarProvider> 186 <InnerApp /> 187 </LightStatusBarProvider> 188 </IntentDialogProvider> 189 </StarterPackProvider> 190 </PortalProvider> 191 </LightboxStateProvider> 192 </DialogStateProvider> 193 </ModalStateProvider> 194 </InvitesStateProvider> 195 </ShellStateProvider> 196 </I18nProvider> 197 </PrefsStateProvider> 198 </SessionProvider> 199 </A11yProvider> 200 </GeolocationProvider> 201 ) 202} 203 204export default App