[Perf - part 3] Stop every dialog control in the entire app rerendering when opening a dialog (#8815)

This commit is contained in:
Samuel Newman
2025-08-14 01:11:44 +03:00
committed by GitHub
parent eef639ea54
commit 275fece3e3
2 changed files with 19 additions and 16 deletions
+17 -14
View File
@@ -1,7 +1,7 @@
import React from 'react'
import {isWeb} from '#/platform/detection'
import {DialogControlRefProps} from '#/components/Dialog'
import {type DialogControlRefProps} from '#/components/Dialog'
import {Provider as GlobalDialogsProvider} from '#/components/dialogs/Context'
import {BottomSheetNativeComponent} from '../../../modules/bottom-sheet'
@@ -22,11 +22,6 @@ interface IDialogContext {
interface IDialogControlContext {
closeAllDialogs(): boolean
setDialogIsOpen(id: string, isOpen: boolean): void
/**
* The number of dialogs that are fully expanded. This is used to determine the backgground color of the status bar
* on iOS.
*/
fullyExpandedCount: number
setFullyExpandedCount: React.Dispatch<React.SetStateAction<number>>
}
@@ -36,6 +31,13 @@ const DialogControlContext = React.createContext<IDialogControlContext>(
{} as IDialogControlContext,
)
/**
* The number of dialogs that are fully expanded. This is used to determine the background color of the status bar
* on iOS.
*/
const DialogFullyExpandedCountContext = React.createContext<number>(0)
DialogFullyExpandedCountContext.displayName = 'DialogFullyExpandedCountContext'
export function useDialogStateContext() {
return React.useContext(DialogContext)
}
@@ -44,6 +46,11 @@ export function useDialogStateControlContext() {
return React.useContext(DialogControlContext)
}
/** The number of dialogs that are fully expanded */
export function useDialogFullyExpandedCountContext() {
return React.useContext(DialogFullyExpandedCountContext)
}
export function Provider({children}: React.PropsWithChildren<{}>) {
const [fullyExpandedCount, setFullyExpandedCount] = React.useState(0)
@@ -85,21 +92,17 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
() => ({
closeAllDialogs,
setDialogIsOpen,
fullyExpandedCount,
setFullyExpandedCount,
}),
[
closeAllDialogs,
setDialogIsOpen,
fullyExpandedCount,
setFullyExpandedCount,
],
[closeAllDialogs, setDialogIsOpen, setFullyExpandedCount],
)
return (
<DialogContext.Provider value={context}>
<DialogControlContext.Provider value={controls}>
<GlobalDialogsProvider>{children}</GlobalDialogsProvider>
<DialogFullyExpandedCountContext.Provider value={fullyExpandedCount}>
<GlobalDialogsProvider>{children}</GlobalDialogsProvider>
</DialogFullyExpandedCountContext.Provider>
</DialogControlContext.Provider>
</DialogContext.Provider>
)
+2 -2
View File
@@ -12,7 +12,7 @@ import {useNotificationsHandler} from '#/lib/hooks/useNotificationHandler'
import {useNotificationsRegistration} from '#/lib/notifications/notifications'
import {isStateAtTabRoot} from '#/lib/routes/helpers'
import {isAndroid, isIOS} from '#/platform/detection'
import {useDialogStateControlContext} from '#/state/dialogs'
import {useDialogFullyExpandedCountContext} from '#/state/dialogs'
import {useSession} from '#/state/session'
import {
useIsDrawerOpen,
@@ -181,7 +181,7 @@ function ShellInner() {
}
export const Shell: React.FC = function ShellImpl() {
const {fullyExpandedCount} = useDialogStateControlContext()
const fullyExpandedCount = useDialogFullyExpandedCountContext()
const t = useTheme()
useIntentHandler()