From bf6cafa3a006e9e37cd781aa03eafe9b43dc7493 Mon Sep 17 00:00:00 2001 From: Satyajit Sahoo Date: Fri, 22 Mar 2024 22:44:48 +0100 Subject: [PATCH] refactor: accept options in createPathConfigForStaticNavigation --- example/src/Screens/Static.tsx | 2 +- packages/core/src/StaticNavigation.tsx | 27 +++++++++++++------ .../src/__tests__/StaticNavigation.test.tsx | 8 +++--- .../native/src/createStaticNavigation.tsx | 19 +++---------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/example/src/Screens/Static.tsx b/example/src/Screens/Static.tsx index dae1023581..82d6757087 100644 --- a/example/src/Screens/Static.tsx +++ b/example/src/Screens/Static.tsx @@ -105,7 +105,7 @@ export function StaticScreen() { } StaticScreen.title = 'Static config'; -StaticScreen.linking = createPathConfigForStaticNavigation(RootStack); +StaticScreen.linking = createPathConfigForStaticNavigation(RootStack, {}); const styles = StyleSheet.create({ buttons: { diff --git a/packages/core/src/StaticNavigation.tsx b/packages/core/src/StaticNavigation.tsx index ba4bbbc820..f701e4abd9 100644 --- a/packages/core/src/StaticNavigation.tsx +++ b/packages/core/src/StaticNavigation.tsx @@ -470,6 +470,8 @@ type TreeForPathConfig = { * Create a path config object from a static navigation config for deep linking. * * @param tree Static navigation config. + * @param options Additional options from `linking.config`. + * @param auto Whether to automatically generate paths for leaf screens. * @returns Path config object to use in linking config. * * @example @@ -485,13 +487,16 @@ type TreeForPathConfig = { */ export function createPathConfigForStaticNavigation( tree: TreeForPathConfig, - auto?: boolean, - root?: boolean + options: { + initialRouteName?: string; + }, + auto?: boolean ) { let initialScreenConfig: PathConfig | undefined; const createPathConfigForTree = ( t: TreeForPathConfig, + o: { initialRouteName?: string }, // If a screen is a leaf node, but inside a screen with path, // It should not be used for initial detection skipInitialDetection: boolean @@ -537,6 +542,7 @@ export function createPathConfigForStaticNavigation( if ('config' in item) { screens = createPathConfigForTree( item, + {}, skipInitialDetection || screenConfig.path != null ); } else if ( @@ -546,12 +552,11 @@ export function createPathConfigForStaticNavigation( ) { screens = createPathConfigForTree( item.screen, + {}, skipInitialDetection || screenConfig.path != null ); } - // Reset initial detection flag after exiting the nested screens - if (screens) { screenConfig.screens = screens; } @@ -590,14 +595,20 @@ export function createPathConfigForStaticNavigation( }; const screens = t.config.screens - ? createPathConfigForScreens(t.config.screens, t.config.initialRouteName) + ? createPathConfigForScreens( + t.config.screens, + o?.initialRouteName ?? t.config.initialRouteName + ) : {}; if (t.config.groups) { Object.entries(t.config.groups).forEach(([, group]) => { Object.assign( screens, - createPathConfigForScreens(group.screens, t.config.initialRouteName) + createPathConfigForScreens( + group.screens, + o?.initialRouteName ?? t.config.initialRouteName + ) ); }); } @@ -609,9 +620,9 @@ export function createPathConfigForStaticNavigation( return screens; }; - const screens = createPathConfigForTree(tree, false); + const screens = createPathConfigForTree(tree, options, false); - if (auto && root && initialScreenConfig) { + if (auto && initialScreenConfig) { initialScreenConfig.path = ''; } diff --git a/packages/core/src/__tests__/StaticNavigation.test.tsx b/packages/core/src/__tests__/StaticNavigation.test.tsx index 1ca87817e6..7b73a42cc1 100644 --- a/packages/core/src/__tests__/StaticNavigation.test.tsx +++ b/packages/core/src/__tests__/StaticNavigation.test.tsx @@ -337,7 +337,7 @@ it('creates linking configuration for static config', () => { }, }); - const screens = createPathConfigForStaticNavigation(Root); + const screens = createPathConfigForStaticNavigation(Root, {}); expect(screens).toMatchInlineSnapshot(` { @@ -473,7 +473,7 @@ it('returns undefined if there is no linking configuration', () => { }, }); - const screens = createPathConfigForStaticNavigation(Root); + const screens = createPathConfigForStaticNavigation(Root, {}); expect(screens).toBeUndefined(); }); @@ -553,7 +553,7 @@ it('automatically generates paths if auto is specified', () => { }, }); - const screens = createPathConfigForStaticNavigation(Root, true, true); + const screens = createPathConfigForStaticNavigation(Root, {}, true); assert.ok(screens); @@ -764,7 +764,7 @@ it('use initialRouteName for the automatic home screen', () => { }, }); - const screens = createPathConfigForStaticNavigation(Root, true, true); + const screens = createPathConfigForStaticNavigation(Root, {}, true); assert.ok(screens); diff --git a/packages/native/src/createStaticNavigation.tsx b/packages/native/src/createStaticNavigation.tsx index bc97b87e0b..7bacf5ad58 100644 --- a/packages/native/src/createStaticNavigation.tsx +++ b/packages/native/src/createStaticNavigation.tsx @@ -54,25 +54,14 @@ export function createStaticNavigation(tree: StaticNavigation) { const screens = React.useMemo(() => { if (tree.config.screens) { return createPathConfigForStaticNavigation( - { - ...tree, - ...{ - config: { - ...tree.config, - initialRouteName: - linking?.config?.initialRouteName ?? - typeof tree.config.initialRouteName, - screens: tree.config.screens, - }, - }, - }, - linking?.enabled === 'auto', - true + tree, + { initialRouteName: linking?.config?.initialRouteName }, + linking?.enabled === 'auto' ); } return undefined; - }, [linking?.config?.initialRouteName, linking?.enabled]); + }, [linking?.config, linking?.enabled]); if (linking?.enabled === true && screens == null) { throw new Error(