Skip to content

Commit f58d10c

Browse files
mountinyOSBotify
authored andcommitted
Merge pull request #44544 from software-mansion-labs/fix/freeze-screen-with-lazy-loading
[CP Staging] Add freezeScreenWithLazyLoading function (cherry picked from commit 9d88c63)
1 parent b03ed0a commit f58d10c

File tree

4 files changed

+40
-37
lines changed

4 files changed

+40
-37
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,10 @@
1-
import type {ComponentType, ForwardedRef, RefAttributes} from 'react';
2-
import React from 'react';
3-
import getComponentDisplayName from '@libs/getComponentDisplayName';
4-
import FreezeWrapper from '@libs/Navigation/FreezeWrapper';
1+
import type React from 'react';
2+
import freezeScreenWithLazyLoading from '@libs/freezeScreenWithLazyLoading';
53

64
/**
7-
* This HOC is dependent on the platform. On native platforms, screens that aren't already displayed in the navigation stack should be frozen to prevent unnecessary rendering.
5+
* This higher-order function is dependent on the platform. On native platforms, screens that aren't already displayed in the navigation stack should be frozen to prevent unnecessary rendering.
86
* It's handled this way only on mobile platforms because on the web, more than one screen is displayed in a wide layout, so these screens shouldn't be frozen.
97
*/
10-
export default function withPrepareCentralPaneScreen<TProps, TRef>(
11-
WrappedComponent: ComponentType<TProps & RefAttributes<TRef>>,
12-
): (props: TProps & React.RefAttributes<TRef>) => React.ReactElement | null {
13-
function WithPrepareCentralPaneScreen(props: TProps, ref: ForwardedRef<TRef>) {
14-
return (
15-
<FreezeWrapper>
16-
<WrappedComponent
17-
// eslint-disable-next-line react/jsx-props-no-spreading
18-
{...props}
19-
ref={ref}
20-
/>
21-
</FreezeWrapper>
22-
);
23-
}
24-
25-
WithPrepareCentralPaneScreen.displayName = `WithPrepareCentralPaneScreen(${getComponentDisplayName(WrappedComponent)})`;
26-
return React.forwardRef(WithPrepareCentralPaneScreen);
8+
export default function withPrepareCentralPaneScreen(lazyComponent: () => React.ComponentType) {
9+
return freezeScreenWithLazyLoading(lazyComponent);
2710
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import type {ComponentType} from 'react';
1+
import type React from 'react';
22

33
/**
4-
* This HOC is dependent on the platform. On native platforms, screens that aren't already displayed in the navigation stack should be frozen to prevent unnecessary rendering.
4+
* This higher-order function is dependent on the platform. On native platforms, screens that aren't already displayed in the navigation stack should be frozen to prevent unnecessary rendering.
55
* It's handled this way only on mobile platforms because on the web, more than one screen is displayed in a wide layout, so these screens shouldn't be frozen.
66
*/
7-
export default function withPrepareCentralPaneScreen(WrappedComponent: ComponentType) {
8-
return WrappedComponent;
7+
export default function withPrepareCentralPaneScreen(lazyComponent: () => React.ComponentType) {
8+
return lazyComponent;
99
}

src/libs/Navigation/AppNavigator/CENTRAL_PANE_SCREENS.tsx

+11-11
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ import type ReactComponentModule from '@src/types/utils/ReactComponentModule';
66
type Screens = Partial<Record<CentralPaneName, () => React.ComponentType>>;
77

88
const CENTRAL_PANE_SCREENS = {
9-
[SCREENS.SETTINGS.WORKSPACES]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/workspace/WorkspacesListPage').default),
10-
[SCREENS.SETTINGS.PREFERENCES.ROOT]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/settings/Preferences/PreferencesPage').default),
11-
[SCREENS.SETTINGS.SECURITY]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/settings/Security/SecuritySettingsPage').default),
12-
[SCREENS.SETTINGS.PROFILE.ROOT]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/settings/Profile/ProfilePage').default),
13-
[SCREENS.SETTINGS.WALLET.ROOT]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/settings/Wallet/WalletPage').default),
14-
[SCREENS.SETTINGS.ABOUT]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/settings/AboutPage/AboutPage').default),
15-
[SCREENS.SETTINGS.TROUBLESHOOT]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/settings/Troubleshoot/TroubleshootPage').default),
16-
[SCREENS.SETTINGS.SAVE_THE_WORLD]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/TeachersUnite/SaveTheWorldPage').default),
17-
[SCREENS.SETTINGS.SUBSCRIPTION.ROOT]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/settings/Subscription/SubscriptionSettingsPage').default),
18-
[SCREENS.SEARCH.CENTRAL_PANE]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('../../../pages/Search/SearchPage').default),
19-
[SCREENS.REPORT]: () => withPrepareCentralPaneScreen(require<ReactComponentModule>('./ReportScreenWrapper').default),
9+
[SCREENS.SETTINGS.WORKSPACES]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/workspace/WorkspacesListPage').default),
10+
[SCREENS.SETTINGS.PREFERENCES.ROOT]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/settings/Preferences/PreferencesPage').default),
11+
[SCREENS.SETTINGS.SECURITY]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/settings/Security/SecuritySettingsPage').default),
12+
[SCREENS.SETTINGS.PROFILE.ROOT]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/settings/Profile/ProfilePage').default),
13+
[SCREENS.SETTINGS.WALLET.ROOT]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/settings/Wallet/WalletPage').default),
14+
[SCREENS.SETTINGS.ABOUT]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/settings/AboutPage/AboutPage').default),
15+
[SCREENS.SETTINGS.TROUBLESHOOT]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/settings/Troubleshoot/TroubleshootPage').default),
16+
[SCREENS.SETTINGS.SAVE_THE_WORLD]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/TeachersUnite/SaveTheWorldPage').default),
17+
[SCREENS.SETTINGS.SUBSCRIPTION.ROOT]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/settings/Subscription/SubscriptionSettingsPage').default),
18+
[SCREENS.SEARCH.CENTRAL_PANE]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('../../../pages/Search/SearchPage').default),
19+
[SCREENS.REPORT]: withPrepareCentralPaneScreen(() => require<ReactComponentModule>('./ReportScreenWrapper').default),
2020
} satisfies Screens;
2121

2222
export default CENTRAL_PANE_SCREENS;
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React from 'react';
2+
import FreezeWrapper from './Navigation/FreezeWrapper';
3+
4+
function FrozenScreen<TProps extends React.JSX.IntrinsicAttributes>(WrappedComponent: React.ComponentType<TProps>) {
5+
return (props: TProps) => (
6+
<FreezeWrapper>
7+
<WrappedComponent
8+
// eslint-disable-next-line react/jsx-props-no-spreading
9+
{...props}
10+
/>
11+
</FreezeWrapper>
12+
);
13+
}
14+
15+
export default function freezeScreenWithLazyLoading(lazyComponent: () => React.ComponentType) {
16+
return () => {
17+
const Component = lazyComponent();
18+
return FrozenScreen(Component);
19+
};
20+
}

0 commit comments

Comments
 (0)