diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/App.native.tsx | 71 | ||||
-rw-r--r-- | src/AppProfiler.tsx | 29 |
2 files changed, 66 insertions, 34 deletions
diff --git a/src/App.native.tsx b/src/App.native.tsx index 668fb91fc..9b2940aa9 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -69,6 +69,7 @@ import {Provider as PortalProvider} from '#/components/Portal' import {Splash} from '#/Splash' import {BottomSheetProvider} from '../modules/bottom-sheet' import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider' +import {AppProfiler} from './AppProfiler' SplashScreen.preventAutoHideAsync() @@ -184,40 +185,42 @@ function App() { * that is set up in the InnerApp component above. */ return ( - <GeolocationProvider> - <A11yProvider> - <KeyboardProvider enabled={false} statusBarTranslucent={true}> - <SessionProvider> - <PrefsStateProvider> - <I18nProvider> - <ShellStateProvider> - <InvitesStateProvider> - <ModalStateProvider> - <DialogStateProvider> - <LightboxStateProvider> - <PortalProvider> - <BottomSheetProvider> - <StarterPackProvider> - <SafeAreaProvider - initialMetrics={initialWindowMetrics}> - <IntentDialogProvider> - <InnerApp /> - </IntentDialogProvider> - </SafeAreaProvider> - </StarterPackProvider> - </BottomSheetProvider> - </PortalProvider> - </LightboxStateProvider> - </DialogStateProvider> - </ModalStateProvider> - </InvitesStateProvider> - </ShellStateProvider> - </I18nProvider> - </PrefsStateProvider> - </SessionProvider> - </KeyboardProvider> - </A11yProvider> - </GeolocationProvider> + <AppProfiler> + <GeolocationProvider> + <A11yProvider> + <KeyboardProvider enabled={false} statusBarTranslucent={true}> + <SessionProvider> + <PrefsStateProvider> + <I18nProvider> + <ShellStateProvider> + <InvitesStateProvider> + <ModalStateProvider> + <DialogStateProvider> + <LightboxStateProvider> + <PortalProvider> + <BottomSheetProvider> + <StarterPackProvider> + <SafeAreaProvider + initialMetrics={initialWindowMetrics}> + <IntentDialogProvider> + <InnerApp /> + </IntentDialogProvider> + </SafeAreaProvider> + </StarterPackProvider> + </BottomSheetProvider> + </PortalProvider> + </LightboxStateProvider> + </DialogStateProvider> + </ModalStateProvider> + </InvitesStateProvider> + </ShellStateProvider> + </I18nProvider> + </PrefsStateProvider> + </SessionProvider> + </KeyboardProvider> + </A11yProvider> + </GeolocationProvider> + </AppProfiler> ) } diff --git a/src/AppProfiler.tsx b/src/AppProfiler.tsx new file mode 100644 index 000000000..31a4cc54e --- /dev/null +++ b/src/AppProfiler.tsx @@ -0,0 +1,29 @@ +import React, {Profiler} from 'react' + +// Don't let it get stripped out in profiling builds (which apply production Babel preset). +const log = (global as any)['con' + 'sole'].log + +function onRender(id: string, phase: string, actualDuration: number) { + if (!__DEV__) { + // This block of code will exist in the production build of the app. + // However, only profiling builds of React call `onRender` so it's dead code in actual production. + const message = `<Profiler> ${id}:${phase} ${ + actualDuration > 500 + ? '(╯°□°)╯ ' + : actualDuration > 100 + ? '[!!] ' + : actualDuration > 16 + ? '[!] ' + : '' + }${Math.round(actualDuration)}ms` + log(message) + } +} + +export function AppProfiler({children}: {children: React.ReactNode}) { + return ( + <Profiler id="app" onRender={onRender}> + {children} + </Profiler> + ) +} |