@react-navigation/core 6.1.0 → 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 (122) hide show
  1. package/lib/commonjs/BaseNavigationContainer.js +13 -9
  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 +11 -6
  14. package/lib/commonjs/createNavigationContainerRef.js.map +1 -1
  15. package/lib/commonjs/fromEntries.js +3 -1
  16. package/lib/commonjs/fromEntries.js.map +1 -1
  17. package/lib/commonjs/getActionFromState.js +2 -1
  18. package/lib/commonjs/getActionFromState.js.map +1 -1
  19. package/lib/commonjs/getPathFromState.js +13 -3
  20. package/lib/commonjs/getPathFromState.js.map +1 -1
  21. package/lib/commonjs/getStateFromPath.js +12 -2
  22. package/lib/commonjs/getStateFromPath.js.map +1 -1
  23. package/lib/commonjs/index.js +24 -24
  24. package/lib/commonjs/types.js.map +1 -1
  25. package/lib/commonjs/useChildListeners.js.map +1 -1
  26. package/lib/commonjs/useCurrentRender.js +6 -5
  27. package/lib/commonjs/useCurrentRender.js.map +1 -1
  28. package/lib/commonjs/useDescriptors.js +16 -15
  29. package/lib/commonjs/useDescriptors.js.map +1 -1
  30. package/lib/commonjs/useEventEmitter.js +7 -6
  31. package/lib/commonjs/useEventEmitter.js.map +1 -1
  32. package/lib/commonjs/useFocusEvents.js +5 -4
  33. package/lib/commonjs/useFocusEvents.js.map +1 -1
  34. package/lib/commonjs/useFocusedListenersChildrenAdapter.js +5 -4
  35. package/lib/commonjs/useFocusedListenersChildrenAdapter.js.map +1 -1
  36. package/lib/commonjs/useKeyedChildListeners.js.map +1 -1
  37. package/lib/commonjs/useNavigationBuilder.js +9 -5
  38. package/lib/commonjs/useNavigationBuilder.js.map +1 -1
  39. package/lib/commonjs/useNavigationCache.js +17 -10
  40. package/lib/commonjs/useNavigationCache.js.map +1 -1
  41. package/lib/commonjs/useNavigationHelpers.js +10 -7
  42. package/lib/commonjs/useNavigationHelpers.js.map +1 -1
  43. package/lib/commonjs/useOnAction.js +13 -11
  44. package/lib/commonjs/useOnAction.js.map +1 -1
  45. package/lib/commonjs/useOnGetState.js +5 -4
  46. package/lib/commonjs/useOnGetState.js.map +1 -1
  47. package/lib/commonjs/useOnPreventRemove.js +6 -5
  48. package/lib/commonjs/useOnPreventRemove.js.map +1 -1
  49. package/lib/commonjs/useOnRouteFocus.js +7 -6
  50. package/lib/commonjs/useOnRouteFocus.js.map +1 -1
  51. package/lib/commonjs/useOptionsGetters.js +6 -5
  52. package/lib/commonjs/useOptionsGetters.js.map +1 -1
  53. package/lib/commonjs/useRouteCache.js +1 -1
  54. package/lib/commonjs/useScheduleUpdate.js +1 -1
  55. package/lib/commonjs/validatePathConfig.js +5 -2
  56. package/lib/commonjs/validatePathConfig.js.map +1 -1
  57. package/lib/module/BaseNavigationContainer.js +13 -9
  58. package/lib/module/BaseNavigationContainer.js.map +1 -1
  59. package/lib/module/CurrentRenderContext.js.map +1 -1
  60. package/lib/module/EnsureSingleNavigator.js +4 -3
  61. package/lib/module/EnsureSingleNavigator.js.map +1 -1
  62. package/lib/module/NavigationContainerRefContext.js.map +1 -1
  63. package/lib/module/NavigationContext.js.map +1 -1
  64. package/lib/module/NavigationHelpersContext.js.map +1 -1
  65. package/lib/module/NavigationRouteContext.js.map +1 -1
  66. package/lib/module/SceneView.js +11 -10
  67. package/lib/module/SceneView.js.map +1 -1
  68. package/lib/module/UnhandledActionContext.js.map +1 -1
  69. package/lib/module/createNavigationContainerRef.js +10 -5
  70. package/lib/module/createNavigationContainerRef.js.map +1 -1
  71. package/lib/module/fromEntries.js +3 -1
  72. package/lib/module/fromEntries.js.map +1 -1
  73. package/lib/module/getActionFromState.js +2 -1
  74. package/lib/module/getActionFromState.js.map +1 -1
  75. package/lib/module/getPathFromState.js +13 -3
  76. package/lib/module/getPathFromState.js.map +1 -1
  77. package/lib/module/getStateFromPath.js +12 -2
  78. package/lib/module/getStateFromPath.js.map +1 -1
  79. package/lib/module/types.js.map +1 -1
  80. package/lib/module/useChildListeners.js.map +1 -1
  81. package/lib/module/useCurrentRender.js +6 -5
  82. package/lib/module/useCurrentRender.js.map +1 -1
  83. package/lib/module/useDescriptors.js +16 -15
  84. package/lib/module/useDescriptors.js.map +1 -1
  85. package/lib/module/useEventEmitter.js +7 -6
  86. package/lib/module/useEventEmitter.js.map +1 -1
  87. package/lib/module/useFocusEvents.js +5 -4
  88. package/lib/module/useFocusEvents.js.map +1 -1
  89. package/lib/module/useFocusedListenersChildrenAdapter.js +5 -4
  90. package/lib/module/useFocusedListenersChildrenAdapter.js.map +1 -1
  91. package/lib/module/useKeyedChildListeners.js.map +1 -1
  92. package/lib/module/useNavigationBuilder.js +9 -5
  93. package/lib/module/useNavigationBuilder.js.map +1 -1
  94. package/lib/module/useNavigationCache.js +17 -10
  95. package/lib/module/useNavigationCache.js.map +1 -1
  96. package/lib/module/useNavigationHelpers.js +10 -7
  97. package/lib/module/useNavigationHelpers.js.map +1 -1
  98. package/lib/module/useOnAction.js +13 -11
  99. package/lib/module/useOnAction.js.map +1 -1
  100. package/lib/module/useOnGetState.js +5 -4
  101. package/lib/module/useOnGetState.js.map +1 -1
  102. package/lib/module/useOnPreventRemove.js +6 -5
  103. package/lib/module/useOnPreventRemove.js.map +1 -1
  104. package/lib/module/useOnRouteFocus.js +7 -6
  105. package/lib/module/useOnRouteFocus.js.map +1 -1
  106. package/lib/module/useOptionsGetters.js +6 -5
  107. package/lib/module/useOptionsGetters.js.map +1 -1
  108. package/lib/module/validatePathConfig.js +5 -2
  109. package/lib/module/validatePathConfig.js.map +1 -1
  110. package/package.json +4 -4
  111. package/src/CurrentRenderContext.tsx +3 -2
  112. package/src/EnsureSingleNavigator.tsx +7 -8
  113. package/src/NavigationContainerRefContext.tsx +3 -4
  114. package/src/NavigationContext.tsx +3 -2
  115. package/src/NavigationHelpersContext.tsx +3 -2
  116. package/src/NavigationRouteContext.tsx +3 -2
  117. package/src/UnhandledActionContext.tsx +3 -4
  118. package/src/createNavigationContainerRef.tsx +3 -1
  119. package/src/types.tsx +6 -6
  120. package/src/useChildListeners.tsx +3 -5
  121. package/src/useKeyedChildListeners.tsx +6 -8
  122. package/src/useNavigationBuilder.tsx +18 -9
@@ -1 +1 @@
1
- {"version":3,"sources":["useOnAction.tsx"],"names":["React","NavigationBuilderContext","useOnPreventRemove","shouldPreventRemove","useOnAction","router","getState","setState","key","actionListeners","beforeRemoveListeners","routerConfigOptions","emitter","onAction","onActionParent","onRouteFocus","onRouteFocusParent","addListener","addListenerParent","onDispatchAction","useContext","routerConfigOptionsRef","useRef","useEffect","current","useCallback","action","visitedNavigators","Set","state","has","add","target","result","getStateForAction","isPrevented","routes","undefined","shouldFocus","shouldActionChangeFocus","i","length","listener"],"mappings":"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","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n PartialState,\n Router,\n RouterConfigOptions,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n ChildActionListener,\n ChildBeforeRemoveListener,\n} from './NavigationBuilderContext';\nimport type { EventMapCore } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\nimport useOnPreventRemove, { shouldPreventRemove } from './useOnPreventRemove';\n\ntype Options = {\n router: Router<NavigationState, NavigationAction>;\n key?: string;\n getState: () => NavigationState;\n setState: (state: NavigationState | PartialState<NavigationState>) => void;\n actionListeners: ChildActionListener[];\n beforeRemoveListeners: Record<string, ChildBeforeRemoveListener | undefined>;\n routerConfigOptions: RouterConfigOptions;\n emitter: NavigationEventEmitter<EventMapCore<any>>;\n};\n\n/**\n * Hook to handle actions for a navigator, including state updates and bubbling.\n *\n * Bubbling an action is achieved in 2 ways:\n * 1. To bubble action to parent, we expose the action handler in context and then access the parent context\n * 2. To bubble action to child, child adds event listeners subscribing to actions from parent\n *\n * When the action handler handles as action, it returns `true`, otherwise `false`.\n */\nexport default function useOnAction({\n router,\n getState,\n setState,\n key,\n actionListeners,\n beforeRemoveListeners,\n routerConfigOptions,\n emitter,\n}: Options) {\n const {\n onAction: onActionParent,\n onRouteFocus: onRouteFocusParent,\n addListener: addListenerParent,\n onDispatchAction,\n } = React.useContext(NavigationBuilderContext);\n\n const routerConfigOptionsRef =\n React.useRef<RouterConfigOptions>(routerConfigOptions);\n\n React.useEffect(() => {\n routerConfigOptionsRef.current = routerConfigOptions;\n });\n\n const onAction = React.useCallback(\n (\n action: NavigationAction,\n visitedNavigators: Set<string> = new Set<string>()\n ) => {\n const state = getState();\n\n // Since actions can bubble both up and down, they could come to the same navigator again\n // We keep track of navigators which have already tried to handle the action and return if it's already visited\n if (visitedNavigators.has(state.key)) {\n return false;\n }\n\n visitedNavigators.add(state.key);\n\n if (typeof action.target !== 'string' || action.target === state.key) {\n let result = router.getStateForAction(\n state,\n action,\n routerConfigOptionsRef.current\n );\n\n // If a target is specified and set to current navigator, the action shouldn't bubble\n // So instead of `null`, we use the state object for such cases to signal that action was handled\n result =\n result === null && action.target === state.key ? state : result;\n\n if (result !== null) {\n onDispatchAction(action, state === result);\n\n if (state !== result) {\n const isPrevented = shouldPreventRemove(\n emitter,\n beforeRemoveListeners,\n state.routes,\n result.routes,\n action\n );\n\n if (isPrevented) {\n return true;\n }\n\n setState(result);\n }\n\n if (onRouteFocusParent !== undefined) {\n // Some actions such as `NAVIGATE` also want to bring the navigated route to focus in the whole tree\n // This means we need to focus all of the parent navigators of this navigator as well\n const shouldFocus = router.shouldActionChangeFocus(action);\n\n if (shouldFocus && key !== undefined) {\n onRouteFocusParent(key);\n }\n }\n\n return true;\n }\n }\n\n if (onActionParent !== undefined) {\n // Bubble action to the parent if the current navigator didn't handle it\n if (onActionParent(action, visitedNavigators)) {\n return true;\n }\n }\n\n // If the action wasn't handled by current navigator or a parent navigator, let children handle it\n for (let i = actionListeners.length - 1; i >= 0; i--) {\n const listener = actionListeners[i];\n\n if (listener(action, visitedNavigators)) {\n return true;\n }\n }\n\n return false;\n },\n [\n actionListeners,\n beforeRemoveListeners,\n emitter,\n getState,\n key,\n onActionParent,\n onDispatchAction,\n onRouteFocusParent,\n router,\n setState,\n ]\n );\n\n useOnPreventRemove({\n getState,\n emitter,\n beforeRemoveListeners,\n });\n\n React.useEffect(\n () => addListenerParent?.('action', onAction),\n [addListenerParent, onAction]\n );\n\n return onAction;\n}\n"]}
1
+ {"version":3,"sources":["useOnAction.tsx"],"names":["React","NavigationBuilderContext","useOnPreventRemove","shouldPreventRemove","useOnAction","router","getState","setState","key","actionListeners","beforeRemoveListeners","routerConfigOptions","emitter","onAction","onActionParent","onRouteFocus","onRouteFocusParent","addListener","addListenerParent","onDispatchAction","useContext","routerConfigOptionsRef","useRef","useEffect","current","useCallback","action","visitedNavigators","Set","state","has","add","target","result","getStateForAction","isPrevented","routes","undefined","shouldFocus","shouldActionChangeFocus","i","length","listener"],"mappings":"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","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n PartialState,\n Router,\n RouterConfigOptions,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n ChildActionListener,\n ChildBeforeRemoveListener,\n} from './NavigationBuilderContext';\nimport type { EventMapCore } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\nimport useOnPreventRemove, { shouldPreventRemove } from './useOnPreventRemove';\n\ntype Options = {\n router: Router<NavigationState, NavigationAction>;\n key?: string;\n getState: () => NavigationState;\n setState: (state: NavigationState | PartialState<NavigationState>) => void;\n actionListeners: ChildActionListener[];\n beforeRemoveListeners: Record<string, ChildBeforeRemoveListener | undefined>;\n routerConfigOptions: RouterConfigOptions;\n emitter: NavigationEventEmitter<EventMapCore<any>>;\n};\n\n/**\n * Hook to handle actions for a navigator, including state updates and bubbling.\n *\n * Bubbling an action is achieved in 2 ways:\n * 1. To bubble action to parent, we expose the action handler in context and then access the parent context\n * 2. To bubble action to child, child adds event listeners subscribing to actions from parent\n *\n * When the action handler handles as action, it returns `true`, otherwise `false`.\n */\nexport default function useOnAction({\n router,\n getState,\n setState,\n key,\n actionListeners,\n beforeRemoveListeners,\n routerConfigOptions,\n emitter,\n}: Options) {\n const {\n onAction: onActionParent,\n onRouteFocus: onRouteFocusParent,\n addListener: addListenerParent,\n onDispatchAction,\n } = React.useContext(NavigationBuilderContext);\n\n const routerConfigOptionsRef =\n React.useRef<RouterConfigOptions>(routerConfigOptions);\n\n React.useEffect(() => {\n routerConfigOptionsRef.current = routerConfigOptions;\n });\n\n const onAction = React.useCallback(\n (\n action: NavigationAction,\n visitedNavigators: Set<string> = new Set<string>()\n ) => {\n const state = getState();\n\n // Since actions can bubble both up and down, they could come to the same navigator again\n // We keep track of navigators which have already tried to handle the action and return if it's already visited\n if (visitedNavigators.has(state.key)) {\n return false;\n }\n\n visitedNavigators.add(state.key);\n\n if (typeof action.target !== 'string' || action.target === state.key) {\n let result = router.getStateForAction(\n state,\n action,\n routerConfigOptionsRef.current\n );\n\n // If a target is specified and set to current navigator, the action shouldn't bubble\n // So instead of `null`, we use the state object for such cases to signal that action was handled\n result =\n result === null && action.target === state.key ? state : result;\n\n if (result !== null) {\n onDispatchAction(action, state === result);\n\n if (state !== result) {\n const isPrevented = shouldPreventRemove(\n emitter,\n beforeRemoveListeners,\n state.routes,\n result.routes,\n action\n );\n\n if (isPrevented) {\n return true;\n }\n\n setState(result);\n }\n\n if (onRouteFocusParent !== undefined) {\n // Some actions such as `NAVIGATE` also want to bring the navigated route to focus in the whole tree\n // This means we need to focus all of the parent navigators of this navigator as well\n const shouldFocus = router.shouldActionChangeFocus(action);\n\n if (shouldFocus && key !== undefined) {\n onRouteFocusParent(key);\n }\n }\n\n return true;\n }\n }\n\n if (onActionParent !== undefined) {\n // Bubble action to the parent if the current navigator didn't handle it\n if (onActionParent(action, visitedNavigators)) {\n return true;\n }\n }\n\n // If the action wasn't handled by current navigator or a parent navigator, let children handle it\n for (let i = actionListeners.length - 1; i >= 0; i--) {\n const listener = actionListeners[i];\n\n if (listener(action, visitedNavigators)) {\n return true;\n }\n }\n\n return false;\n },\n [\n actionListeners,\n beforeRemoveListeners,\n emitter,\n getState,\n key,\n onActionParent,\n onDispatchAction,\n onRouteFocusParent,\n router,\n setState,\n ]\n );\n\n useOnPreventRemove({\n getState,\n emitter,\n beforeRemoveListeners,\n });\n\n React.useEffect(\n () => addListenerParent?.('action', onAction),\n [addListenerParent, onAction]\n );\n\n return onAction;\n}\n"]}
@@ -2,10 +2,11 @@ import * as React from 'react';
2
2
  import isArrayEqual from './isArrayEqual';
3
3
  import NavigationBuilderContext from './NavigationBuilderContext';
4
4
  import NavigationRouteContext from './NavigationRouteContext';
5
- export default function useOnGetState({
6
- getState,
7
- getStateListeners
8
- }) {
5
+ export default function useOnGetState(_ref) {
6
+ let {
7
+ getState,
8
+ getStateListeners
9
+ } = _ref;
9
10
  const {
10
11
  addKeyedListener
11
12
  } = React.useContext(NavigationBuilderContext);
@@ -1 +1 @@
1
- {"version":3,"sources":["useOnGetState.tsx"],"names":["React","isArrayEqual","NavigationBuilderContext","NavigationRouteContext","useOnGetState","getState","getStateListeners","addKeyedListener","useContext","route","key","getRehydratedState","useCallback","state","routes","map","childState","useEffect"],"mappings":"AACA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,YAAP,MAAyB,gBAAzB;AACA,OAAOC,wBAAP,MAEO,4BAFP;AAGA,OAAOC,sBAAP,MAAmC,0BAAnC;AAOA,eAAe,SAASC,aAAT,CAAuB;AACpCC,EAAAA,QADoC;AAEpCC,EAAAA;AAFoC,CAAvB,EAGH;AACV,QAAM;AAAEC,IAAAA;AAAF,MAAuBP,KAAK,CAACQ,UAAN,CAAiBN,wBAAjB,CAA7B;AACA,QAAMO,KAAK,GAAGT,KAAK,CAACQ,UAAN,CAAiBL,sBAAjB,CAAd;AACA,QAAMO,GAAG,GAAGD,KAAK,GAAGA,KAAK,CAACC,GAAT,GAAe,MAAhC;AAEA,QAAMC,kBAAkB,GAAGX,KAAK,CAACY,WAAN,CAAkB,MAAM;AACjD,UAAMC,KAAK,GAAGR,QAAQ,EAAtB,CADiD,CAGjD;;AACA,UAAMS,MAAM,GAAGD,KAAK,CAACC,MAAN,CAAaC,GAAb,CAAkBN,KAAD,IAAW;AAAA;;AACzC,YAAMO,UAAU,4BAAGV,iBAAiB,CAACG,KAAK,CAACC,GAAP,CAApB,0DAAG,2BAAAJ,iBAAiB,CAApC;;AAEA,UAAIG,KAAK,CAACI,KAAN,KAAgBG,UAApB,EAAgC;AAC9B,eAAOP,KAAP;AACD;;AAED,aAAO,EAAE,GAAGA,KAAL;AAAYI,QAAAA,KAAK,EAAEG;AAAnB,OAAP;AACD,KARc,CAAf;;AAUA,QAAIf,YAAY,CAACY,KAAK,CAACC,MAAP,EAAeA,MAAf,CAAhB,EAAwC;AACtC,aAAOD,KAAP;AACD;;AAED,WAAO,EAAE,GAAGA,KAAL;AAAYC,MAAAA;AAAZ,KAAP;AACD,GAnB0B,EAmBxB,CAACT,QAAD,EAAWC,iBAAX,CAnBwB,CAA3B;AAqBAN,EAAAA,KAAK,CAACiB,SAAN,CAAgB,MAAM;AACpB,WAAOV,gBAAP,aAAOA,gBAAP,uBAAOA,gBAAgB,CAAG,UAAH,EAAeG,GAAf,EAAoBC,kBAApB,CAAvB;AACD,GAFD,EAEG,CAACJ,gBAAD,EAAmBI,kBAAnB,EAAuCD,GAAvC,CAFH;AAGD","sourcesContent":["import type { NavigationState } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport isArrayEqual from './isArrayEqual';\nimport NavigationBuilderContext, {\n GetStateListener,\n} from './NavigationBuilderContext';\nimport NavigationRouteContext from './NavigationRouteContext';\n\ntype Options = {\n getState: () => NavigationState;\n getStateListeners: Record<string, GetStateListener | undefined>;\n};\n\nexport default function useOnGetState({\n getState,\n getStateListeners,\n}: Options) {\n const { addKeyedListener } = React.useContext(NavigationBuilderContext);\n const route = React.useContext(NavigationRouteContext);\n const key = route ? route.key : 'root';\n\n const getRehydratedState = React.useCallback(() => {\n const state = getState();\n\n // Avoid returning new route objects if we don't need to\n const routes = state.routes.map((route) => {\n const childState = getStateListeners[route.key]?.();\n\n if (route.state === childState) {\n return route;\n }\n\n return { ...route, state: childState };\n });\n\n if (isArrayEqual(state.routes, routes)) {\n return state;\n }\n\n return { ...state, routes };\n }, [getState, getStateListeners]);\n\n React.useEffect(() => {\n return addKeyedListener?.('getState', key, getRehydratedState);\n }, [addKeyedListener, getRehydratedState, key]);\n}\n"]}
1
+ {"version":3,"sources":["useOnGetState.tsx"],"names":["React","isArrayEqual","NavigationBuilderContext","NavigationRouteContext","useOnGetState","getState","getStateListeners","addKeyedListener","useContext","route","key","getRehydratedState","useCallback","state","routes","map","childState","useEffect"],"mappings":"AACA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,YAAP,MAAyB,gBAAzB;AACA,OAAOC,wBAAP,MAEO,4BAFP;AAGA,OAAOC,sBAAP,MAAmC,0BAAnC;AAOA,eAAe,SAASC,aAAT,OAGH;AAAA,MAH0B;AACpCC,IAAAA,QADoC;AAEpCC,IAAAA;AAFoC,GAG1B;AACV,QAAM;AAAEC,IAAAA;AAAF,MAAuBP,KAAK,CAACQ,UAAN,CAAiBN,wBAAjB,CAA7B;AACA,QAAMO,KAAK,GAAGT,KAAK,CAACQ,UAAN,CAAiBL,sBAAjB,CAAd;AACA,QAAMO,GAAG,GAAGD,KAAK,GAAGA,KAAK,CAACC,GAAT,GAAe,MAAhC;AAEA,QAAMC,kBAAkB,GAAGX,KAAK,CAACY,WAAN,CAAkB,MAAM;AACjD,UAAMC,KAAK,GAAGR,QAAQ,EAAtB,CADiD,CAGjD;;AACA,UAAMS,MAAM,GAAGD,KAAK,CAACC,MAAN,CAAaC,GAAb,CAAkBN,KAAD,IAAW;AAAA;;AACzC,YAAMO,UAAU,4BAAGV,iBAAiB,CAACG,KAAK,CAACC,GAAP,CAApB,0DAAG,2BAAAJ,iBAAiB,CAApC;;AAEA,UAAIG,KAAK,CAACI,KAAN,KAAgBG,UAApB,EAAgC;AAC9B,eAAOP,KAAP;AACD;;AAED,aAAO,EAAE,GAAGA,KAAL;AAAYI,QAAAA,KAAK,EAAEG;AAAnB,OAAP;AACD,KARc,CAAf;;AAUA,QAAIf,YAAY,CAACY,KAAK,CAACC,MAAP,EAAeA,MAAf,CAAhB,EAAwC;AACtC,aAAOD,KAAP;AACD;;AAED,WAAO,EAAE,GAAGA,KAAL;AAAYC,MAAAA;AAAZ,KAAP;AACD,GAnB0B,EAmBxB,CAACT,QAAD,EAAWC,iBAAX,CAnBwB,CAA3B;AAqBAN,EAAAA,KAAK,CAACiB,SAAN,CAAgB,MAAM;AACpB,WAAOV,gBAAP,aAAOA,gBAAP,uBAAOA,gBAAgB,CAAG,UAAH,EAAeG,GAAf,EAAoBC,kBAApB,CAAvB;AACD,GAFD,EAEG,CAACJ,gBAAD,EAAmBI,kBAAnB,EAAuCD,GAAvC,CAFH;AAGD","sourcesContent":["import type { NavigationState } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport isArrayEqual from './isArrayEqual';\nimport NavigationBuilderContext, {\n GetStateListener,\n} from './NavigationBuilderContext';\nimport NavigationRouteContext from './NavigationRouteContext';\n\ntype Options = {\n getState: () => NavigationState;\n getStateListeners: Record<string, GetStateListener | undefined>;\n};\n\nexport default function useOnGetState({\n getState,\n getStateListeners,\n}: Options) {\n const { addKeyedListener } = React.useContext(NavigationBuilderContext);\n const route = React.useContext(NavigationRouteContext);\n const key = route ? route.key : 'root';\n\n const getRehydratedState = React.useCallback(() => {\n const state = getState();\n\n // Avoid returning new route objects if we don't need to\n const routes = state.routes.map((route) => {\n const childState = getStateListeners[route.key]?.();\n\n if (route.state === childState) {\n return route;\n }\n\n return { ...route, state: childState };\n });\n\n if (isArrayEqual(state.routes, routes)) {\n return state;\n }\n\n return { ...state, routes };\n }, [getState, getStateListeners]);\n\n React.useEffect(() => {\n return addKeyedListener?.('getState', key, getRehydratedState);\n }, [addKeyedListener, getRehydratedState, key]);\n}\n"]}
@@ -46,11 +46,12 @@ export const shouldPreventRemove = (emitter, beforeRemoveListeners, currentRoute
46
46
 
47
47
  return false;
48
48
  };
49
- export default function useOnPreventRemove({
50
- getState,
51
- emitter,
52
- beforeRemoveListeners
53
- }) {
49
+ export default function useOnPreventRemove(_ref) {
50
+ let {
51
+ getState,
52
+ emitter,
53
+ beforeRemoveListeners
54
+ } = _ref;
54
55
  const {
55
56
  addKeyedListener
56
57
  } = React.useContext(NavigationBuilderContext);
@@ -1 +1 @@
1
- {"version":3,"sources":["useOnPreventRemove.tsx"],"names":["React","NavigationBuilderContext","NavigationRouteContext","VISITED_ROUTE_KEYS","Symbol","shouldPreventRemove","emitter","beforeRemoveListeners","currentRoutes","nextRoutes","action","nextRouteKeys","map","route","key","removedRoutes","filter","includes","reverse","visitedRouteKeys","Set","beforeRemoveAction","has","isPrevented","add","event","emit","type","target","data","canPreventDefault","defaultPrevented","useOnPreventRemove","getState","addKeyedListener","useContext","routeKey","useEffect","state","routes"],"mappings":"AAIA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,wBAAP,MAEO,4BAFP;AAGA,OAAOC,sBAAP,MAAmC,0BAAnC;AAUA,MAAMC,kBAAkB,GAAGC,MAAM,CAAC,oBAAD,CAAjC;AAEA,OAAO,MAAMC,mBAAmB,GAAG,CACjCC,OADiC,EAEjCC,qBAFiC,EAGjCC,aAHiC,EAIjCC,UAJiC,EAKjCC,MALiC,KAM9B;AAAA;;AACH,QAAMC,aAAa,GAAGF,UAAU,CAACG,GAAX,CAAgBC,KAAD,IAAWA,KAAK,CAACC,GAAhC,CAAtB,CADG,CAGH;;AACA,QAAMC,aAAa,GAAGP,aAAa,CAChCQ,MADmB,CACXH,KAAD,IAAW,CAACF,aAAa,CAACM,QAAd,CAAuBJ,KAAK,CAACC,GAA7B,CADA,EAEnBI,OAFmB,EAAtB;AAIA,QAAMC,gBAA6B,GACjC;AADiC,2BAEjCT,MAAM,CAACP,kBAAD,CAF2B,yEAEH,IAAIiB,GAAJ,EAFhC;AAIA,QAAMC,kBAAkB,GAAG,EACzB,GAAGX,MADsB;AAEzB,KAACP,kBAAD,GAAsBgB;AAFG,GAA3B;;AAKA,OAAK,MAAMN,KAAX,IAAoBE,aAApB,EAAmC;AAAA;;AACjC,QAAII,gBAAgB,CAACG,GAAjB,CAAqBT,KAAK,CAACC,GAA3B,CAAJ,EAAqC;AACnC;AACA;AACD,KAJgC,CAMjC;;;AACA,UAAMS,WAAW,4BAAGhB,qBAAqB,CAACM,KAAK,CAACC,GAAP,CAAxB,0DAAG,2BAAAP,qBAAqB,EAAcc,kBAAd,CAAzC;;AAEA,QAAIE,WAAJ,EAAiB;AACf,aAAO,IAAP;AACD;;AAEDJ,IAAAA,gBAAgB,CAACK,GAAjB,CAAqBX,KAAK,CAACC,GAA3B;AAEA,UAAMW,KAAK,GAAGnB,OAAO,CAACoB,IAAR,CAAa;AACzBC,MAAAA,IAAI,EAAE,cADmB;AAEzBC,MAAAA,MAAM,EAAEf,KAAK,CAACC,GAFW;AAGzBe,MAAAA,IAAI,EAAE;AAAEnB,QAAAA,MAAM,EAAEW;AAAV,OAHmB;AAIzBS,MAAAA,iBAAiB,EAAE;AAJM,KAAb,CAAd;;AAOA,QAAIL,KAAK,CAACM,gBAAV,EAA4B;AAC1B,aAAO,IAAP;AACD;AACF;;AAED,SAAO,KAAP;AACD,CAnDM;AAqDP,eAAe,SAASC,kBAAT,CAA4B;AACzCC,EAAAA,QADyC;AAEzC3B,EAAAA,OAFyC;AAGzCC,EAAAA;AAHyC,CAA5B,EAIH;AACV,QAAM;AAAE2B,IAAAA;AAAF,MAAuBlC,KAAK,CAACmC,UAAN,CAAiBlC,wBAAjB,CAA7B;AACA,QAAMY,KAAK,GAAGb,KAAK,CAACmC,UAAN,CAAiBjC,sBAAjB,CAAd;AACA,QAAMkC,QAAQ,GAAGvB,KAAH,aAAGA,KAAH,uBAAGA,KAAK,CAAEC,GAAxB;AAEAd,EAAAA,KAAK,CAACqC,SAAN,CAAgB,MAAM;AACpB,QAAID,QAAJ,EAAc;AACZ,aAAOF,gBAAP,aAAOA,gBAAP,uBAAOA,gBAAgB,CAAG,cAAH,EAAmBE,QAAnB,EAA8B1B,MAAD,IAAY;AAC9D,cAAM4B,KAAK,GAAGL,QAAQ,EAAtB;AAEA,eAAO5B,mBAAmB,CACxBC,OADwB,EAExBC,qBAFwB,EAGxB+B,KAAK,CAACC,MAHkB,EAIxB,EAJwB,EAKxB7B,MALwB,CAA1B;AAOD,OAVsB,CAAvB;AAWD;AACF,GAdD,EAcG,CAACwB,gBAAD,EAAmB3B,qBAAnB,EAA0CD,OAA1C,EAAmD2B,QAAnD,EAA6DG,QAA7D,CAdH;AAeD","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n ChildBeforeRemoveListener,\n} from './NavigationBuilderContext';\nimport NavigationRouteContext from './NavigationRouteContext';\nimport type { EventMapCore } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\ntype Options = {\n getState: () => NavigationState;\n emitter: NavigationEventEmitter<EventMapCore<any>>;\n beforeRemoveListeners: Record<string, ChildBeforeRemoveListener | undefined>;\n};\n\nconst VISITED_ROUTE_KEYS = Symbol('VISITED_ROUTE_KEYS');\n\nexport const shouldPreventRemove = (\n emitter: NavigationEventEmitter<EventMapCore<any>>,\n beforeRemoveListeners: Record<string, ChildBeforeRemoveListener | undefined>,\n currentRoutes: { key: string }[],\n nextRoutes: { key?: string | undefined }[],\n action: NavigationAction\n) => {\n const nextRouteKeys = nextRoutes.map((route) => route.key);\n\n // Call these in reverse order so last screens handle the event first\n const removedRoutes = currentRoutes\n .filter((route) => !nextRouteKeys.includes(route.key))\n .reverse();\n\n const visitedRouteKeys: Set<string> =\n // @ts-expect-error: add this property to mark that we've already emitted this action\n action[VISITED_ROUTE_KEYS] ?? new Set<string>();\n\n const beforeRemoveAction = {\n ...action,\n [VISITED_ROUTE_KEYS]: visitedRouteKeys,\n };\n\n for (const route of removedRoutes) {\n if (visitedRouteKeys.has(route.key)) {\n // Skip if we've already emitted this action for this screen\n continue;\n }\n\n // First, we need to check if any child screens want to prevent it\n const isPrevented = beforeRemoveListeners[route.key]?.(beforeRemoveAction);\n\n if (isPrevented) {\n return true;\n }\n\n visitedRouteKeys.add(route.key);\n\n const event = emitter.emit({\n type: 'beforeRemove',\n target: route.key,\n data: { action: beforeRemoveAction },\n canPreventDefault: true,\n });\n\n if (event.defaultPrevented) {\n return true;\n }\n }\n\n return false;\n};\n\nexport default function useOnPreventRemove({\n getState,\n emitter,\n beforeRemoveListeners,\n}: Options) {\n const { addKeyedListener } = React.useContext(NavigationBuilderContext);\n const route = React.useContext(NavigationRouteContext);\n const routeKey = route?.key;\n\n React.useEffect(() => {\n if (routeKey) {\n return addKeyedListener?.('beforeRemove', routeKey, (action) => {\n const state = getState();\n\n return shouldPreventRemove(\n emitter,\n beforeRemoveListeners,\n state.routes,\n [],\n action\n );\n });\n }\n }, [addKeyedListener, beforeRemoveListeners, emitter, getState, routeKey]);\n}\n"]}
1
+ {"version":3,"sources":["useOnPreventRemove.tsx"],"names":["React","NavigationBuilderContext","NavigationRouteContext","VISITED_ROUTE_KEYS","Symbol","shouldPreventRemove","emitter","beforeRemoveListeners","currentRoutes","nextRoutes","action","nextRouteKeys","map","route","key","removedRoutes","filter","includes","reverse","visitedRouteKeys","Set","beforeRemoveAction","has","isPrevented","add","event","emit","type","target","data","canPreventDefault","defaultPrevented","useOnPreventRemove","getState","addKeyedListener","useContext","routeKey","useEffect","state","routes"],"mappings":"AAIA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,wBAAP,MAEO,4BAFP;AAGA,OAAOC,sBAAP,MAAmC,0BAAnC;AAUA,MAAMC,kBAAkB,GAAGC,MAAM,CAAC,oBAAD,CAAjC;AAEA,OAAO,MAAMC,mBAAmB,GAAG,CACjCC,OADiC,EAEjCC,qBAFiC,EAGjCC,aAHiC,EAIjCC,UAJiC,EAKjCC,MALiC,KAM9B;AAAA;;AACH,QAAMC,aAAa,GAAGF,UAAU,CAACG,GAAX,CAAgBC,KAAD,IAAWA,KAAK,CAACC,GAAhC,CAAtB,CADG,CAGH;;AACA,QAAMC,aAAa,GAAGP,aAAa,CAChCQ,MADmB,CACXH,KAAD,IAAW,CAACF,aAAa,CAACM,QAAd,CAAuBJ,KAAK,CAACC,GAA7B,CADA,EAEnBI,OAFmB,EAAtB;AAIA,QAAMC,gBAA6B,GACjC;AADiC,2BAEjCT,MAAM,CAACP,kBAAD,CAF2B,yEAEH,IAAIiB,GAAJ,EAFhC;AAIA,QAAMC,kBAAkB,GAAG,EACzB,GAAGX,MADsB;AAEzB,KAACP,kBAAD,GAAsBgB;AAFG,GAA3B;;AAKA,OAAK,MAAMN,KAAX,IAAoBE,aAApB,EAAmC;AAAA;;AACjC,QAAII,gBAAgB,CAACG,GAAjB,CAAqBT,KAAK,CAACC,GAA3B,CAAJ,EAAqC;AACnC;AACA;AACD,KAJgC,CAMjC;;;AACA,UAAMS,WAAW,4BAAGhB,qBAAqB,CAACM,KAAK,CAACC,GAAP,CAAxB,0DAAG,2BAAAP,qBAAqB,EAAcc,kBAAd,CAAzC;;AAEA,QAAIE,WAAJ,EAAiB;AACf,aAAO,IAAP;AACD;;AAEDJ,IAAAA,gBAAgB,CAACK,GAAjB,CAAqBX,KAAK,CAACC,GAA3B;AAEA,UAAMW,KAAK,GAAGnB,OAAO,CAACoB,IAAR,CAAa;AACzBC,MAAAA,IAAI,EAAE,cADmB;AAEzBC,MAAAA,MAAM,EAAEf,KAAK,CAACC,GAFW;AAGzBe,MAAAA,IAAI,EAAE;AAAEnB,QAAAA,MAAM,EAAEW;AAAV,OAHmB;AAIzBS,MAAAA,iBAAiB,EAAE;AAJM,KAAb,CAAd;;AAOA,QAAIL,KAAK,CAACM,gBAAV,EAA4B;AAC1B,aAAO,IAAP;AACD;AACF;;AAED,SAAO,KAAP;AACD,CAnDM;AAqDP,eAAe,SAASC,kBAAT,OAIH;AAAA,MAJ+B;AACzCC,IAAAA,QADyC;AAEzC3B,IAAAA,OAFyC;AAGzCC,IAAAA;AAHyC,GAI/B;AACV,QAAM;AAAE2B,IAAAA;AAAF,MAAuBlC,KAAK,CAACmC,UAAN,CAAiBlC,wBAAjB,CAA7B;AACA,QAAMY,KAAK,GAAGb,KAAK,CAACmC,UAAN,CAAiBjC,sBAAjB,CAAd;AACA,QAAMkC,QAAQ,GAAGvB,KAAH,aAAGA,KAAH,uBAAGA,KAAK,CAAEC,GAAxB;AAEAd,EAAAA,KAAK,CAACqC,SAAN,CAAgB,MAAM;AACpB,QAAID,QAAJ,EAAc;AACZ,aAAOF,gBAAP,aAAOA,gBAAP,uBAAOA,gBAAgB,CAAG,cAAH,EAAmBE,QAAnB,EAA8B1B,MAAD,IAAY;AAC9D,cAAM4B,KAAK,GAAGL,QAAQ,EAAtB;AAEA,eAAO5B,mBAAmB,CACxBC,OADwB,EAExBC,qBAFwB,EAGxB+B,KAAK,CAACC,MAHkB,EAIxB,EAJwB,EAKxB7B,MALwB,CAA1B;AAOD,OAVsB,CAAvB;AAWD;AACF,GAdD,EAcG,CAACwB,gBAAD,EAAmB3B,qBAAnB,EAA0CD,OAA1C,EAAmD2B,QAAnD,EAA6DG,QAA7D,CAdH;AAeD","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext, {\n ChildBeforeRemoveListener,\n} from './NavigationBuilderContext';\nimport NavigationRouteContext from './NavigationRouteContext';\nimport type { EventMapCore } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\ntype Options = {\n getState: () => NavigationState;\n emitter: NavigationEventEmitter<EventMapCore<any>>;\n beforeRemoveListeners: Record<string, ChildBeforeRemoveListener | undefined>;\n};\n\nconst VISITED_ROUTE_KEYS = Symbol('VISITED_ROUTE_KEYS');\n\nexport const shouldPreventRemove = (\n emitter: NavigationEventEmitter<EventMapCore<any>>,\n beforeRemoveListeners: Record<string, ChildBeforeRemoveListener | undefined>,\n currentRoutes: { key: string }[],\n nextRoutes: { key?: string | undefined }[],\n action: NavigationAction\n) => {\n const nextRouteKeys = nextRoutes.map((route) => route.key);\n\n // Call these in reverse order so last screens handle the event first\n const removedRoutes = currentRoutes\n .filter((route) => !nextRouteKeys.includes(route.key))\n .reverse();\n\n const visitedRouteKeys: Set<string> =\n // @ts-expect-error: add this property to mark that we've already emitted this action\n action[VISITED_ROUTE_KEYS] ?? new Set<string>();\n\n const beforeRemoveAction = {\n ...action,\n [VISITED_ROUTE_KEYS]: visitedRouteKeys,\n };\n\n for (const route of removedRoutes) {\n if (visitedRouteKeys.has(route.key)) {\n // Skip if we've already emitted this action for this screen\n continue;\n }\n\n // First, we need to check if any child screens want to prevent it\n const isPrevented = beforeRemoveListeners[route.key]?.(beforeRemoveAction);\n\n if (isPrevented) {\n return true;\n }\n\n visitedRouteKeys.add(route.key);\n\n const event = emitter.emit({\n type: 'beforeRemove',\n target: route.key,\n data: { action: beforeRemoveAction },\n canPreventDefault: true,\n });\n\n if (event.defaultPrevented) {\n return true;\n }\n }\n\n return false;\n};\n\nexport default function useOnPreventRemove({\n getState,\n emitter,\n beforeRemoveListeners,\n}: Options) {\n const { addKeyedListener } = React.useContext(NavigationBuilderContext);\n const route = React.useContext(NavigationRouteContext);\n const routeKey = route?.key;\n\n React.useEffect(() => {\n if (routeKey) {\n return addKeyedListener?.('beforeRemove', routeKey, (action) => {\n const state = getState();\n\n return shouldPreventRemove(\n emitter,\n beforeRemoveListeners,\n state.routes,\n [],\n action\n );\n });\n }\n }, [addKeyedListener, beforeRemoveListeners, emitter, getState, routeKey]);\n}\n"]}
@@ -6,12 +6,13 @@ import NavigationBuilderContext from './NavigationBuilderContext';
6
6
  * Focus action needs to be treated specially, coz when a nested route is focused,
7
7
  * the parent navigators also needs to be focused.
8
8
  */
9
- export default function useOnRouteFocus({
10
- router,
11
- getState,
12
- key: sourceRouteKey,
13
- setState
14
- }) {
9
+ export default function useOnRouteFocus(_ref) {
10
+ let {
11
+ router,
12
+ getState,
13
+ key: sourceRouteKey,
14
+ setState
15
+ } = _ref;
15
16
  const {
16
17
  onRouteFocus: onRouteFocusParent
17
18
  } = React.useContext(NavigationBuilderContext);
@@ -1 +1 @@
1
- {"version":3,"sources":["useOnRouteFocus.tsx"],"names":["React","NavigationBuilderContext","useOnRouteFocus","router","getState","key","sourceRouteKey","setState","onRouteFocus","onRouteFocusParent","useContext","useCallback","state","result","getStateForRouteFocus","undefined"],"mappings":"AAKA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,wBAAP,MAAqC,4BAArC;;AASA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,eAAT,CAA0D;AACvEC,EAAAA,MADuE;AAEvEC,EAAAA,QAFuE;AAGvEC,EAAAA,GAAG,EAAEC,cAHkE;AAIvEC,EAAAA;AAJuE,CAA1D,EAKK;AAClB,QAAM;AAAEC,IAAAA,YAAY,EAAEC;AAAhB,MAAuCT,KAAK,CAACU,UAAN,CAC3CT,wBAD2C,CAA7C;AAIA,SAAOD,KAAK,CAACW,WAAN,CACJN,GAAD,IAAiB;AACf,UAAMO,KAAK,GAAGR,QAAQ,EAAtB;AACA,UAAMS,MAAM,GAAGV,MAAM,CAACW,qBAAP,CAA6BF,KAA7B,EAAoCP,GAApC,CAAf;;AAEA,QAAIQ,MAAM,KAAKD,KAAf,EAAsB;AACpBL,MAAAA,QAAQ,CAACM,MAAD,CAAR;AACD;;AAED,QAAIJ,kBAAkB,KAAKM,SAAvB,IAAoCT,cAAc,KAAKS,SAA3D,EAAsE;AACpEN,MAAAA,kBAAkB,CAACH,cAAD,CAAlB;AACD;AACF,GAZI,EAaL,CAACF,QAAD,EAAWK,kBAAX,EAA+BN,MAA/B,EAAuCI,QAAvC,EAAiDD,cAAjD,CAbK,CAAP;AAeD","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext from './NavigationBuilderContext';\n\ntype Options<Action extends NavigationAction> = {\n router: Router<NavigationState, Action>;\n getState: () => NavigationState;\n setState: (state: NavigationState) => void;\n key?: string;\n};\n\n/**\n * Hook to handle focus actions for a route.\n * Focus action needs to be treated specially, coz when a nested route is focused,\n * the parent navigators also needs to be focused.\n */\nexport default function useOnRouteFocus<Action extends NavigationAction>({\n router,\n getState,\n key: sourceRouteKey,\n setState,\n}: Options<Action>) {\n const { onRouteFocus: onRouteFocusParent } = React.useContext(\n NavigationBuilderContext\n );\n\n return React.useCallback(\n (key: string) => {\n const state = getState();\n const result = router.getStateForRouteFocus(state, key);\n\n if (result !== state) {\n setState(result);\n }\n\n if (onRouteFocusParent !== undefined && sourceRouteKey !== undefined) {\n onRouteFocusParent(sourceRouteKey);\n }\n },\n [getState, onRouteFocusParent, router, setState, sourceRouteKey]\n );\n}\n"]}
1
+ {"version":3,"sources":["useOnRouteFocus.tsx"],"names":["React","NavigationBuilderContext","useOnRouteFocus","router","getState","key","sourceRouteKey","setState","onRouteFocus","onRouteFocusParent","useContext","useCallback","state","result","getStateForRouteFocus","undefined"],"mappings":"AAKA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,wBAAP,MAAqC,4BAArC;;AASA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,eAAT,OAKK;AAAA,MALqD;AACvEC,IAAAA,MADuE;AAEvEC,IAAAA,QAFuE;AAGvEC,IAAAA,GAAG,EAAEC,cAHkE;AAIvEC,IAAAA;AAJuE,GAKrD;AAClB,QAAM;AAAEC,IAAAA,YAAY,EAAEC;AAAhB,MAAuCT,KAAK,CAACU,UAAN,CAC3CT,wBAD2C,CAA7C;AAIA,SAAOD,KAAK,CAACW,WAAN,CACJN,GAAD,IAAiB;AACf,UAAMO,KAAK,GAAGR,QAAQ,EAAtB;AACA,UAAMS,MAAM,GAAGV,MAAM,CAACW,qBAAP,CAA6BF,KAA7B,EAAoCP,GAApC,CAAf;;AAEA,QAAIQ,MAAM,KAAKD,KAAf,EAAsB;AACpBL,MAAAA,QAAQ,CAACM,MAAD,CAAR;AACD;;AAED,QAAIJ,kBAAkB,KAAKM,SAAvB,IAAoCT,cAAc,KAAKS,SAA3D,EAAsE;AACpEN,MAAAA,kBAAkB,CAACH,cAAD,CAAlB;AACD;AACF,GAZI,EAaL,CAACF,QAAD,EAAWK,kBAAX,EAA+BN,MAA/B,EAAuCI,QAAvC,EAAiDD,cAAjD,CAbK,CAAP;AAeD","sourcesContent":["import type {\n NavigationAction,\n NavigationState,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext from './NavigationBuilderContext';\n\ntype Options<Action extends NavigationAction> = {\n router: Router<NavigationState, Action>;\n getState: () => NavigationState;\n setState: (state: NavigationState) => void;\n key?: string;\n};\n\n/**\n * Hook to handle focus actions for a route.\n * Focus action needs to be treated specially, coz when a nested route is focused,\n * the parent navigators also needs to be focused.\n */\nexport default function useOnRouteFocus<Action extends NavigationAction>({\n router,\n getState,\n key: sourceRouteKey,\n setState,\n}: Options<Action>) {\n const { onRouteFocus: onRouteFocusParent } = React.useContext(\n NavigationBuilderContext\n );\n\n return React.useCallback(\n (key: string) => {\n const state = getState();\n const result = router.getStateForRouteFocus(state, key);\n\n if (result !== state) {\n setState(result);\n }\n\n if (onRouteFocusParent !== undefined && sourceRouteKey !== undefined) {\n onRouteFocusParent(sourceRouteKey);\n }\n },\n [getState, onRouteFocusParent, router, setState, sourceRouteKey]\n );\n}\n"]}
@@ -1,11 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import NavigationBuilderContext from './NavigationBuilderContext';
3
3
  import NavigationStateContext from './NavigationStateContext';
4
- export default function useOptionsGetters({
5
- key,
6
- options,
7
- navigation
8
- }) {
4
+ export default function useOptionsGetters(_ref) {
5
+ let {
6
+ key,
7
+ options,
8
+ navigation
9
+ } = _ref;
9
10
  const optionsRef = React.useRef(options);
10
11
  const optionsGettersFromChildRef = React.useRef({});
11
12
  const {
@@ -1 +1 @@
1
- {"version":3,"sources":["useOptionsGetters.tsx"],"names":["React","NavigationBuilderContext","NavigationStateContext","useOptionsGetters","key","options","navigation","optionsRef","useRef","optionsGettersFromChildRef","onOptionsChange","useContext","addOptionsGetter","parentAddOptionsGetter","optionsChangeListener","useCallback","isFocused","hasChildren","Object","keys","current","length","useEffect","addListener","getOptionsFromListener","hasOwnProperty","result","getCurrentOptions","optionsFromListener","getter"],"mappings":"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","sourcesContent":["import type { ParamListBase } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext from './NavigationBuilderContext';\nimport NavigationStateContext from './NavigationStateContext';\nimport type { NavigationProp } from './types';\n\ntype Options = {\n key?: string;\n navigation?: NavigationProp<ParamListBase>;\n options?: object | undefined;\n};\n\nexport default function useOptionsGetters({\n key,\n options,\n navigation,\n}: Options) {\n const optionsRef = React.useRef<object | undefined>(options);\n const optionsGettersFromChildRef = React.useRef<\n Record<string, () => object | undefined | null>\n >({});\n\n const { onOptionsChange } = React.useContext(NavigationBuilderContext);\n const { addOptionsGetter: parentAddOptionsGetter } = React.useContext(\n NavigationStateContext\n );\n\n const optionsChangeListener = React.useCallback(() => {\n const isFocused = navigation?.isFocused() ?? true;\n const hasChildren = Object.keys(optionsGettersFromChildRef.current).length;\n\n if (isFocused && !hasChildren) {\n onOptionsChange(optionsRef.current ?? {});\n }\n }, [navigation, onOptionsChange]);\n\n React.useEffect(() => {\n optionsRef.current = options;\n optionsChangeListener();\n\n return navigation?.addListener('focus', optionsChangeListener);\n }, [navigation, options, optionsChangeListener]);\n\n const getOptionsFromListener = React.useCallback(() => {\n for (let key in optionsGettersFromChildRef.current) {\n if (optionsGettersFromChildRef.current.hasOwnProperty(key)) {\n const result = optionsGettersFromChildRef.current[key]?.();\n\n // null means unfocused route\n if (result !== null) {\n return result;\n }\n }\n }\n\n return null;\n }, []);\n\n const getCurrentOptions = React.useCallback(() => {\n const isFocused = navigation?.isFocused() ?? true;\n\n if (!isFocused) {\n return null;\n }\n\n const optionsFromListener = getOptionsFromListener();\n\n if (optionsFromListener !== null) {\n return optionsFromListener;\n }\n\n return optionsRef.current;\n }, [navigation, getOptionsFromListener]);\n\n React.useEffect(() => {\n return parentAddOptionsGetter?.(key!, getCurrentOptions);\n }, [getCurrentOptions, parentAddOptionsGetter, key]);\n\n const addOptionsGetter = React.useCallback(\n (key: string, getter: () => object | undefined | null) => {\n optionsGettersFromChildRef.current[key] = getter;\n optionsChangeListener();\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete optionsGettersFromChildRef.current[key];\n optionsChangeListener();\n };\n },\n [optionsChangeListener]\n );\n\n return {\n addOptionsGetter,\n getCurrentOptions,\n };\n}\n"]}
1
+ {"version":3,"sources":["useOptionsGetters.tsx"],"names":["React","NavigationBuilderContext","NavigationStateContext","useOptionsGetters","key","options","navigation","optionsRef","useRef","optionsGettersFromChildRef","onOptionsChange","useContext","addOptionsGetter","parentAddOptionsGetter","optionsChangeListener","useCallback","isFocused","hasChildren","Object","keys","current","length","useEffect","addListener","getOptionsFromListener","hasOwnProperty","result","getCurrentOptions","optionsFromListener","getter"],"mappings":"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","sourcesContent":["import type { ParamListBase } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext from './NavigationBuilderContext';\nimport NavigationStateContext from './NavigationStateContext';\nimport type { NavigationProp } from './types';\n\ntype Options = {\n key?: string;\n navigation?: NavigationProp<ParamListBase>;\n options?: object | undefined;\n};\n\nexport default function useOptionsGetters({\n key,\n options,\n navigation,\n}: Options) {\n const optionsRef = React.useRef<object | undefined>(options);\n const optionsGettersFromChildRef = React.useRef<\n Record<string, () => object | undefined | null>\n >({});\n\n const { onOptionsChange } = React.useContext(NavigationBuilderContext);\n const { addOptionsGetter: parentAddOptionsGetter } = React.useContext(\n NavigationStateContext\n );\n\n const optionsChangeListener = React.useCallback(() => {\n const isFocused = navigation?.isFocused() ?? true;\n const hasChildren = Object.keys(optionsGettersFromChildRef.current).length;\n\n if (isFocused && !hasChildren) {\n onOptionsChange(optionsRef.current ?? {});\n }\n }, [navigation, onOptionsChange]);\n\n React.useEffect(() => {\n optionsRef.current = options;\n optionsChangeListener();\n\n return navigation?.addListener('focus', optionsChangeListener);\n }, [navigation, options, optionsChangeListener]);\n\n const getOptionsFromListener = React.useCallback(() => {\n for (let key in optionsGettersFromChildRef.current) {\n if (optionsGettersFromChildRef.current.hasOwnProperty(key)) {\n const result = optionsGettersFromChildRef.current[key]?.();\n\n // null means unfocused route\n if (result !== null) {\n return result;\n }\n }\n }\n\n return null;\n }, []);\n\n const getCurrentOptions = React.useCallback(() => {\n const isFocused = navigation?.isFocused() ?? true;\n\n if (!isFocused) {\n return null;\n }\n\n const optionsFromListener = getOptionsFromListener();\n\n if (optionsFromListener !== null) {\n return optionsFromListener;\n }\n\n return optionsRef.current;\n }, [navigation, getOptionsFromListener]);\n\n React.useEffect(() => {\n return parentAddOptionsGetter?.(key!, getCurrentOptions);\n }, [getCurrentOptions, parentAddOptionsGetter, key]);\n\n const addOptionsGetter = React.useCallback(\n (key: string, getter: () => object | undefined | null) => {\n optionsGettersFromChildRef.current[key] = getter;\n optionsChangeListener();\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete optionsGettersFromChildRef.current[key];\n optionsChangeListener();\n };\n },\n [optionsChangeListener]\n );\n\n return {\n addOptionsGetter,\n getCurrentOptions,\n };\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  const formatToList = items => items.map(key => `- ${key}`).join('\n');
2
2
 
3
- export default function validatePathConfig(config, root = true) {
3
+ export default function validatePathConfig(config) {
4
+ let root = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
4
5
  const validKeys = ['initialRouteName', 'screens'];
5
6
 
6
7
  if (!root) {
@@ -14,7 +15,9 @@ export default function validatePathConfig(config, root = true) {
14
15
  }
15
16
 
16
17
  if (config.screens) {
17
- Object.entries(config.screens).forEach(([_, value]) => {
18
+ Object.entries(config.screens).forEach(_ref => {
19
+ let [_, value] = _ref;
20
+
18
21
  if (typeof value !== 'string') {
19
22
  validatePathConfig(value, false);
20
23
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["validatePathConfig.tsx"],"names":["formatToList","items","map","key","join","validatePathConfig","config","root","validKeys","push","invalidKeys","Object","keys","filter","includes","length","Error","screens","entries","forEach","_","value"],"mappings":"AAAA,MAAMA,YAAY,GAAIC,KAAD,IACnBA,KAAK,CAACC,GAAN,CAAWC,GAAD,IAAU,KAAIA,GAAI,EAA5B,EAA+BC,IAA/B,CAAoC,IAApC,CADF;;AAGA,eAAe,SAASC,kBAAT,CAA4BC,MAA5B,EAAyCC,IAAI,GAAG,IAAhD,EAAsD;AACnE,QAAMC,SAAS,GAAG,CAAC,kBAAD,EAAqB,SAArB,CAAlB;;AAEA,MAAI,CAACD,IAAL,EAAW;AACTC,IAAAA,SAAS,CAACC,IAAV,CAAe,MAAf,EAAuB,OAAvB,EAAgC,WAAhC,EAA6C,OAA7C;AACD;;AAED,QAAMC,WAAW,GAAGC,MAAM,CAACC,IAAP,CAAYN,MAAZ,EAAoBO,MAApB,CACjBV,GAAD,IAAS,CAACK,SAAS,CAACM,QAAV,CAAmBX,GAAnB,CADQ,CAApB;;AAIA,MAAIO,WAAW,CAACK,MAAhB,EAAwB;AACtB,UAAM,IAAIC,KAAJ,CACH,mDAAkDhB,YAAY,CAC7DU,WAD6D,CAE7D,qHAAoHV,YAAY,CAChIQ,SADgI,CAEhI,wHALE,CAAN;AAOD;;AAED,MAAIF,MAAM,CAACW,OAAX,EAAoB;AAClBN,IAAAA,MAAM,CAACO,OAAP,CAAeZ,MAAM,CAACW,OAAtB,EAA+BE,OAA/B,CAAuC,CAAC,CAACC,CAAD,EAAIC,KAAJ,CAAD,KAAgB;AACrD,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC7BhB,QAAAA,kBAAkB,CAACgB,KAAD,EAAQ,KAAR,CAAlB;AACD;AACF,KAJD;AAKD;AACF","sourcesContent":["const formatToList = (items: string[]) =>\n items.map((key) => `- ${key}`).join('\\n');\n\nexport default function validatePathConfig(config: any, root = true) {\n const validKeys = ['initialRouteName', 'screens'];\n\n if (!root) {\n validKeys.push('path', 'exact', 'stringify', 'parse');\n }\n\n const invalidKeys = Object.keys(config).filter(\n (key) => !validKeys.includes(key)\n );\n\n if (invalidKeys.length) {\n throw new Error(\n `Found invalid properties in the configuration:\\n${formatToList(\n invalidKeys\n )}\\n\\nDid you forget to specify them under a 'screens' property?\\n\\nYou can only specify the following properties:\\n${formatToList(\n validKeys\n )}\\n\\nSee https://reactnavigation.org/docs/configuring-links for more details on how to specify a linking configuration.`\n );\n }\n\n if (config.screens) {\n Object.entries(config.screens).forEach(([_, value]) => {\n if (typeof value !== 'string') {\n validatePathConfig(value, false);\n }\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["validatePathConfig.tsx"],"names":["formatToList","items","map","key","join","validatePathConfig","config","root","validKeys","push","invalidKeys","Object","keys","filter","includes","length","Error","screens","entries","forEach","_","value"],"mappings":"AAAA,MAAMA,YAAY,GAAIC,KAAD,IACnBA,KAAK,CAACC,GAAN,CAAWC,GAAD,IAAU,KAAIA,GAAI,EAA5B,EAA+BC,IAA/B,CAAoC,IAApC,CADF;;AAGA,eAAe,SAASC,kBAAT,CAA4BC,MAA5B,EAAsD;AAAA,MAAbC,IAAa,uEAAN,IAAM;AACnE,QAAMC,SAAS,GAAG,CAAC,kBAAD,EAAqB,SAArB,CAAlB;;AAEA,MAAI,CAACD,IAAL,EAAW;AACTC,IAAAA,SAAS,CAACC,IAAV,CAAe,MAAf,EAAuB,OAAvB,EAAgC,WAAhC,EAA6C,OAA7C;AACD;;AAED,QAAMC,WAAW,GAAGC,MAAM,CAACC,IAAP,CAAYN,MAAZ,EAAoBO,MAApB,CACjBV,GAAD,IAAS,CAACK,SAAS,CAACM,QAAV,CAAmBX,GAAnB,CADQ,CAApB;;AAIA,MAAIO,WAAW,CAACK,MAAhB,EAAwB;AACtB,UAAM,IAAIC,KAAJ,CACH,mDAAkDhB,YAAY,CAC7DU,WAD6D,CAE7D,qHAAoHV,YAAY,CAChIQ,SADgI,CAEhI,wHALE,CAAN;AAOD;;AAED,MAAIF,MAAM,CAACW,OAAX,EAAoB;AAClBN,IAAAA,MAAM,CAACO,OAAP,CAAeZ,MAAM,CAACW,OAAtB,EAA+BE,OAA/B,CAAuC,QAAgB;AAAA,UAAf,CAACC,CAAD,EAAIC,KAAJ,CAAe;;AACrD,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC7BhB,QAAAA,kBAAkB,CAACgB,KAAD,EAAQ,KAAR,CAAlB;AACD;AACF,KAJD;AAKD;AACF","sourcesContent":["const formatToList = (items: string[]) =>\n items.map((key) => `- ${key}`).join('\\n');\n\nexport default function validatePathConfig(config: any, root = true) {\n const validKeys = ['initialRouteName', 'screens'];\n\n if (!root) {\n validKeys.push('path', 'exact', 'stringify', 'parse');\n }\n\n const invalidKeys = Object.keys(config).filter(\n (key) => !validKeys.includes(key)\n );\n\n if (invalidKeys.length) {\n throw new Error(\n `Found invalid properties in the configuration:\\n${formatToList(\n invalidKeys\n )}\\n\\nDid you forget to specify them under a 'screens' property?\\n\\nYou can only specify the following properties:\\n${formatToList(\n validKeys\n )}\\n\\nSee https://reactnavigation.org/docs/configuring-links for more details on how to specify a linking configuration.`\n );\n }\n\n if (config.screens) {\n Object.entries(config.screens).forEach(([_, value]) => {\n if (typeof value !== 'string') {\n validatePathConfig(value, false);\n }\n });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@react-navigation/core",
3
3
  "description": "Core utilities for building navigators",
4
- "version": "6.1.0",
4
+ "version": "6.1.1",
5
5
  "keywords": [
6
6
  "react",
7
7
  "react-native",
@@ -47,9 +47,9 @@
47
47
  "@types/react-is": "^17.0.0",
48
48
  "del-cli": "^3.0.1",
49
49
  "immer": "^9.0.2",
50
- "react": "~16.13.1",
50
+ "react": "17.0.1",
51
51
  "react-native-builder-bob": "^0.18.1",
52
- "react-test-renderer": "~16.13.1",
52
+ "react-test-renderer": "17.0.1",
53
53
  "typescript": "^4.3.2"
54
54
  },
55
55
  "peerDependencies": {
@@ -69,5 +69,5 @@
69
69
  ]
70
70
  ]
71
71
  },
72
- "gitHead": "e77a5ab9d342a03cd8e20b54938700dfd4e23f42"
72
+ "gitHead": "4c5805867ce946d99ba17f71b4d6086bb8751262"
73
73
  }
@@ -4,7 +4,8 @@ import * as React from 'react';
4
4
  * Context which holds the values for the current navigation tree.
5
5
  * Intended for use in SSR. This is not safe to use on the client.
6
6
  */
7
- const CurrentRenderContext =
8
- React.createContext<{ options?: object } | undefined>(undefined);
7
+ const CurrentRenderContext = React.createContext<
8
+ { options?: object } | undefined
9
+ >(undefined);
9
10
 
10
11
  export default CurrentRenderContext;
@@ -6,14 +6,13 @@ type Props = {
6
6
 
7
7
  const MULTIPLE_NAVIGATOR_ERROR = `Another navigator is already registered for this container. You likely have multiple navigators under a single "NavigationContainer" or "Screen". Make sure each navigator is under a separate "Screen" container. See https://reactnavigation.org/docs/nesting-navigators for a guide on nesting.`;
8
8
 
9
- export const SingleNavigatorContext =
10
- React.createContext<
11
- | {
12
- register(key: string): void;
13
- unregister(key: string): void;
14
- }
15
- | undefined
16
- >(undefined);
9
+ export const SingleNavigatorContext = React.createContext<
10
+ | {
11
+ register(key: string): void;
12
+ unregister(key: string): void;
13
+ }
14
+ | undefined
15
+ >(undefined);
17
16
 
18
17
  /**
19
18
  * Component which ensures that there's only one navigator nested under it.
@@ -6,9 +6,8 @@ import type { NavigationContainerRef } from './types';
6
6
  /**
7
7
  * Context which holds the route prop for a screen.
8
8
  */
9
- const NavigationContainerRefContext =
10
- React.createContext<NavigationContainerRef<ParamListBase> | undefined>(
11
- undefined
12
- );
9
+ const NavigationContainerRefContext = React.createContext<
10
+ NavigationContainerRef<ParamListBase> | undefined
11
+ >(undefined);
13
12
 
14
13
  export default NavigationContainerRefContext;
@@ -6,7 +6,8 @@ import type { NavigationProp } from './types';
6
6
  /**
7
7
  * Context which holds the navigation prop for a screen.
8
8
  */
9
- const NavigationContext =
10
- React.createContext<NavigationProp<ParamListBase> | undefined>(undefined);
9
+ const NavigationContext = React.createContext<
10
+ NavigationProp<ParamListBase> | undefined
11
+ >(undefined);
11
12
 
12
13
  export default NavigationContext;
@@ -7,7 +7,8 @@ import type { NavigationHelpers } from './types';
7
7
  * Context which holds the navigation helpers of the parent navigator.
8
8
  * Navigators should use this context in their view component.
9
9
  */
10
- const NavigationHelpersContext =
11
- React.createContext<NavigationHelpers<ParamListBase> | undefined>(undefined);
10
+ const NavigationHelpersContext = React.createContext<
11
+ NavigationHelpers<ParamListBase> | undefined
12
+ >(undefined);
12
13
 
13
14
  export default NavigationHelpersContext;
@@ -4,7 +4,8 @@ import * as React from 'react';
4
4
  /**
5
5
  * Context which holds the route prop for a screen.
6
6
  */
7
- const NavigationRouteContext =
8
- React.createContext<Route<string> | undefined>(undefined);
7
+ const NavigationRouteContext = React.createContext<Route<string> | undefined>(
8
+ undefined
9
+ );
9
10
 
10
11
  export default NavigationRouteContext;
@@ -1,9 +1,8 @@
1
1
  import type { NavigationAction } from '@react-navigation/routers';
2
2
  import * as React from 'react';
3
3
 
4
- const UnhandledActionContext =
5
- React.createContext<((action: NavigationAction) => void) | undefined>(
6
- undefined
7
- );
4
+ const UnhandledActionContext = React.createContext<
5
+ ((action: NavigationAction) => void) | undefined
6
+ >(undefined);
8
7
 
9
8
  export default UnhandledActionContext;
@@ -33,7 +33,9 @@ export default function createNavigationContainerRef<
33
33
  event: string,
34
34
  callback: (...args: any[]) => void
35
35
  ) => {
36
- listeners[event] = listeners[event]?.filter((cb) => cb !== callback);
36
+ if (listeners[event]) {
37
+ listeners[event] = listeners[event].filter((cb) => cb !== callback);
38
+ }
37
39
  };
38
40
 
39
41
  let current: NavigationContainerRef<ParamList> | null = null;
package/src/types.tsx CHANGED
@@ -393,12 +393,12 @@ export type Descriptor<
393
393
  export type ScreenListeners<
394
394
  State extends NavigationState,
395
395
  EventMap extends EventMapBase
396
- > = Partial<
397
- {
398
- [EventName in keyof (EventMap &
399
- EventMapCore<State>)]: EventListenerCallback<EventMap, EventName>;
400
- }
401
- >;
396
+ > = Partial<{
397
+ [EventName in keyof (EventMap & EventMapCore<State>)]: EventListenerCallback<
398
+ EventMap,
399
+ EventName
400
+ >;
401
+ }>;
402
402
 
403
403
  export type RouteConfigComponent<
404
404
  ParamList extends ParamListBase,
@@ -6,11 +6,9 @@ import type { ListenerMap } from './NavigationBuilderContext';
6
6
  * Hook which lets child navigators add action listeners.
7
7
  */
8
8
  export default function useChildListeners() {
9
- const { current: listeners } = React.useRef<
10
- {
11
- [K in keyof ListenerMap]: ListenerMap[K][];
12
- }
13
- >({
9
+ const { current: listeners } = React.useRef<{
10
+ [K in keyof ListenerMap]: ListenerMap[K][];
11
+ }>({
14
12
  action: [],
15
13
  focus: [],
16
14
  });
@@ -6,14 +6,12 @@ import type { KeyedListenerMap } from './NavigationBuilderContext';
6
6
  * Hook which lets child navigators add getters to be called for obtaining rehydrated state.
7
7
  */
8
8
  export default function useKeyedChildListeners() {
9
- const { current: keyedListeners } = React.useRef<
10
- {
11
- [K in keyof KeyedListenerMap]: Record<
12
- string,
13
- KeyedListenerMap[K] | undefined
14
- >;
15
- }
16
- >({
9
+ const { current: keyedListeners } = React.useRef<{
10
+ [K in keyof KeyedListenerMap]: Record<
11
+ string,
12
+ KeyedListenerMap[K] | undefined
13
+ >;
14
+ }>({
17
15
  getState: {},
18
16
  beforeRemove: {},
19
17
  });
@@ -199,13 +199,19 @@ const getRouteConfigsFromChildren = <
199
199
  );
200
200
  }
201
201
 
202
- if (typeof component === 'function' && component.name === 'component') {
203
- // Inline anonymous functions passed in the `component` prop will have the name of the prop
204
- // It's relatively safe to assume that it's not a component since it should also have PascalCase name
205
- // We won't catch all scenarios here, but this should catch a good chunk of incorrect use.
206
- console.warn(
207
- `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.`
208
- );
202
+ if (typeof component === 'function') {
203
+ if (component.name === 'component') {
204
+ // Inline anonymous functions passed in the `component` prop will have the name of the prop
205
+ // It's relatively safe to assume that it's not a component since it should also have PascalCase name
206
+ // We won't catch all scenarios here, but this should catch a good chunk of incorrect use.
207
+ console.warn(
208
+ `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.`
209
+ );
210
+ } else if (/^[a-z]/.test(component.name)) {
211
+ console.warn(
212
+ `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.`
213
+ );
214
+ }
209
215
  }
210
216
  } else {
211
217
  throw new Error(
@@ -260,8 +266,11 @@ export default function useNavigationBuilder<
260
266
  })
261
267
  );
262
268
 
263
- const routeConfigs =
264
- getRouteConfigsFromChildren<State, ScreenOptions, EventMap>(children);
269
+ const routeConfigs = getRouteConfigsFromChildren<
270
+ State,
271
+ ScreenOptions,
272
+ EventMap
273
+ >(children);
265
274
 
266
275
  const screens = routeConfigs.reduce<
267
276
  Record<string, ScreenConfigWithParent<State, ScreenOptions, EventMap>>