@react-navigation/core 6.0.1 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/lib/commonjs/BaseNavigationContainer.js +17 -12
  2. package/lib/commonjs/BaseNavigationContainer.js.map +1 -1
  3. package/lib/commonjs/CurrentRenderContext.js.map +1 -1
  4. package/lib/commonjs/EnsureSingleNavigator.js +5 -4
  5. package/lib/commonjs/EnsureSingleNavigator.js.map +1 -1
  6. package/lib/commonjs/NavigationContainerRefContext.js.map +1 -1
  7. package/lib/commonjs/NavigationContext.js.map +1 -1
  8. package/lib/commonjs/NavigationHelpersContext.js.map +1 -1
  9. package/lib/commonjs/NavigationRouteContext.js.map +1 -1
  10. package/lib/commonjs/SceneView.js +11 -10
  11. package/lib/commonjs/SceneView.js.map +1 -1
  12. package/lib/commonjs/UnhandledActionContext.js.map +1 -1
  13. package/lib/commonjs/createNavigationContainerRef.js +64 -16
  14. package/lib/commonjs/createNavigationContainerRef.js.map +1 -1
  15. package/lib/commonjs/createNavigatorFactory.js +1 -1
  16. package/lib/commonjs/createNavigatorFactory.js.map +1 -1
  17. package/lib/commonjs/fromEntries.js +3 -1
  18. package/lib/commonjs/fromEntries.js.map +1 -1
  19. package/lib/commonjs/getActionFromState.js +2 -1
  20. package/lib/commonjs/getActionFromState.js.map +1 -1
  21. package/lib/commonjs/getPathFromState.js +13 -3
  22. package/lib/commonjs/getPathFromState.js.map +1 -1
  23. package/lib/commonjs/getStateFromPath.js +12 -2
  24. package/lib/commonjs/getStateFromPath.js.map +1 -1
  25. package/lib/commonjs/index.js +24 -24
  26. package/lib/commonjs/isArrayEqual.js +9 -1
  27. package/lib/commonjs/isArrayEqual.js.map +1 -1
  28. package/lib/commonjs/isRecordEqual.js +25 -0
  29. package/lib/commonjs/isRecordEqual.js.map +1 -0
  30. package/lib/commonjs/types.js.map +1 -1
  31. package/lib/commonjs/useChildListeners.js.map +1 -1
  32. package/lib/commonjs/useCurrentRender.js +6 -5
  33. package/lib/commonjs/useCurrentRender.js.map +1 -1
  34. package/lib/commonjs/useDescriptors.js +18 -17
  35. package/lib/commonjs/useDescriptors.js.map +1 -1
  36. package/lib/commonjs/useEventEmitter.js +7 -6
  37. package/lib/commonjs/useEventEmitter.js.map +1 -1
  38. package/lib/commonjs/useFocusEvents.js +5 -4
  39. package/lib/commonjs/useFocusEvents.js.map +1 -1
  40. package/lib/commonjs/useFocusedListenersChildrenAdapter.js +5 -4
  41. package/lib/commonjs/useFocusedListenersChildrenAdapter.js.map +1 -1
  42. package/lib/commonjs/useKeyedChildListeners.js.map +1 -1
  43. package/lib/commonjs/useNavigationBuilder.js +51 -20
  44. package/lib/commonjs/useNavigationBuilder.js.map +1 -1
  45. package/lib/commonjs/useNavigationCache.js +17 -10
  46. package/lib/commonjs/useNavigationCache.js.map +1 -1
  47. package/lib/commonjs/useNavigationHelpers.js +10 -7
  48. package/lib/commonjs/useNavigationHelpers.js.map +1 -1
  49. package/lib/commonjs/useOnAction.js +13 -11
  50. package/lib/commonjs/useOnAction.js.map +1 -1
  51. package/lib/commonjs/useOnGetState.js +5 -4
  52. package/lib/commonjs/useOnGetState.js.map +1 -1
  53. package/lib/commonjs/useOnPreventRemove.js +6 -5
  54. package/lib/commonjs/useOnPreventRemove.js.map +1 -1
  55. package/lib/commonjs/useOnRouteFocus.js +7 -6
  56. package/lib/commonjs/useOnRouteFocus.js.map +1 -1
  57. package/lib/commonjs/useOptionsGetters.js +6 -5
  58. package/lib/commonjs/useOptionsGetters.js.map +1 -1
  59. package/lib/commonjs/useRegisterNavigator.js +1 -1
  60. package/lib/commonjs/useRegisterNavigator.js.map +1 -1
  61. package/lib/commonjs/useRouteCache.js +1 -1
  62. package/lib/commonjs/useScheduleUpdate.js +1 -1
  63. package/lib/commonjs/validatePathConfig.js +5 -2
  64. package/lib/commonjs/validatePathConfig.js.map +1 -1
  65. package/lib/module/BaseNavigationContainer.js +17 -12
  66. package/lib/module/BaseNavigationContainer.js.map +1 -1
  67. package/lib/module/CurrentRenderContext.js.map +1 -1
  68. package/lib/module/EnsureSingleNavigator.js +4 -3
  69. package/lib/module/EnsureSingleNavigator.js.map +1 -1
  70. package/lib/module/NavigationContainerRefContext.js.map +1 -1
  71. package/lib/module/NavigationContext.js.map +1 -1
  72. package/lib/module/NavigationHelpersContext.js.map +1 -1
  73. package/lib/module/NavigationRouteContext.js.map +1 -1
  74. package/lib/module/SceneView.js +11 -10
  75. package/lib/module/SceneView.js.map +1 -1
  76. package/lib/module/UnhandledActionContext.js.map +1 -1
  77. package/lib/module/createNavigationContainerRef.js +63 -15
  78. package/lib/module/createNavigationContainerRef.js.map +1 -1
  79. package/lib/module/createNavigatorFactory.js +1 -1
  80. package/lib/module/createNavigatorFactory.js.map +1 -1
  81. package/lib/module/fromEntries.js +3 -1
  82. package/lib/module/fromEntries.js.map +1 -1
  83. package/lib/module/getActionFromState.js +2 -1
  84. package/lib/module/getActionFromState.js.map +1 -1
  85. package/lib/module/getPathFromState.js +13 -3
  86. package/lib/module/getPathFromState.js.map +1 -1
  87. package/lib/module/getStateFromPath.js +12 -2
  88. package/lib/module/getStateFromPath.js.map +1 -1
  89. package/lib/module/isArrayEqual.js +9 -1
  90. package/lib/module/isArrayEqual.js.map +1 -1
  91. package/lib/module/isRecordEqual.js +18 -0
  92. package/lib/module/isRecordEqual.js.map +1 -0
  93. package/lib/module/types.js.map +1 -1
  94. package/lib/module/useChildListeners.js.map +1 -1
  95. package/lib/module/useCurrentRender.js +6 -5
  96. package/lib/module/useCurrentRender.js.map +1 -1
  97. package/lib/module/useDescriptors.js +18 -17
  98. package/lib/module/useDescriptors.js.map +1 -1
  99. package/lib/module/useEventEmitter.js +7 -6
  100. package/lib/module/useEventEmitter.js.map +1 -1
  101. package/lib/module/useFocusEvents.js +5 -4
  102. package/lib/module/useFocusEvents.js.map +1 -1
  103. package/lib/module/useFocusedListenersChildrenAdapter.js +5 -4
  104. package/lib/module/useFocusedListenersChildrenAdapter.js.map +1 -1
  105. package/lib/module/useKeyedChildListeners.js.map +1 -1
  106. package/lib/module/useNavigationBuilder.js +50 -20
  107. package/lib/module/useNavigationBuilder.js.map +1 -1
  108. package/lib/module/useNavigationCache.js +17 -10
  109. package/lib/module/useNavigationCache.js.map +1 -1
  110. package/lib/module/useNavigationHelpers.js +10 -7
  111. package/lib/module/useNavigationHelpers.js.map +1 -1
  112. package/lib/module/useOnAction.js +13 -11
  113. package/lib/module/useOnAction.js.map +1 -1
  114. package/lib/module/useOnGetState.js +5 -4
  115. package/lib/module/useOnGetState.js.map +1 -1
  116. package/lib/module/useOnPreventRemove.js +6 -5
  117. package/lib/module/useOnPreventRemove.js.map +1 -1
  118. package/lib/module/useOnRouteFocus.js +7 -6
  119. package/lib/module/useOnRouteFocus.js.map +1 -1
  120. package/lib/module/useOptionsGetters.js +6 -5
  121. package/lib/module/useOptionsGetters.js.map +1 -1
  122. package/lib/module/useRegisterNavigator.js +1 -1
  123. package/lib/module/useRegisterNavigator.js.map +1 -1
  124. package/lib/module/validatePathConfig.js +5 -2
  125. package/lib/module/validatePathConfig.js.map +1 -1
  126. package/lib/typescript/src/isRecordEqual.d.ts +4 -0
  127. package/lib/typescript/src/types.d.ts +11 -0
  128. package/lib/typescript/src/useDescriptors.d.ts +5 -4
  129. package/package.json +5 -5
  130. package/src/BaseNavigationContainer.tsx +4 -3
  131. package/src/CurrentRenderContext.tsx +3 -2
  132. package/src/EnsureSingleNavigator.tsx +7 -8
  133. package/src/NavigationContainerRefContext.tsx +3 -4
  134. package/src/NavigationContext.tsx +3 -2
  135. package/src/NavigationHelpersContext.tsx +3 -2
  136. package/src/NavigationRouteContext.tsx +3 -2
  137. package/src/UnhandledActionContext.tsx +3 -4
  138. package/src/createNavigationContainerRef.tsx +63 -12
  139. package/src/createNavigatorFactory.tsx +1 -1
  140. package/src/isArrayEqual.tsx +9 -1
  141. package/src/isRecordEqual.tsx +20 -0
  142. package/src/types.tsx +19 -6
  143. package/src/useChildListeners.tsx +3 -5
  144. package/src/useDescriptors.tsx +8 -7
  145. package/src/useKeyedChildListeners.tsx +6 -8
  146. package/src/useNavigationBuilder.tsx +89 -27
  147. package/src/useRegisterNavigator.tsx +1 -1
@@ -33,21 +33,22 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
33
33
  * - Options specified by the screen for the navigator
34
34
  * - Navigation object intended for the route
35
35
  */
36
- function useDescriptors({
37
- state,
38
- screens,
39
- navigation,
40
- screenOptions,
41
- defaultScreenOptions,
42
- onAction,
43
- getState,
44
- setState,
45
- addListener,
46
- addKeyedListener,
47
- onRouteFocus,
48
- router,
49
- emitter
50
- }) {
36
+ function useDescriptors(_ref) {
37
+ let {
38
+ state,
39
+ screens,
40
+ navigation,
41
+ screenOptions,
42
+ defaultScreenOptions,
43
+ onAction,
44
+ getState,
45
+ setState,
46
+ addListener,
47
+ addKeyedListener,
48
+ onRouteFocus,
49
+ router,
50
+ emitter
51
+ } = _ref;
51
52
  const [options, setOptions] = React.useState({});
52
53
  const {
53
54
  onDispatchAction,
@@ -75,11 +76,11 @@ function useDescriptors({
75
76
  const routes = (0, _useRouteCache.default)(state.routes);
76
77
  return routes.reduce((acc, route, i) => {
77
78
  const config = screens[route.name];
78
- const screen = config[1];
79
+ const screen = config.props;
79
80
  const navigation = navigations[route.key];
80
81
  const optionsList = [// The default `screenOptions` passed to the navigator
81
82
  screenOptions, // The `screenOptions` props passed to `Group` elements
82
- ...(config[0] ? config[0].filter(Boolean) : []), // The `options` prop passed to `Screen` elements,
83
+ ...(config.options ? config.options.filter(Boolean) : []), // The `options` prop passed to `Screen` elements,
83
84
  screen.options, // The options set via `navigation.setOptions`
84
85
  options[route.key]];
85
86
  const customOptions = optionsList.reduce((acc, curr) => Object.assign(acc, typeof curr !== 'function' ? curr : curr({
@@ -1 +1 @@
1
- {"version":3,"sources":["useDescriptors.tsx"],"names":["useDescriptors","state","screens","navigation","screenOptions","defaultScreenOptions","onAction","getState","setState","addListener","addKeyedListener","onRouteFocus","router","emitter","options","setOptions","React","useState","onDispatchAction","onOptionsChange","stackRef","useContext","NavigationBuilderContext","context","useMemo","navigations","routes","reduce","acc","route","i","config","name","screen","key","optionsList","filter","Boolean","customOptions","curr","Object","assign","mergedOptions","clearOptions","o","_","rest","render"],"mappings":"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","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n ParamListBase,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n AddKeyedListener,\n AddListener,\n} from './NavigationBuilderContext';\nimport NavigationContext from './NavigationContext';\nimport NavigationRouteContext from './NavigationRouteContext';\nimport SceneView from './SceneView';\nimport type {\n Descriptor,\n EventMapBase,\n NavigationHelpers,\n NavigationProp,\n RouteConfig,\n RouteProp,\n} from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\nimport useNavigationCache from './useNavigationCache';\nimport useRouteCache from './useRouteCache';\n\nexport type ScreenConfigWithParent<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = [\n (ScreenOptionsOrCallback<ScreenOptions> | undefined)[] | undefined,\n RouteConfig<ParamListBase, string, State, ScreenOptions, EventMap>\n];\n\ntype ScreenOptionsOrCallback<ScreenOptions extends {}> =\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamListBase, string>;\n navigation: any;\n }) => ScreenOptions);\n\ntype Options<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = {\n state: State;\n screens: Record<\n string,\n ScreenConfigWithParent<State, ScreenOptions, EventMap>\n >;\n navigation: NavigationHelpers<ParamListBase>;\n screenOptions?: ScreenOptionsOrCallback<ScreenOptions>;\n defaultScreenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamListBase>;\n navigation: any;\n options: ScreenOptions;\n }) => ScreenOptions);\n onAction: (action: NavigationAction) => boolean;\n getState: () => State;\n setState: (state: State) => void;\n addListener: AddListener;\n addKeyedListener: AddKeyedListener;\n onRouteFocus: (key: string) => void;\n router: Router<State, NavigationAction>;\n emitter: NavigationEventEmitter<EventMap>;\n};\n\n/**\n * Hook to create descriptor objects for the child routes.\n *\n * A descriptor object provides 3 things:\n * - Helper method to render a screen\n * - Options specified by the screen for the navigator\n * - Navigation object intended for the route\n */\nexport default function useDescriptors<\n State extends NavigationState,\n ActionHelpers extends Record<string, () => void>,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n>({\n state,\n screens,\n navigation,\n screenOptions,\n defaultScreenOptions,\n onAction,\n getState,\n setState,\n addListener,\n addKeyedListener,\n onRouteFocus,\n router,\n emitter,\n}: Options<State, ScreenOptions, EventMap>) {\n const [options, setOptions] = React.useState<Record<string, object>>({});\n const { onDispatchAction, onOptionsChange, stackRef } = React.useContext(\n NavigationBuilderContext\n );\n\n const context = React.useMemo(\n () => ({\n navigation,\n onAction,\n addListener,\n addKeyedListener,\n onRouteFocus,\n onDispatchAction,\n onOptionsChange,\n stackRef,\n }),\n [\n navigation,\n onAction,\n addListener,\n addKeyedListener,\n onRouteFocus,\n onDispatchAction,\n onOptionsChange,\n stackRef,\n ]\n );\n\n const navigations = useNavigationCache<State, ScreenOptions, EventMap>({\n state,\n getState,\n navigation,\n setOptions,\n router,\n emitter,\n });\n\n const routes = useRouteCache(state.routes);\n\n return routes.reduce<\n Record<\n string,\n Descriptor<\n ScreenOptions,\n NavigationProp<ParamListBase, string, State, ScreenOptions, EventMap> &\n ActionHelpers,\n RouteProp<ParamListBase>\n >\n >\n >((acc, route, i) => {\n const config = screens[route.name];\n const screen = config[1];\n const navigation = navigations[route.key];\n\n const optionsList = [\n // The default `screenOptions` passed to the navigator\n screenOptions,\n // The `screenOptions` props passed to `Group` elements\n ...((config[0]\n ? config[0].filter(Boolean)\n : []) as ScreenOptionsOrCallback<ScreenOptions>[]),\n // The `options` prop passed to `Screen` elements,\n screen.options,\n // The options set via `navigation.setOptions`\n options[route.key],\n ];\n\n const customOptions = optionsList.reduce<ScreenOptions>(\n (acc, curr) =>\n Object.assign(\n acc,\n typeof curr !== 'function' ? curr : curr({ route, navigation })\n ),\n {} as ScreenOptions\n );\n\n const mergedOptions = {\n ...(typeof defaultScreenOptions === 'function'\n ? // @ts-expect-error: ts gives incorrect error here\n defaultScreenOptions({\n route,\n navigation,\n options: customOptions,\n })\n : defaultScreenOptions),\n ...customOptions,\n };\n\n const clearOptions = () =>\n setOptions((o) => {\n if (route.key in o) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [route.key]: _, ...rest } = o;\n return rest;\n }\n\n return o;\n });\n\n acc[route.key] = {\n route,\n // @ts-expect-error: it's missing action helpers, fix later\n navigation,\n render() {\n return (\n <NavigationBuilderContext.Provider key={route.key} value={context}>\n <NavigationContext.Provider value={navigation}>\n <NavigationRouteContext.Provider value={route}>\n <SceneView\n navigation={navigation}\n route={route}\n screen={screen}\n routeState={state.routes[i].state}\n getState={getState}\n setState={setState}\n options={mergedOptions}\n clearOptions={clearOptions}\n />\n </NavigationRouteContext.Provider>\n </NavigationContext.Provider>\n </NavigationBuilderContext.Provider>\n );\n },\n options: mergedOptions as ScreenOptions,\n };\n\n return acc;\n }, {});\n}\n"]}
1
+ {"version":3,"sources":["useDescriptors.tsx"],"names":["useDescriptors","state","screens","navigation","screenOptions","defaultScreenOptions","onAction","getState","setState","addListener","addKeyedListener","onRouteFocus","router","emitter","options","setOptions","React","useState","onDispatchAction","onOptionsChange","stackRef","useContext","NavigationBuilderContext","context","useMemo","navigations","routes","reduce","acc","route","i","config","name","screen","props","key","optionsList","filter","Boolean","customOptions","curr","Object","assign","mergedOptions","clearOptions","o","_","rest","render"],"mappings":"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","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n ParamListBase,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n AddKeyedListener,\n AddListener,\n} from './NavigationBuilderContext';\nimport NavigationContext from './NavigationContext';\nimport NavigationRouteContext from './NavigationRouteContext';\nimport SceneView from './SceneView';\nimport type {\n Descriptor,\n EventMapBase,\n NavigationHelpers,\n NavigationProp,\n RouteConfig,\n RouteProp,\n} from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\nimport useNavigationCache from './useNavigationCache';\nimport useRouteCache from './useRouteCache';\n\nexport type ScreenConfigWithParent<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = {\n keys: (string | undefined)[];\n options: (ScreenOptionsOrCallback<ScreenOptions> | undefined)[] | undefined;\n props: RouteConfig<ParamListBase, string, State, ScreenOptions, EventMap>;\n};\n\ntype ScreenOptionsOrCallback<ScreenOptions extends {}> =\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamListBase, string>;\n navigation: any;\n }) => ScreenOptions);\n\ntype Options<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = {\n state: State;\n screens: Record<\n string,\n ScreenConfigWithParent<State, ScreenOptions, EventMap>\n >;\n navigation: NavigationHelpers<ParamListBase>;\n screenOptions?: ScreenOptionsOrCallback<ScreenOptions>;\n defaultScreenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamListBase>;\n navigation: any;\n options: ScreenOptions;\n }) => ScreenOptions);\n onAction: (action: NavigationAction) => boolean;\n getState: () => State;\n setState: (state: State) => void;\n addListener: AddListener;\n addKeyedListener: AddKeyedListener;\n onRouteFocus: (key: string) => void;\n router: Router<State, NavigationAction>;\n emitter: NavigationEventEmitter<EventMap>;\n};\n\n/**\n * Hook to create descriptor objects for the child routes.\n *\n * A descriptor object provides 3 things:\n * - Helper method to render a screen\n * - Options specified by the screen for the navigator\n * - Navigation object intended for the route\n */\nexport default function useDescriptors<\n State extends NavigationState,\n ActionHelpers extends Record<string, () => void>,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n>({\n state,\n screens,\n navigation,\n screenOptions,\n defaultScreenOptions,\n onAction,\n getState,\n setState,\n addListener,\n addKeyedListener,\n onRouteFocus,\n router,\n emitter,\n}: Options<State, ScreenOptions, EventMap>) {\n const [options, setOptions] = React.useState<Record<string, object>>({});\n const { onDispatchAction, onOptionsChange, stackRef } = React.useContext(\n NavigationBuilderContext\n );\n\n const context = React.useMemo(\n () => ({\n navigation,\n onAction,\n addListener,\n addKeyedListener,\n onRouteFocus,\n onDispatchAction,\n onOptionsChange,\n stackRef,\n }),\n [\n navigation,\n onAction,\n addListener,\n addKeyedListener,\n onRouteFocus,\n onDispatchAction,\n onOptionsChange,\n stackRef,\n ]\n );\n\n const navigations = useNavigationCache<State, ScreenOptions, EventMap>({\n state,\n getState,\n navigation,\n setOptions,\n router,\n emitter,\n });\n\n const routes = useRouteCache(state.routes);\n\n return routes.reduce<\n Record<\n string,\n Descriptor<\n ScreenOptions,\n NavigationProp<ParamListBase, string, State, ScreenOptions, EventMap> &\n ActionHelpers,\n RouteProp<ParamListBase>\n >\n >\n >((acc, route, i) => {\n const config = screens[route.name];\n const screen = config.props;\n const navigation = navigations[route.key];\n\n const optionsList = [\n // The default `screenOptions` passed to the navigator\n screenOptions,\n // The `screenOptions` props passed to `Group` elements\n ...((config.options\n ? config.options.filter(Boolean)\n : []) as ScreenOptionsOrCallback<ScreenOptions>[]),\n // The `options` prop passed to `Screen` elements,\n screen.options,\n // The options set via `navigation.setOptions`\n options[route.key],\n ];\n\n const customOptions = optionsList.reduce<ScreenOptions>(\n (acc, curr) =>\n Object.assign(\n acc,\n typeof curr !== 'function' ? curr : curr({ route, navigation })\n ),\n {} as ScreenOptions\n );\n\n const mergedOptions = {\n ...(typeof defaultScreenOptions === 'function'\n ? // @ts-expect-error: ts gives incorrect error here\n defaultScreenOptions({\n route,\n navigation,\n options: customOptions,\n })\n : defaultScreenOptions),\n ...customOptions,\n };\n\n const clearOptions = () =>\n setOptions((o) => {\n if (route.key in o) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [route.key]: _, ...rest } = o;\n return rest;\n }\n\n return o;\n });\n\n acc[route.key] = {\n route,\n // @ts-expect-error: it's missing action helpers, fix later\n navigation,\n render() {\n return (\n <NavigationBuilderContext.Provider key={route.key} value={context}>\n <NavigationContext.Provider value={navigation}>\n <NavigationRouteContext.Provider value={route}>\n <SceneView\n navigation={navigation}\n route={route}\n screen={screen}\n routeState={state.routes[i].state}\n getState={getState}\n setState={setState}\n options={mergedOptions}\n clearOptions={clearOptions}\n />\n </NavigationRouteContext.Provider>\n </NavigationContext.Provider>\n </NavigationBuilderContext.Provider>\n );\n },\n options: mergedOptions as ScreenOptions,\n };\n\n return acc;\n }, {});\n}\n"]}
@@ -44,14 +44,15 @@ function useEventEmitter(listen) {
44
44
  removeListener
45
45
  };
46
46
  }, []);
47
- const emit = React.useCallback(({
48
- type,
49
- data,
50
- target,
51
- canPreventDefault
52
- }) => {
47
+ const emit = React.useCallback(_ref => {
53
48
  var _items$target, _listenRef$current;
54
49
 
50
+ let {
51
+ type,
52
+ data,
53
+ target,
54
+ canPreventDefault
55
+ } = _ref;
55
56
  const items = listeners.current[type] || {}; // Copy the current list of callbacks in case they are mutated during execution
56
57
 
57
58
  const callbacks = target !== undefined ? (_items$target = items[target]) === null || _items$target === void 0 ? void 0 : _items$target.slice() : [].concat(...Object.keys(items).map(t => items[t])).filter((cb, i, self) => self.lastIndexOf(cb) === i);
@@ -1 +1 @@
1
- {"version":3,"sources":["useEventEmitter.tsx"],"names":["useEventEmitter","listen","listenRef","React","useRef","useEffect","current","listeners","create","useCallback","target","removeListener","type","callback","callbacks","undefined","index","indexOf","splice","addListener","push","emit","data","canPreventDefault","items","slice","concat","Object","keys","map","t","filter","cb","i","self","lastIndexOf","event","defineProperty","enumerable","get","defaultPrevented","defineProperties","preventDefault","value","forEach","useMemo"],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport type { EventArg, EventConsumer, EventEmitter } from './types';\n\nexport type NavigationEventEmitter<T extends Record<string, any>> =\n EventEmitter<T> & {\n create: (target: string) => EventConsumer<T>;\n };\n\ntype Listeners = ((e: any) => void)[];\n\n/**\n * Hook to manage the event system used by the navigator to notify screens of various events.\n */\nexport default function useEventEmitter<T extends Record<string, any>>(\n listen?: (e: any) => void\n): NavigationEventEmitter<T> {\n const listenRef = React.useRef(listen);\n\n React.useEffect(() => {\n listenRef.current = listen;\n });\n\n const listeners = React.useRef<Record<string, Record<string, Listeners>>>({});\n\n const create = React.useCallback((target: string) => {\n const removeListener = (type: string, callback: (data: any) => void) => {\n const callbacks = listeners.current[type]\n ? listeners.current[type][target]\n : undefined;\n\n if (!callbacks) {\n return;\n }\n\n const index = callbacks.indexOf(callback);\n\n callbacks.splice(index, 1);\n };\n\n const addListener = (type: string, callback: (data: any) => void) => {\n listeners.current[type] = listeners.current[type] || {};\n listeners.current[type][target] = listeners.current[type][target] || [];\n listeners.current[type][target].push(callback);\n\n return () => removeListener(type, callback);\n };\n\n return {\n addListener,\n removeListener,\n };\n }, []);\n\n const emit = React.useCallback(\n ({\n type,\n data,\n target,\n canPreventDefault,\n }: {\n type: string;\n data?: any;\n target?: string;\n canPreventDefault?: boolean;\n }) => {\n const items = listeners.current[type] || {};\n\n // Copy the current list of callbacks in case they are mutated during execution\n const callbacks =\n target !== undefined\n ? items[target]?.slice()\n : ([] as Listeners)\n .concat(...Object.keys(items).map((t) => items[t]))\n .filter((cb, i, self) => self.lastIndexOf(cb) === i);\n\n const event: EventArg<any, any, any> = {\n get type() {\n return type;\n },\n };\n\n if (target !== undefined) {\n Object.defineProperty(event, 'target', {\n enumerable: true,\n get() {\n return target;\n },\n });\n }\n\n if (data !== undefined) {\n Object.defineProperty(event, 'data', {\n enumerable: true,\n get() {\n return data;\n },\n });\n }\n\n if (canPreventDefault) {\n let defaultPrevented = false;\n\n Object.defineProperties(event, {\n defaultPrevented: {\n enumerable: true,\n get() {\n return defaultPrevented;\n },\n },\n preventDefault: {\n enumerable: true,\n value() {\n defaultPrevented = true;\n },\n },\n });\n }\n\n listenRef.current?.(event);\n\n callbacks?.forEach((cb) => cb(event));\n\n return event as any;\n },\n []\n );\n\n return React.useMemo(() => ({ create, emit }), [create, emit]);\n}\n"]}
1
+ {"version":3,"sources":["useEventEmitter.tsx"],"names":["useEventEmitter","listen","listenRef","React","useRef","useEffect","current","listeners","create","useCallback","target","removeListener","type","callback","callbacks","undefined","index","indexOf","splice","addListener","push","emit","data","canPreventDefault","items","slice","concat","Object","keys","map","t","filter","cb","i","self","lastIndexOf","event","defineProperty","enumerable","get","defaultPrevented","defineProperties","preventDefault","value","forEach","useMemo"],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport type { EventArg, EventConsumer, EventEmitter } from './types';\n\nexport type NavigationEventEmitter<T extends Record<string, any>> =\n EventEmitter<T> & {\n create: (target: string) => EventConsumer<T>;\n };\n\ntype Listeners = ((e: any) => void)[];\n\n/**\n * Hook to manage the event system used by the navigator to notify screens of various events.\n */\nexport default function useEventEmitter<T extends Record<string, any>>(\n listen?: (e: any) => void\n): NavigationEventEmitter<T> {\n const listenRef = React.useRef(listen);\n\n React.useEffect(() => {\n listenRef.current = listen;\n });\n\n const listeners = React.useRef<Record<string, Record<string, Listeners>>>({});\n\n const create = React.useCallback((target: string) => {\n const removeListener = (type: string, callback: (data: any) => void) => {\n const callbacks = listeners.current[type]\n ? listeners.current[type][target]\n : undefined;\n\n if (!callbacks) {\n return;\n }\n\n const index = callbacks.indexOf(callback);\n\n callbacks.splice(index, 1);\n };\n\n const addListener = (type: string, callback: (data: any) => void) => {\n listeners.current[type] = listeners.current[type] || {};\n listeners.current[type][target] = listeners.current[type][target] || [];\n listeners.current[type][target].push(callback);\n\n return () => removeListener(type, callback);\n };\n\n return {\n addListener,\n removeListener,\n };\n }, []);\n\n const emit = React.useCallback(\n ({\n type,\n data,\n target,\n canPreventDefault,\n }: {\n type: string;\n data?: any;\n target?: string;\n canPreventDefault?: boolean;\n }) => {\n const items = listeners.current[type] || {};\n\n // Copy the current list of callbacks in case they are mutated during execution\n const callbacks =\n target !== undefined\n ? items[target]?.slice()\n : ([] as Listeners)\n .concat(...Object.keys(items).map((t) => items[t]))\n .filter((cb, i, self) => self.lastIndexOf(cb) === i);\n\n const event: EventArg<any, any, any> = {\n get type() {\n return type;\n },\n };\n\n if (target !== undefined) {\n Object.defineProperty(event, 'target', {\n enumerable: true,\n get() {\n return target;\n },\n });\n }\n\n if (data !== undefined) {\n Object.defineProperty(event, 'data', {\n enumerable: true,\n get() {\n return data;\n },\n });\n }\n\n if (canPreventDefault) {\n let defaultPrevented = false;\n\n Object.defineProperties(event, {\n defaultPrevented: {\n enumerable: true,\n get() {\n return defaultPrevented;\n },\n },\n preventDefault: {\n enumerable: true,\n value() {\n defaultPrevented = true;\n },\n },\n });\n }\n\n listenRef.current?.(event);\n\n callbacks?.forEach((cb) => cb(event));\n\n return event as any;\n },\n []\n );\n\n return React.useMemo(() => ({ create, emit }), [create, emit]);\n}\n"]}
@@ -18,10 +18,11 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
18
18
  /**
19
19
  * Hook to take care of emitting `focus` and `blur` events.
20
20
  */
21
- function useFocusEvents({
22
- state,
23
- emitter
24
- }) {
21
+ function useFocusEvents(_ref) {
22
+ let {
23
+ state,
24
+ emitter
25
+ } = _ref;
25
26
  const navigation = React.useContext(_NavigationContext.default);
26
27
  const lastFocusedKeyRef = React.useRef();
27
28
  const currentFocusedKey = state.routes[state.index].key; // When the parent screen changes its focus state, we also need to change child's focus
@@ -1 +1 @@
1
- {"version":3,"sources":["useFocusEvents.tsx"],"names":["useFocusEvents","state","emitter","navigation","React","useContext","NavigationContext","lastFocusedKeyRef","useRef","currentFocusedKey","routes","index","key","useEffect","addListener","current","emit","type","target","undefined","lastFocusedKey","isFocused"],"mappings":";;;;;;;AACA;;AAEA;;;;;;;;AASA;AACA;AACA;AACe,SAASA,cAAT,CAAuD;AACpEC,EAAAA,KADoE;AAEpEC,EAAAA;AAFoE,CAAvD,EAGI;AACjB,QAAMC,UAAU,GAAGC,KAAK,CAACC,UAAN,CAAiBC,0BAAjB,CAAnB;AACA,QAAMC,iBAAiB,GAAGH,KAAK,CAACI,MAAN,EAA1B;AAEA,QAAMC,iBAAiB,GAAGR,KAAK,CAACS,MAAN,CAAaT,KAAK,CAACU,KAAnB,EAA0BC,GAApD,CAJiB,CAMjB;AACA;;AACAR,EAAAA,KAAK,CAACS,SAAN,CACE,MACEV,UADF,aACEA,UADF,uBACEA,UAAU,CAAEW,WAAZ,CAAwB,OAAxB,EAAiC,MAAM;AACrCP,IAAAA,iBAAiB,CAACQ,OAAlB,GAA4BN,iBAA5B;AACAP,IAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,MAAAA,IAAI,EAAE,OAAR;AAAiBC,MAAAA,MAAM,EAAET;AAAzB,KAAb;AACD,GAHD,CAFJ,EAME,CAACA,iBAAD,EAAoBP,OAApB,EAA6BC,UAA7B,CANF;AASAC,EAAAA,KAAK,CAACS,SAAN,CACE,MACEV,UADF,aACEA,UADF,uBACEA,UAAU,CAAEW,WAAZ,CAAwB,MAAxB,EAAgC,MAAM;AACpCP,IAAAA,iBAAiB,CAACQ,OAAlB,GAA4BI,SAA5B;AACAjB,IAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,MAAAA,IAAI,EAAE,MAAR;AAAgBC,MAAAA,MAAM,EAAET;AAAxB,KAAb;AACD,GAHD,CAFJ,EAME,CAACA,iBAAD,EAAoBP,OAApB,EAA6BC,UAA7B,CANF;AASAC,EAAAA,KAAK,CAACS,SAAN,CAAgB,MAAM;AACpB,UAAMO,cAAc,GAAGb,iBAAiB,CAACQ,OAAzC;AAEAR,IAAAA,iBAAiB,CAACQ,OAAlB,GAA4BN,iBAA5B,CAHoB,CAKpB;AACA;;AACA,QAAIW,cAAc,KAAKD,SAAnB,IAAgC,CAAChB,UAArC,EAAiD;AAC/CD,MAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,QAAAA,IAAI,EAAE,OAAR;AAAiBC,QAAAA,MAAM,EAAET;AAAzB,OAAb;AACD,KATmB,CAWpB;AACA;;;AACA,QACEW,cAAc,KAAKX,iBAAnB,IACA,EAAEN,UAAU,GAAGA,UAAU,CAACkB,SAAX,EAAH,GAA4B,IAAxC,CAFF,EAGE;AACA;AACD;;AAED,QAAID,cAAc,KAAKD,SAAvB,EAAkC;AAChC;AACA;AACD;;AAEDjB,IAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,MAAAA,IAAI,EAAE,MAAR;AAAgBC,MAAAA,MAAM,EAAEE;AAAxB,KAAb;AACAlB,IAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,MAAAA,IAAI,EAAE,OAAR;AAAiBC,MAAAA,MAAM,EAAET;AAAzB,KAAb;AACD,GA3BD,EA2BG,CAACA,iBAAD,EAAoBP,OAApB,EAA6BC,UAA7B,CA3BH;AA4BD","sourcesContent":["import type { NavigationState } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationContext from './NavigationContext';\nimport type { EventMapCore } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\ntype Options<State extends NavigationState> = {\n state: State;\n emitter: NavigationEventEmitter<EventMapCore<State>>;\n};\n\n/**\n * Hook to take care of emitting `focus` and `blur` events.\n */\nexport default function useFocusEvents<State extends NavigationState>({\n state,\n emitter,\n}: Options<State>) {\n const navigation = React.useContext(NavigationContext);\n const lastFocusedKeyRef = React.useRef<string | undefined>();\n\n const currentFocusedKey = state.routes[state.index].key;\n\n // When the parent screen changes its focus state, we also need to change child's focus\n // Coz the child screen can't be focused if the parent screen is out of focus\n React.useEffect(\n () =>\n navigation?.addListener('focus', () => {\n lastFocusedKeyRef.current = currentFocusedKey;\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }),\n [currentFocusedKey, emitter, navigation]\n );\n\n React.useEffect(\n () =>\n navigation?.addListener('blur', () => {\n lastFocusedKeyRef.current = undefined;\n emitter.emit({ type: 'blur', target: currentFocusedKey });\n }),\n [currentFocusedKey, emitter, navigation]\n );\n\n React.useEffect(() => {\n const lastFocusedKey = lastFocusedKeyRef.current;\n\n lastFocusedKeyRef.current = currentFocusedKey;\n\n // We wouldn't have `lastFocusedKey` on initial mount\n // Fire focus event for the current route on mount if there's no parent navigator\n if (lastFocusedKey === undefined && !navigation) {\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }\n\n // We should only emit events when the focused key changed and navigator is focused\n // When navigator is not focused, screens inside shouldn't receive focused status either\n if (\n lastFocusedKey === currentFocusedKey ||\n !(navigation ? navigation.isFocused() : true)\n ) {\n return;\n }\n\n if (lastFocusedKey === undefined) {\n // Only fire events after initial mount\n return;\n }\n\n emitter.emit({ type: 'blur', target: lastFocusedKey });\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }, [currentFocusedKey, emitter, navigation]);\n}\n"]}
1
+ {"version":3,"sources":["useFocusEvents.tsx"],"names":["useFocusEvents","state","emitter","navigation","React","useContext","NavigationContext","lastFocusedKeyRef","useRef","currentFocusedKey","routes","index","key","useEffect","addListener","current","emit","type","target","undefined","lastFocusedKey","isFocused"],"mappings":";;;;;;;AACA;;AAEA;;;;;;;;AASA;AACA;AACA;AACe,SAASA,cAAT,OAGI;AAAA,MAHmD;AACpEC,IAAAA,KADoE;AAEpEC,IAAAA;AAFoE,GAGnD;AACjB,QAAMC,UAAU,GAAGC,KAAK,CAACC,UAAN,CAAiBC,0BAAjB,CAAnB;AACA,QAAMC,iBAAiB,GAAGH,KAAK,CAACI,MAAN,EAA1B;AAEA,QAAMC,iBAAiB,GAAGR,KAAK,CAACS,MAAN,CAAaT,KAAK,CAACU,KAAnB,EAA0BC,GAApD,CAJiB,CAMjB;AACA;;AACAR,EAAAA,KAAK,CAACS,SAAN,CACE,MACEV,UADF,aACEA,UADF,uBACEA,UAAU,CAAEW,WAAZ,CAAwB,OAAxB,EAAiC,MAAM;AACrCP,IAAAA,iBAAiB,CAACQ,OAAlB,GAA4BN,iBAA5B;AACAP,IAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,MAAAA,IAAI,EAAE,OAAR;AAAiBC,MAAAA,MAAM,EAAET;AAAzB,KAAb;AACD,GAHD,CAFJ,EAME,CAACA,iBAAD,EAAoBP,OAApB,EAA6BC,UAA7B,CANF;AASAC,EAAAA,KAAK,CAACS,SAAN,CACE,MACEV,UADF,aACEA,UADF,uBACEA,UAAU,CAAEW,WAAZ,CAAwB,MAAxB,EAAgC,MAAM;AACpCP,IAAAA,iBAAiB,CAACQ,OAAlB,GAA4BI,SAA5B;AACAjB,IAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,MAAAA,IAAI,EAAE,MAAR;AAAgBC,MAAAA,MAAM,EAAET;AAAxB,KAAb;AACD,GAHD,CAFJ,EAME,CAACA,iBAAD,EAAoBP,OAApB,EAA6BC,UAA7B,CANF;AASAC,EAAAA,KAAK,CAACS,SAAN,CAAgB,MAAM;AACpB,UAAMO,cAAc,GAAGb,iBAAiB,CAACQ,OAAzC;AAEAR,IAAAA,iBAAiB,CAACQ,OAAlB,GAA4BN,iBAA5B,CAHoB,CAKpB;AACA;;AACA,QAAIW,cAAc,KAAKD,SAAnB,IAAgC,CAAChB,UAArC,EAAiD;AAC/CD,MAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,QAAAA,IAAI,EAAE,OAAR;AAAiBC,QAAAA,MAAM,EAAET;AAAzB,OAAb;AACD,KATmB,CAWpB;AACA;;;AACA,QACEW,cAAc,KAAKX,iBAAnB,IACA,EAAEN,UAAU,GAAGA,UAAU,CAACkB,SAAX,EAAH,GAA4B,IAAxC,CAFF,EAGE;AACA;AACD;;AAED,QAAID,cAAc,KAAKD,SAAvB,EAAkC;AAChC;AACA;AACD;;AAEDjB,IAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,MAAAA,IAAI,EAAE,MAAR;AAAgBC,MAAAA,MAAM,EAAEE;AAAxB,KAAb;AACAlB,IAAAA,OAAO,CAACc,IAAR,CAAa;AAAEC,MAAAA,IAAI,EAAE,OAAR;AAAiBC,MAAAA,MAAM,EAAET;AAAzB,KAAb;AACD,GA3BD,EA2BG,CAACA,iBAAD,EAAoBP,OAApB,EAA6BC,UAA7B,CA3BH;AA4BD","sourcesContent":["import type { NavigationState } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationContext from './NavigationContext';\nimport type { EventMapCore } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\ntype Options<State extends NavigationState> = {\n state: State;\n emitter: NavigationEventEmitter<EventMapCore<State>>;\n};\n\n/**\n * Hook to take care of emitting `focus` and `blur` events.\n */\nexport default function useFocusEvents<State extends NavigationState>({\n state,\n emitter,\n}: Options<State>) {\n const navigation = React.useContext(NavigationContext);\n const lastFocusedKeyRef = React.useRef<string | undefined>();\n\n const currentFocusedKey = state.routes[state.index].key;\n\n // When the parent screen changes its focus state, we also need to change child's focus\n // Coz the child screen can't be focused if the parent screen is out of focus\n React.useEffect(\n () =>\n navigation?.addListener('focus', () => {\n lastFocusedKeyRef.current = currentFocusedKey;\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }),\n [currentFocusedKey, emitter, navigation]\n );\n\n React.useEffect(\n () =>\n navigation?.addListener('blur', () => {\n lastFocusedKeyRef.current = undefined;\n emitter.emit({ type: 'blur', target: currentFocusedKey });\n }),\n [currentFocusedKey, emitter, navigation]\n );\n\n React.useEffect(() => {\n const lastFocusedKey = lastFocusedKeyRef.current;\n\n lastFocusedKeyRef.current = currentFocusedKey;\n\n // We wouldn't have `lastFocusedKey` on initial mount\n // Fire focus event for the current route on mount if there's no parent navigator\n if (lastFocusedKey === undefined && !navigation) {\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }\n\n // We should only emit events when the focused key changed and navigator is focused\n // When navigator is not focused, screens inside shouldn't receive focused status either\n if (\n lastFocusedKey === currentFocusedKey ||\n !(navigation ? navigation.isFocused() : true)\n ) {\n return;\n }\n\n if (lastFocusedKey === undefined) {\n // Only fire events after initial mount\n return;\n }\n\n emitter.emit({ type: 'blur', target: lastFocusedKey });\n emitter.emit({ type: 'focus', target: currentFocusedKey });\n }, [currentFocusedKey, emitter, navigation]);\n}\n"]}
@@ -18,10 +18,11 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
18
18
  /**
19
19
  * Hook for passing focus callback to children
20
20
  */
21
- function useFocusedListenersChildrenAdapter({
22
- navigation,
23
- focusedListeners
24
- }) {
21
+ function useFocusedListenersChildrenAdapter(_ref) {
22
+ let {
23
+ navigation,
24
+ focusedListeners
25
+ } = _ref;
25
26
  const {
26
27
  addListener
27
28
  } = React.useContext(_NavigationBuilderContext.default);
@@ -1 +1 @@
1
- {"version":3,"sources":["useFocusedListenersChildrenAdapter.tsx"],"names":["useFocusedListenersChildrenAdapter","navigation","focusedListeners","addListener","React","useContext","NavigationBuilderContext","listener","useCallback","callback","isFocused","handled","result","useEffect"],"mappings":";;;;;;;AACA;;AAEA;;;;;;;;AAWA;AACA;AACA;AACe,SAASA,kCAAT,CAA4C;AACzDC,EAAAA,UADyD;AAEzDC,EAAAA;AAFyD,CAA5C,EAGH;AACV,QAAM;AAAEC,IAAAA;AAAF,MAAkBC,KAAK,CAACC,UAAN,CAAiBC,iCAAjB,CAAxB;AAEA,QAAMC,QAAQ,GAAGH,KAAK,CAACI,WAAN,CACdC,QAAD,IAA8C;AAC5C,QAAIR,UAAU,CAACS,SAAX,EAAJ,EAA4B;AAC1B,WAAK,MAAMH,QAAX,IAAuBL,gBAAvB,EAAyC;AACvC,cAAM;AAAES,UAAAA,OAAF;AAAWC,UAAAA;AAAX,YAAsBL,QAAQ,CAACE,QAAD,CAApC;;AAEA,YAAIE,OAAJ,EAAa;AACX,iBAAO;AAAEA,YAAAA,OAAF;AAAWC,YAAAA;AAAX,WAAP;AACD;AACF;;AAED,aAAO;AAAED,QAAAA,OAAO,EAAE,IAAX;AAAiBC,QAAAA,MAAM,EAAEH,QAAQ,CAACR,UAAD;AAAjC,OAAP;AACD,KAVD,MAUO;AACL,aAAO;AAAEU,QAAAA,OAAO,EAAE,KAAX;AAAkBC,QAAAA,MAAM,EAAE;AAA1B,OAAP;AACD;AACF,GAfc,EAgBf,CAACV,gBAAD,EAAmBD,UAAnB,CAhBe,CAAjB;AAmBAG,EAAAA,KAAK,CAACS,SAAN,CACE,MAAMV,WAAN,aAAMA,WAAN,uBAAMA,WAAW,CAAG,OAAH,EAAYI,QAAZ,CADnB,EAEE,CAACJ,WAAD,EAAcI,QAAd,CAFF;AAID","sourcesContent":["import type { ParamListBase } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n FocusedNavigationCallback,\n FocusedNavigationListener,\n} from './NavigationBuilderContext';\nimport type { NavigationHelpers } from './types';\n\ntype Options = {\n navigation: NavigationHelpers<ParamListBase>;\n focusedListeners: FocusedNavigationListener[];\n};\n\n/**\n * Hook for passing focus callback to children\n */\nexport default function useFocusedListenersChildrenAdapter({\n navigation,\n focusedListeners,\n}: Options) {\n const { addListener } = React.useContext(NavigationBuilderContext);\n\n const listener = React.useCallback(\n (callback: FocusedNavigationCallback<any>) => {\n if (navigation.isFocused()) {\n for (const listener of focusedListeners) {\n const { handled, result } = listener(callback);\n\n if (handled) {\n return { handled, result };\n }\n }\n\n return { handled: true, result: callback(navigation) };\n } else {\n return { handled: false, result: null };\n }\n },\n [focusedListeners, navigation]\n );\n\n React.useEffect(\n () => addListener?.('focus', listener),\n [addListener, listener]\n );\n}\n"]}
1
+ {"version":3,"sources":["useFocusedListenersChildrenAdapter.tsx"],"names":["useFocusedListenersChildrenAdapter","navigation","focusedListeners","addListener","React","useContext","NavigationBuilderContext","listener","useCallback","callback","isFocused","handled","result","useEffect"],"mappings":";;;;;;;AACA;;AAEA;;;;;;;;AAWA;AACA;AACA;AACe,SAASA,kCAAT,OAGH;AAAA,MAH+C;AACzDC,IAAAA,UADyD;AAEzDC,IAAAA;AAFyD,GAG/C;AACV,QAAM;AAAEC,IAAAA;AAAF,MAAkBC,KAAK,CAACC,UAAN,CAAiBC,iCAAjB,CAAxB;AAEA,QAAMC,QAAQ,GAAGH,KAAK,CAACI,WAAN,CACdC,QAAD,IAA8C;AAC5C,QAAIR,UAAU,CAACS,SAAX,EAAJ,EAA4B;AAC1B,WAAK,MAAMH,QAAX,IAAuBL,gBAAvB,EAAyC;AACvC,cAAM;AAAES,UAAAA,OAAF;AAAWC,UAAAA;AAAX,YAAsBL,QAAQ,CAACE,QAAD,CAApC;;AAEA,YAAIE,OAAJ,EAAa;AACX,iBAAO;AAAEA,YAAAA,OAAF;AAAWC,YAAAA;AAAX,WAAP;AACD;AACF;;AAED,aAAO;AAAED,QAAAA,OAAO,EAAE,IAAX;AAAiBC,QAAAA,MAAM,EAAEH,QAAQ,CAACR,UAAD;AAAjC,OAAP;AACD,KAVD,MAUO;AACL,aAAO;AAAEU,QAAAA,OAAO,EAAE,KAAX;AAAkBC,QAAAA,MAAM,EAAE;AAA1B,OAAP;AACD;AACF,GAfc,EAgBf,CAACV,gBAAD,EAAmBD,UAAnB,CAhBe,CAAjB;AAmBAG,EAAAA,KAAK,CAACS,SAAN,CACE,MAAMV,WAAN,aAAMA,WAAN,uBAAMA,WAAW,CAAG,OAAH,EAAYI,QAAZ,CADnB,EAEE,CAACJ,WAAD,EAAcI,QAAd,CAFF;AAID","sourcesContent":["import type { ParamListBase } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n FocusedNavigationCallback,\n FocusedNavigationListener,\n} from './NavigationBuilderContext';\nimport type { NavigationHelpers } from './types';\n\ntype Options = {\n navigation: NavigationHelpers<ParamListBase>;\n focusedListeners: FocusedNavigationListener[];\n};\n\n/**\n * Hook for passing focus callback to children\n */\nexport default function useFocusedListenersChildrenAdapter({\n navigation,\n focusedListeners,\n}: Options) {\n const { addListener } = React.useContext(NavigationBuilderContext);\n\n const listener = React.useCallback(\n (callback: FocusedNavigationCallback<any>) => {\n if (navigation.isFocused()) {\n for (const listener of focusedListeners) {\n const { handled, result } = listener(callback);\n\n if (handled) {\n return { handled, result };\n }\n }\n\n return { handled: true, result: callback(navigation) };\n } else {\n return { handled: false, result: null };\n }\n },\n [focusedListeners, navigation]\n );\n\n React.useEffect(\n () => addListener?.('focus', listener),\n [addListener, listener]\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["useKeyedChildListeners.tsx"],"names":["useKeyedChildListeners","current","keyedListeners","React","useRef","getState","beforeRemove","addKeyedListener","useCallback","type","key","listener","undefined"],"mappings":";;;;;;;AAAA;;;;;;AAIA;AACA;AACA;AACe,SAASA,sBAAT,GAAkC;AAC/C,QAAM;AAAEC,IAAAA,OAAO,EAAEC;AAAX,MAA8BC,KAAK,CAACC,MAAN,CAOlC;AACAC,IAAAA,QAAQ,EAAE,EADV;AAEAC,IAAAA,YAAY,EAAE;AAFd,GAPkC,CAApC;AAYA,QAAMC,gBAAgB,GAAGJ,KAAK,CAACK,WAAN,CACvB,CACEC,IADF,EAEEC,GAFF,EAGEC,QAHF,KAIK;AACHT,IAAAA,cAAc,CAACO,IAAD,CAAd,CAAqBC,GAArB,IAA4BC,QAA5B;AAEA,WAAO,MAAM;AACXT,MAAAA,cAAc,CAACO,IAAD,CAAd,CAAqBC,GAArB,IAA4BE,SAA5B;AACD,KAFD;AAGD,GAXsB,EAYvB,CAACV,cAAD,CAZuB,CAAzB;AAeA,SAAO;AACLA,IAAAA,cADK;AAELK,IAAAA;AAFK,GAAP;AAID","sourcesContent":["import * as React from 'react';\n\nimport type { KeyedListenerMap } from './NavigationBuilderContext';\n\n/**\n * Hook which lets child navigators add getters to be called for obtaining rehydrated state.\n */\nexport default function useKeyedChildListeners() {\n const { current: keyedListeners } = React.useRef<\n {\n [K in keyof KeyedListenerMap]: Record<\n string,\n KeyedListenerMap[K] | undefined\n >;\n }\n >({\n getState: {},\n beforeRemove: {},\n });\n\n const addKeyedListener = React.useCallback(\n <T extends keyof KeyedListenerMap>(\n type: T,\n key: string,\n listener: KeyedListenerMap[T]\n ) => {\n keyedListeners[type][key] = listener;\n\n return () => {\n keyedListeners[type][key] = undefined;\n };\n },\n [keyedListeners]\n );\n\n return {\n keyedListeners,\n addKeyedListener,\n };\n}\n"]}
1
+ {"version":3,"sources":["useKeyedChildListeners.tsx"],"names":["useKeyedChildListeners","current","keyedListeners","React","useRef","getState","beforeRemove","addKeyedListener","useCallback","type","key","listener","undefined"],"mappings":";;;;;;;AAAA;;;;;;AAIA;AACA;AACA;AACe,SAASA,sBAAT,GAAkC;AAC/C,QAAM;AAAEC,IAAAA,OAAO,EAAEC;AAAX,MAA8BC,KAAK,CAACC,MAAN,CAKjC;AACDC,IAAAA,QAAQ,EAAE,EADT;AAEDC,IAAAA,YAAY,EAAE;AAFb,GALiC,CAApC;AAUA,QAAMC,gBAAgB,GAAGJ,KAAK,CAACK,WAAN,CACvB,CACEC,IADF,EAEEC,GAFF,EAGEC,QAHF,KAIK;AACHT,IAAAA,cAAc,CAACO,IAAD,CAAd,CAAqBC,GAArB,IAA4BC,QAA5B;AAEA,WAAO,MAAM;AACXT,MAAAA,cAAc,CAACO,IAAD,CAAd,CAAqBC,GAArB,IAA4BE,SAA5B;AACD,KAFD;AAGD,GAXsB,EAYvB,CAACV,cAAD,CAZuB,CAAzB;AAeA,SAAO;AACLA,IAAAA,cADK;AAELK,IAAAA;AAFK,GAAP;AAID","sourcesContent":["import * as React from 'react';\n\nimport type { KeyedListenerMap } from './NavigationBuilderContext';\n\n/**\n * Hook which lets child navigators add getters to be called for obtaining rehydrated state.\n */\nexport default function useKeyedChildListeners() {\n const { current: keyedListeners } = React.useRef<{\n [K in keyof KeyedListenerMap]: Record<\n string,\n KeyedListenerMap[K] | undefined\n >;\n }>({\n getState: {},\n beforeRemove: {},\n });\n\n const addKeyedListener = React.useCallback(\n <T extends keyof KeyedListenerMap>(\n type: T,\n key: string,\n listener: KeyedListenerMap[T]\n ) => {\n keyedListeners[type][key] = listener;\n\n return () => {\n keyedListeners[type][key] = undefined;\n };\n },\n [keyedListeners]\n );\n\n return {\n keyedListeners,\n addKeyedListener,\n };\n}\n"]}
@@ -15,6 +15,8 @@ var _Group = _interopRequireDefault(require("./Group"));
15
15
 
16
16
  var _isArrayEqual = _interopRequireDefault(require("./isArrayEqual"));
17
17
 
18
+ var _isRecordEqual = _interopRequireDefault(require("./isRecordEqual"));
19
+
18
20
  var _NavigationHelpersContext = _interopRequireDefault(require("./NavigationHelpersContext"));
19
21
 
20
22
  var _NavigationRouteContext = _interopRequireDefault(require("./NavigationRouteContext"));
@@ -63,12 +65,15 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
63
65
  // eslint-disable-next-line babel/no-unused-expressions
64
66
  _types.PrivateValueStore;
65
67
 
68
+ const isValidKey = key => key === undefined || typeof key === 'string' && key !== '';
66
69
  /**
67
70
  * Extract route config object from React children elements.
68
71
  *
69
72
  * @param children React Elements to extract the config from.
70
73
  */
71
- const getRouteConfigsFromChildren = (children, options) => {
74
+
75
+
76
+ const getRouteConfigsFromChildren = (children, groupKey, groupOptions) => {
72
77
  const configs = React.Children.toArray(children).reduce((acc, child) => {
73
78
  var _child$type, _child$props;
74
79
 
@@ -76,14 +81,26 @@ const getRouteConfigsFromChildren = (children, options) => {
76
81
  if (child.type === _Screen.default) {
77
82
  // We can only extract the config from `Screen` elements
78
83
  // If something else was rendered, it's probably a bug
79
- acc.push([options, child.props]);
84
+ if (!isValidKey(child.props.navigationKey)) {
85
+ throw new Error(`Got an invalid 'navigationKey' prop (${JSON.stringify(child.props.navigationKey)}) for the screen '${child.props.name}'. It must be a non-empty string or 'undefined'.`);
86
+ }
87
+
88
+ acc.push({
89
+ keys: [groupKey, child.props.navigationKey],
90
+ options: groupOptions,
91
+ props: child.props
92
+ });
80
93
  return acc;
81
94
  }
82
95
 
83
96
  if (child.type === React.Fragment || child.type === _Group.default) {
84
- // When we encounter a fragment or group, we need to dive into its children to extract the configs
97
+ if (!isValidKey(child.props.navigationKey)) {
98
+ throw new Error(`Got an invalid 'navigationKey' prop (${JSON.stringify(child.props.navigationKey)}) for the group. It must be a non-empty string or 'undefined'.`);
99
+ } // When we encounter a fragment or group, we need to dive into its children to extract the configs
85
100
  // This is handy to conditionally define a group of screens
86
- acc.push(...getRouteConfigsFromChildren(child.props.children, child.type !== _Group.default ? options : options != null ? [...options, child.props.screenOptions] : [child.props.screenOptions]));
101
+
102
+
103
+ acc.push(...getRouteConfigsFromChildren(child.props.children, child.props.navigationKey, child.type !== _Group.default ? groupOptions : groupOptions != null ? [...groupOptions, child.props.screenOptions] : [child.props.screenOptions]));
87
104
  return acc;
88
105
  }
89
106
  }
@@ -98,7 +115,7 @@ const getRouteConfigsFromChildren = (children, options) => {
98
115
  children,
99
116
  component,
100
117
  getComponent
101
- } = config[1];
118
+ } = config.props;
102
119
 
103
120
  if (typeof name !== 'string' || !name) {
104
121
  throw new Error(`Got an invalid name (${JSON.stringify(name)}) for the screen. It must be a non-empty string.`);
@@ -129,11 +146,15 @@ const getRouteConfigsFromChildren = (children, options) => {
129
146
  throw new Error(`Got an invalid value for 'getComponent' prop for the screen '${name}'. It must be a function returning a React Component.`);
130
147
  }
131
148
 
132
- if (typeof component === 'function' && component.name === 'component') {
133
- // Inline anonymous functions passed in the `component` prop will have the name of the prop
134
- // It's relatively safe to assume that it's not a component since it should also have PascalCase name
135
- // We won't catch all scenarios here, but this should catch a good chunk of incorrect use.
136
- console.warn(`Looks like you're passing an inline function for 'component' prop for the screen '${name}' (e.g. component={() => <SomeComponent />}). Passing an inline function will cause the component state to be lost on re-render and cause perf issues since it's re-created every render. You can pass the function as children to 'Screen' instead to achieve the desired behaviour.`);
149
+ if (typeof component === 'function') {
150
+ if (component.name === 'component') {
151
+ // Inline anonymous functions passed in the `component` prop will have the name of the prop
152
+ // It's relatively safe to assume that it's not a component since it should also have PascalCase name
153
+ // We won't catch all scenarios here, but this should catch a good chunk of incorrect use.
154
+ console.warn(`Looks like you're passing an inline function for 'component' prop for the screen '${name}' (e.g. component={() => <SomeComponent />}). Passing an inline function will cause the component state to be lost on re-render and cause perf issues since it's re-created every render. You can pass the function as children to 'Screen' instead to achieve the desired behaviour.`);
155
+ } else if (/^[a-z]/.test(component.name)) {
156
+ console.warn(`Got a component with the name '${component.name}' for the screen '${name}'. React Components must start with an uppercase letter. If you're passing a regular function and not a component, pass it as children to 'Screen' instead. Otherwise capitalize your component's name.`);
157
+ }
137
158
  }
138
159
  } else {
139
160
  throw new Error(`Couldn't find a 'component', 'getComponent' or 'children' prop for the screen '${name}'. This can happen if you passed 'undefined'. You likely forgot to export your component from the file it's defined in, or mixed up default import and named import when importing.`);
@@ -169,23 +190,27 @@ function useNavigationBuilder(createRouter, options) {
169
190
  }));
170
191
  const routeConfigs = getRouteConfigsFromChildren(children);
171
192
  const screens = routeConfigs.reduce((acc, config) => {
172
- if (config[1].name in acc) {
173
- throw new Error(`A navigator cannot contain multiple 'Screen' components with the same name (found duplicate screen named '${config[1].name}')`);
193
+ if (config.props.name in acc) {
194
+ throw new Error(`A navigator cannot contain multiple 'Screen' components with the same name (found duplicate screen named '${config.props.name}')`);
174
195
  }
175
196
 
176
- acc[config[1].name] = config;
197
+ acc[config.props.name] = config;
198
+ return acc;
199
+ }, {});
200
+ const routeNames = routeConfigs.map(config => config.props.name);
201
+ const routeKeyList = routeNames.reduce((acc, curr) => {
202
+ acc[curr] = screens[curr].keys.map(key => key !== null && key !== void 0 ? key : '').join(':');
177
203
  return acc;
178
204
  }, {});
179
- const routeNames = routeConfigs.map(config => config[1].name);
180
205
  const routeParamList = routeNames.reduce((acc, curr) => {
181
206
  const {
182
207
  initialParams
183
- } = screens[curr][1];
208
+ } = screens[curr].props;
184
209
  acc[curr] = initialParams;
185
210
  return acc;
186
211
  }, {});
187
212
  const routeGetIdList = routeNames.reduce((acc, curr) => Object.assign(acc, {
188
- [curr]: screens[curr][1].getId
213
+ [curr]: screens[curr].props.getId
189
214
  }), {});
190
215
 
191
216
  if (!routeNames.length) {
@@ -225,7 +250,7 @@ function useNavigationBuilder(createRouter, options) {
225
250
 
226
251
  const {
227
252
  initialParams
228
- } = screens[curr][1];
253
+ } = screens[curr].props;
229
254
  const initialParamsFromParams = (route === null || route === void 0 ? void 0 : (_route$params = route.params) === null || _route$params === void 0 ? void 0 : _route$params.state) == null && (route === null || route === void 0 ? void 0 : (_route$params2 = route.params) === null || _route$params2 === void 0 ? void 0 : _route$params2.initial) !== false && (route === null || route === void 0 ? void 0 : (_route$params3 = route.params) === null || _route$params3 === void 0 ? void 0 : _route$params3.screen) === curr ? route.params.params : undefined;
230
255
  acc[curr] = initialParams !== undefined || initialParamsFromParams !== undefined ? { ...initialParams,
231
256
  ...initialParamsFromParams
@@ -258,18 +283,24 @@ function useNavigationBuilder(createRouter, options) {
258
283
  // eslint-disable-next-line react-hooks/exhaustive-deps
259
284
 
260
285
  }, [currentState, router, isStateValid]);
286
+ const previousRouteKeyListRef = React.useRef(routeKeyList);
287
+ React.useEffect(() => {
288
+ previousRouteKeyListRef.current = routeKeyList;
289
+ });
290
+ const previousRouteKeyList = previousRouteKeyListRef.current;
261
291
  let state = // If the state isn't initialized, or stale, use the state we initialized instead
262
292
  // The state won't update until there's a change needed in the state we have initalized locally
263
293
  // So it'll be `undefined` or stale until the first navigation event happens
264
294
  isStateInitialized(currentState) ? currentState : initializedState;
265
295
  let nextState = state;
266
296
 
267
- if (!(0, _isArrayEqual.default)(state.routeNames, routeNames)) {
297
+ if (!(0, _isArrayEqual.default)(state.routeNames, routeNames) || !(0, _isRecordEqual.default)(routeKeyList, previousRouteKeyList)) {
268
298
  // When the list of route names change, the router should handle it to remove invalid routes
269
299
  nextState = router.getStateForRouteNamesChange(state, {
270
300
  routeNames,
271
301
  routeParamList,
272
- routeGetIdList
302
+ routeGetIdList,
303
+ routeKeyChanges: Object.keys(routeKeyList).filter(name => previousRouteKeyList.hasOwnProperty(name) && routeKeyList[name] !== previousRouteKeyList[name])
273
304
  });
274
305
  }
275
306
 
@@ -379,7 +410,7 @@ function useNavigationBuilder(createRouter, options) {
379
410
  ...[screenListeners, ...routeNames.map(name => {
380
411
  const {
381
412
  listeners
382
- } = screens[name][1];
413
+ } = screens[name].props;
383
414
  return listeners;
384
415
  })].map(listeners => {
385
416
  const map = typeof listeners === 'function' ? listeners({