Skip to content

Commit 3ba527a

Browse files
committed
add useComponentsByName custom hook, shared among both containers
1 parent 0cca1e0 commit 3ba527a

3 files changed

Lines changed: 43 additions & 28 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import React, { useMemo } from 'react';
2+
import type { StackRouteConfig } from '../stack';
3+
import type { TabRouteConfig } from '../tabs';
4+
5+
export const useComponentsByName = (
6+
routeConfigs: StackRouteConfig[] | TabRouteConfig[],
7+
) => {
8+
return useMemo(() => {
9+
const map = new Map<string, React.ComponentType>();
10+
11+
for (const config of routeConfigs) {
12+
map.set(config.name, config.Component);
13+
}
14+
15+
return map;
16+
}, [routeConfigs]);
17+
};

apps/src/shared/gamma/containers/stack/StackContainer.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,12 @@ import {
2121
useRenderDebugInfo,
2222
} from 'react-native-screens/private';
2323
import { useParentNavigationEffect } from './hooks/useParentNavigationEffect';
24+
import { useComponentsByName } from '../shared/use-components-by-name';
2425

2526
export function StackContainer({ routeConfigs }: StackContainerProps) {
2627
useSanitizeRouteConfigs(routeConfigs);
2728

28-
const componentsByName = React.useMemo(() => {
29-
const map = new Map<string, StackRouteConfig['Component']>();
30-
for (const config of routeConfigs) {
31-
map.set(config.name, config.Component);
32-
}
33-
return map;
34-
}, [routeConfigs]);
29+
const componentsByName = useComponentsByName(routeConfigs);
3530

3631
const [stackNavState, navActionDispatch]: [
3732
StackNavigationState,
@@ -70,7 +65,12 @@ export function StackContainer({ routeConfigs }: StackContainerProps) {
7065
return (
7166
<Stack.Host ref={hostRef}>
7267
{stackNavState.stack.map(
73-
({ options: { headerConfig, ...options }, activityMode, routeKey, name }) => {
68+
({
69+
options: { headerConfig, ...options },
70+
activityMode,
71+
routeKey,
72+
name,
73+
}) => {
7474
const stackNavigationContext: StackNavigationContextPayload = {
7575
routeKey,
7676
routeOptions: { ...options },

apps/src/shared/gamma/containers/tabs/TabsContainer.tsx

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,16 @@ import {
2121
} from './reducer';
2222
import { RNSLog } from 'react-native-screens/private';
2323
import { TabsContainerItem } from './TabsContainerItem';
24+
import { useComponentsByName } from '../shared/use-components-by-name';
2425

2526
export function TabsContainer(props: TabsContainerProps) {
2627
RNSLog.info('TabsContainer render');
2728

28-
const {
29-
routeConfigs,
30-
defaultRouteName,
31-
onTabSelected,
32-
...restProps
33-
} = props;
29+
const { routeConfigs, defaultRouteName, onTabSelected, ...restProps } = props;
3430

3531
useSanitizeRouteConfigs(routeConfigs);
3632

37-
const componentsByName = React.useMemo(() => {
38-
const map = new Map<string, TabRouteConfig['Component']>();
39-
for (const config of routeConfigs) {
40-
map.set(config.name, config.Component);
41-
}
42-
return map;
43-
}, [routeConfigs]);
33+
const componentsByName = useComponentsByName(routeConfigs);
4434

4535
const [tabsNavState, dispatch]: [
4636
TabsContainerState,
@@ -142,7 +132,9 @@ function useSanitizeRouteConfigs(routeConfigs: TabRouteConfig[]) {
142132
}
143133
}
144134

145-
function useTabsNavigationMethods(dispatch: React.Dispatch<TabsNavigationAction>): TabsNavigationMethods {
135+
function useTabsNavigationMethods(
136+
dispatch: React.Dispatch<TabsNavigationAction>,
137+
): TabsNavigationMethods {
146138
const setRouteOptions = React.useCallback(
147139
(routeKey: string, options: Partial<TabRouteOptions>) => {
148140
dispatch({ type: 'set-options', routeKey, options });
@@ -153,14 +145,20 @@ function useTabsNavigationMethods(dispatch: React.Dispatch<TabsNavigationAction>
153145
const selectTab: SelectTabMethod = React.useCallback(
154146
(routeKey: string, forceAction?: boolean) => {
155147
const shouldForceAction = forceAction ?? false;
156-
dispatch({ type: 'tab-select', routeKey, forceAction: shouldForceAction });
148+
dispatch({
149+
type: 'tab-select',
150+
routeKey,
151+
forceAction: shouldForceAction,
152+
});
157153
},
158154
[dispatch],
159155
);
160156

161-
162-
return React.useMemo(() => ({
163-
setRouteOptions,
164-
selectTab
165-
}), [setRouteOptions, selectTab]);
157+
return React.useMemo(
158+
() => ({
159+
setRouteOptions,
160+
selectTab,
161+
}),
162+
[setRouteOptions, selectTab],
163+
);
166164
}

0 commit comments

Comments
 (0)