@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
@@ -1 +1 @@
1
- {"version":3,"sources":["useNavigationCache.tsx"],"names":["CommonActions","React","NavigationBuilderContext","useNavigationCache","state","getState","navigation","setOptions","router","emitter","stackRef","useContext","cache","useMemo","current","actions","actionCreators","routes","reduce","acc","route","previous","key","emit","rest","dispatch","thunk","action","source","withStack","callback","isStackSet","process","env","NODE_ENV","Error","stack","undefined","helpers","Object","keys","name","args","create","options","o","isFocused","index"],"mappings":"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","sourcesContent":["import {\n CommonActions,\n NavigationAction,\n NavigationState,\n ParamListBase,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext from './NavigationBuilderContext';\nimport type { NavigationHelpers, NavigationProp } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\ntype Options<\n State extends NavigationState,\n EventMap extends Record<string, any>\n> = {\n state: State;\n getState: () => State;\n navigation: NavigationHelpers<ParamListBase> &\n Partial<NavigationProp<ParamListBase, string, any, any, any>>;\n setOptions: (\n cb: (options: Record<string, object>) => Record<string, object>\n ) => void;\n router: Router<State, NavigationAction>;\n emitter: NavigationEventEmitter<EventMap>;\n};\n\ntype NavigationCache<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends Record<string, any>\n> = Record<\n string,\n NavigationProp<ParamListBase, string, State, ScreenOptions, EventMap>\n>;\n\n/**\n * Hook to cache navigation objects for each screen in the navigator.\n * It's important to cache them to make sure navigation objects don't change between renders.\n * This lets us apply optimizations like `React.memo` to minimize re-rendering screens.\n */\nexport default function useNavigationCache<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends Record<string, any>\n>({\n state,\n getState,\n navigation,\n setOptions,\n router,\n emitter,\n}: Options<State, EventMap>) {\n const { stackRef } = React.useContext(NavigationBuilderContext);\n\n // Cache object which holds navigation objects for each screen\n // We use `React.useMemo` instead of `React.useRef` coz we want to invalidate it when deps change\n // In reality, these deps will rarely change, if ever\n const cache = React.useMemo(\n () => ({ current: {} as NavigationCache<State, ScreenOptions, EventMap> }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getState, navigation, setOptions, router, emitter]\n );\n\n const actions = {\n ...router.actionCreators,\n ...CommonActions,\n };\n\n cache.current = state.routes.reduce<\n NavigationCache<State, ScreenOptions, EventMap>\n >((acc, route) => {\n const previous = cache.current[route.key];\n\n type Thunk =\n | NavigationAction\n | ((state: State) => NavigationAction | null | undefined);\n\n if (previous) {\n // If a cached navigation object already exists, reuse it\n acc[route.key] = previous;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { emit, ...rest } = navigation;\n\n const dispatch = (thunk: Thunk) => {\n const action = typeof thunk === 'function' ? thunk(getState()) : thunk;\n\n if (action != null) {\n navigation.dispatch({ source: route.key, ...action });\n }\n };\n\n const withStack = (callback: () => void) => {\n let isStackSet = false;\n\n try {\n if (\n process.env.NODE_ENV !== 'production' &&\n stackRef &&\n !stackRef.current\n ) {\n // Capture the stack trace for devtools\n stackRef.current = new Error().stack;\n isStackSet = true;\n }\n\n callback();\n } finally {\n if (isStackSet && stackRef) {\n stackRef.current = undefined;\n }\n }\n };\n\n const helpers = Object.keys(actions).reduce<Record<string, () => void>>(\n (acc, name) => {\n acc[name] = (...args: any) =>\n withStack(() =>\n // @ts-expect-error: name is a valid key, but TypeScript is dumb\n dispatch(actions[name](...args))\n );\n\n return acc;\n },\n {}\n );\n\n acc[route.key] = {\n ...rest,\n ...helpers,\n // FIXME: too much work to fix the types for now\n ...(emitter.create(route.key) as any),\n dispatch: (thunk: Thunk) => withStack(() => dispatch(thunk)),\n setOptions: (options: object) =>\n setOptions((o) => ({\n ...o,\n [route.key]: { ...o[route.key], ...options },\n })),\n isFocused: () => {\n const state = getState();\n\n if (state.routes[state.index].key !== route.key) {\n return false;\n }\n\n // If the current screen is focused, we also need to check if parent navigator is focused\n // This makes sure that we return the focus state in the whole tree, not just this navigator\n return navigation ? navigation.isFocused() : true;\n },\n };\n }\n\n return acc;\n }, {});\n\n return cache.current;\n}\n"]}
1
+ {"version":3,"sources":["useNavigationCache.tsx"],"names":["CommonActions","React","NavigationBuilderContext","useNavigationCache","state","getState","navigation","setOptions","router","emitter","stackRef","useContext","cache","useMemo","current","actions","actionCreators","routes","reduce","acc","route","previous","key","emit","rest","dispatch","thunk","action","source","withStack","callback","isStackSet","process","env","NODE_ENV","Error","stack","undefined","helpers","Object","keys","name","args","create","options","o","isFocused","index"],"mappings":"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","sourcesContent":["import {\n CommonActions,\n NavigationAction,\n NavigationState,\n ParamListBase,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationBuilderContext from './NavigationBuilderContext';\nimport type { NavigationHelpers, NavigationProp } from './types';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\ntype Options<\n State extends NavigationState,\n EventMap extends Record<string, any>\n> = {\n state: State;\n getState: () => State;\n navigation: NavigationHelpers<ParamListBase> &\n Partial<NavigationProp<ParamListBase, string, any, any, any>>;\n setOptions: (\n cb: (options: Record<string, object>) => Record<string, object>\n ) => void;\n router: Router<State, NavigationAction>;\n emitter: NavigationEventEmitter<EventMap>;\n};\n\ntype NavigationCache<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends Record<string, any>\n> = Record<\n string,\n NavigationProp<ParamListBase, string, State, ScreenOptions, EventMap>\n>;\n\n/**\n * Hook to cache navigation objects for each screen in the navigator.\n * It's important to cache them to make sure navigation objects don't change between renders.\n * This lets us apply optimizations like `React.memo` to minimize re-rendering screens.\n */\nexport default function useNavigationCache<\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends Record<string, any>\n>({\n state,\n getState,\n navigation,\n setOptions,\n router,\n emitter,\n}: Options<State, EventMap>) {\n const { stackRef } = React.useContext(NavigationBuilderContext);\n\n // Cache object which holds navigation objects for each screen\n // We use `React.useMemo` instead of `React.useRef` coz we want to invalidate it when deps change\n // In reality, these deps will rarely change, if ever\n const cache = React.useMemo(\n () => ({ current: {} as NavigationCache<State, ScreenOptions, EventMap> }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getState, navigation, setOptions, router, emitter]\n );\n\n const actions = {\n ...router.actionCreators,\n ...CommonActions,\n };\n\n cache.current = state.routes.reduce<\n NavigationCache<State, ScreenOptions, EventMap>\n >((acc, route) => {\n const previous = cache.current[route.key];\n\n type Thunk =\n | NavigationAction\n | ((state: State) => NavigationAction | null | undefined);\n\n if (previous) {\n // If a cached navigation object already exists, reuse it\n acc[route.key] = previous;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { emit, ...rest } = navigation;\n\n const dispatch = (thunk: Thunk) => {\n const action = typeof thunk === 'function' ? thunk(getState()) : thunk;\n\n if (action != null) {\n navigation.dispatch({ source: route.key, ...action });\n }\n };\n\n const withStack = (callback: () => void) => {\n let isStackSet = false;\n\n try {\n if (\n process.env.NODE_ENV !== 'production' &&\n stackRef &&\n !stackRef.current\n ) {\n // Capture the stack trace for devtools\n stackRef.current = new Error().stack;\n isStackSet = true;\n }\n\n callback();\n } finally {\n if (isStackSet && stackRef) {\n stackRef.current = undefined;\n }\n }\n };\n\n const helpers = Object.keys(actions).reduce<Record<string, () => void>>(\n (acc, name) => {\n acc[name] = (...args: any) =>\n withStack(() =>\n // @ts-expect-error: name is a valid key, but TypeScript is dumb\n dispatch(actions[name](...args))\n );\n\n return acc;\n },\n {}\n );\n\n acc[route.key] = {\n ...rest,\n ...helpers,\n // FIXME: too much work to fix the types for now\n ...(emitter.create(route.key) as any),\n dispatch: (thunk: Thunk) => withStack(() => dispatch(thunk)),\n setOptions: (options: object) =>\n setOptions((o) => ({\n ...o,\n [route.key]: { ...o[route.key], ...options },\n })),\n isFocused: () => {\n const state = getState();\n\n if (state.routes[state.index].key !== route.key) {\n return false;\n }\n\n // If the current screen is focused, we also need to check if parent navigator is focused\n // This makes sure that we return the focus state in the whole tree, not just this navigator\n return navigation ? navigation.isFocused() : true;\n },\n };\n }\n\n return acc;\n }, {});\n\n return cache.current;\n}\n"]}
@@ -11,12 +11,13 @@ PrivateValueStore;
11
11
  * Navigation object with helper methods to be used by a navigator.
12
12
  * This object includes methods for common actions as well as methods the parent screen's navigation object.
13
13
  */
14
- export default function useNavigationHelpers({
15
- onAction,
16
- getState,
17
- emitter,
18
- router
19
- }) {
14
+ export default function useNavigationHelpers(_ref) {
15
+ let {
16
+ onAction,
17
+ getState,
18
+ emitter,
19
+ router
20
+ } = _ref;
20
21
  const onUnhandledAction = React.useContext(UnhandledActionContext);
21
22
  const parentNavigationHelpers = React.useContext(NavigationContext);
22
23
  return React.useMemo(() => {
@@ -34,7 +35,9 @@ export default function useNavigationHelpers({
34
35
  };
35
36
  const helpers = Object.keys(actions).reduce((acc, name) => {
36
37
  // @ts-expect-error: name is a valid key, but TypeScript is dumb
37
- acc[name] = (...args) => dispatch(actions[name](...args));
38
+ acc[name] = function () {
39
+ return dispatch(actions[name](...arguments));
40
+ };
38
41
 
39
42
  return acc;
40
43
  }, {});
@@ -1 +1 @@
1
- {"version":3,"sources":["useNavigationHelpers.tsx"],"names":["CommonActions","React","NavigationContext","PrivateValueStore","UnhandledActionContext","useNavigationHelpers","onAction","getState","emitter","router","onUnhandledAction","useContext","parentNavigationHelpers","useMemo","dispatch","op","action","handled","actions","actionCreators","helpers","Object","keys","reduce","acc","name","args","emit","isFocused","canGoBack","state","getStateForAction","goBack","routeNames","routeParamList","routeGetIdList","getParent"],"mappings":"AAAA,SACEA,aADF,QAMO,2BANP;AAOA,OAAO,KAAKC,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,iBAAP,MAA8B,qBAA9B;AACA,SAA4CC,iBAA5C,QAAqE,SAArE;AACA,OAAOC,sBAAP,MAAmC,0BAAnC;AAGA;AACA;AACAD,iBAAiB;;AASjB;AACA;AACA;AACA;AACA,eAAe,SAASE,oBAAT,CAKb;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,QAAZ;AAAsBC,EAAAA,OAAtB;AAA+BC,EAAAA;AAA/B,CALa,EAKoD;AACjE,QAAMC,iBAAiB,GAAGT,KAAK,CAACU,UAAN,CAAiBP,sBAAjB,CAA1B;AACA,QAAMQ,uBAAuB,GAAGX,KAAK,CAACU,UAAN,CAAiBT,iBAAjB,CAAhC;AAEA,SAAOD,KAAK,CAACY,OAAN,CAAc,MAAM;AACzB,UAAMC,QAAQ,GAAIC,EAAD,IAA6C;AAC5D,YAAMC,MAAM,GAAG,OAAOD,EAAP,KAAc,UAAd,GAA2BA,EAAE,CAACR,QAAQ,EAAT,CAA7B,GAA4CQ,EAA3D;AAEA,YAAME,OAAO,GAAGX,QAAQ,CAACU,MAAD,CAAxB;;AAEA,UAAI,CAACC,OAAL,EAAc;AACZP,QAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAGM,MAAH,CAAjB;AACD;AACF,KARD;;AAUA,UAAME,OAAO,GAAG,EACd,GAAGT,MAAM,CAACU,cADI;AAEd,SAAGnB;AAFW,KAAhB;AAKA,UAAMoB,OAAO,GAAGC,MAAM,CAACC,IAAP,CAAYJ,OAAZ,EAAqBK,MAArB,CACd,CAACC,GAAD,EAAMC,IAAN,KAAe;AACb;AACAD,MAAAA,GAAG,CAACC,IAAD,CAAH,GAAY,CAAC,GAAGC,IAAJ,KAAkBZ,QAAQ,CAACI,OAAO,CAACO,IAAD,CAAP,CAAc,GAAGC,IAAjB,CAAD,CAAtC;;AACA,aAAOF,GAAP;AACD,KALa,EAMd,EANc,CAAhB;AASA,WAAO,EACL,GAAGZ,uBADE;AAEL,SAAGQ,OAFE;AAGLN,MAAAA,QAHK;AAILa,MAAAA,IAAI,EAAEnB,OAAO,CAACmB,IAJT;AAKLC,MAAAA,SAAS,EAAEhB,uBAAuB,GAC9BA,uBAAuB,CAACgB,SADM,GAE9B,MAAM,IAPL;AAQLC,MAAAA,SAAS,EAAE,MAAM;AACf,cAAMC,KAAK,GAAGvB,QAAQ,EAAtB;AAEA,eACEE,MAAM,CAACsB,iBAAP,CAAyBD,KAAzB,EAAgC9B,aAAa,CAACgC,MAAd,EAAhC,EAAkE;AAChEC,UAAAA,UAAU,EAAEH,KAAK,CAACG,UAD8C;AAEhEC,UAAAA,cAAc,EAAE,EAFgD;AAGhEC,UAAAA,cAAc,EAAE;AAHgD,SAAlE,MAIO,IAJP,KAKAvB,uBALA,aAKAA,uBALA,uBAKAA,uBAAuB,CAAEiB,SAAzB,EALA,KAMA,KAPF;AASD,OApBI;AAqBLO,MAAAA,SAAS,EAAE,MAAMxB,uBArBZ;AAsBLL,MAAAA;AAtBK,KAAP;AA0BD,GAnDM,EAmDJ,CACDC,OAAO,CAACmB,IADP,EAEDpB,QAFC,EAGDD,QAHC,EAIDI,iBAJC,EAKDE,uBALC,EAMDH,MANC,CAnDI,CAAP;AA2DD","sourcesContent":["import {\n CommonActions,\n NavigationAction,\n NavigationState,\n ParamListBase,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationContext from './NavigationContext';\nimport { NavigationHelpers, NavigationProp, PrivateValueStore } from './types';\nimport UnhandledActionContext from './UnhandledActionContext';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\n// This is to make TypeScript compiler happy\n// eslint-disable-next-line babel/no-unused-expressions\nPrivateValueStore;\n\ntype Options<State extends NavigationState, Action extends NavigationAction> = {\n onAction: (action: NavigationAction) => boolean;\n getState: () => State;\n emitter: NavigationEventEmitter<any>;\n router: Router<State, Action>;\n};\n\n/**\n * Navigation object with helper methods to be used by a navigator.\n * This object includes methods for common actions as well as methods the parent screen's navigation object.\n */\nexport default function useNavigationHelpers<\n State extends NavigationState,\n ActionHelpers extends Record<string, () => void>,\n Action extends NavigationAction,\n EventMap extends Record<string, any>\n>({ onAction, getState, emitter, router }: Options<State, Action>) {\n const onUnhandledAction = React.useContext(UnhandledActionContext);\n const parentNavigationHelpers = React.useContext(NavigationContext);\n\n return React.useMemo(() => {\n const dispatch = (op: Action | ((state: State) => Action)) => {\n const action = typeof op === 'function' ? op(getState()) : op;\n\n const handled = onAction(action);\n\n if (!handled) {\n onUnhandledAction?.(action);\n }\n };\n\n const actions = {\n ...router.actionCreators,\n ...CommonActions,\n };\n\n const helpers = Object.keys(actions).reduce<Record<string, () => void>>(\n (acc, name) => {\n // @ts-expect-error: name is a valid key, but TypeScript is dumb\n acc[name] = (...args: any) => dispatch(actions[name](...args));\n return acc;\n },\n {}\n );\n\n return {\n ...parentNavigationHelpers,\n ...helpers,\n dispatch,\n emit: emitter.emit,\n isFocused: parentNavigationHelpers\n ? parentNavigationHelpers.isFocused\n : () => true,\n canGoBack: () => {\n const state = getState();\n\n return (\n router.getStateForAction(state, CommonActions.goBack() as Action, {\n routeNames: state.routeNames,\n routeParamList: {},\n routeGetIdList: {},\n }) !== null ||\n parentNavigationHelpers?.canGoBack() ||\n false\n );\n },\n getParent: () => parentNavigationHelpers as any,\n getState,\n } as NavigationHelpers<ParamListBase, EventMap> &\n (NavigationProp<ParamListBase, string, any, any, any> | undefined) &\n ActionHelpers;\n }, [\n emitter.emit,\n getState,\n onAction,\n onUnhandledAction,\n parentNavigationHelpers,\n router,\n ]);\n}\n"]}
1
+ {"version":3,"sources":["useNavigationHelpers.tsx"],"names":["CommonActions","React","NavigationContext","PrivateValueStore","UnhandledActionContext","useNavigationHelpers","onAction","getState","emitter","router","onUnhandledAction","useContext","parentNavigationHelpers","useMemo","dispatch","op","action","handled","actions","actionCreators","helpers","Object","keys","reduce","acc","name","emit","isFocused","canGoBack","state","getStateForAction","goBack","routeNames","routeParamList","routeGetIdList","getParent"],"mappings":"AAAA,SACEA,aADF,QAMO,2BANP;AAOA,OAAO,KAAKC,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,iBAAP,MAA8B,qBAA9B;AACA,SAA4CC,iBAA5C,QAAqE,SAArE;AACA,OAAOC,sBAAP,MAAmC,0BAAnC;AAGA;AACA;AACAD,iBAAiB;;AASjB;AACA;AACA;AACA;AACA,eAAe,SAASE,oBAAT,OAKoD;AAAA,MAAjE;AAAEC,IAAAA,QAAF;AAAYC,IAAAA,QAAZ;AAAsBC,IAAAA,OAAtB;AAA+BC,IAAAA;AAA/B,GAAiE;AACjE,QAAMC,iBAAiB,GAAGT,KAAK,CAACU,UAAN,CAAiBP,sBAAjB,CAA1B;AACA,QAAMQ,uBAAuB,GAAGX,KAAK,CAACU,UAAN,CAAiBT,iBAAjB,CAAhC;AAEA,SAAOD,KAAK,CAACY,OAAN,CAAc,MAAM;AACzB,UAAMC,QAAQ,GAAIC,EAAD,IAA6C;AAC5D,YAAMC,MAAM,GAAG,OAAOD,EAAP,KAAc,UAAd,GAA2BA,EAAE,CAACR,QAAQ,EAAT,CAA7B,GAA4CQ,EAA3D;AAEA,YAAME,OAAO,GAAGX,QAAQ,CAACU,MAAD,CAAxB;;AAEA,UAAI,CAACC,OAAL,EAAc;AACZP,QAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAGM,MAAH,CAAjB;AACD;AACF,KARD;;AAUA,UAAME,OAAO,GAAG,EACd,GAAGT,MAAM,CAACU,cADI;AAEd,SAAGnB;AAFW,KAAhB;AAKA,UAAMoB,OAAO,GAAGC,MAAM,CAACC,IAAP,CAAYJ,OAAZ,EAAqBK,MAArB,CACd,CAACC,GAAD,EAAMC,IAAN,KAAe;AACb;AACAD,MAAAA,GAAG,CAACC,IAAD,CAAH,GAAY;AAAA,eAAkBX,QAAQ,CAACI,OAAO,CAACO,IAAD,CAAP,CAAc,YAAd,CAAD,CAA1B;AAAA,OAAZ;;AACA,aAAOD,GAAP;AACD,KALa,EAMd,EANc,CAAhB;AASA,WAAO,EACL,GAAGZ,uBADE;AAEL,SAAGQ,OAFE;AAGLN,MAAAA,QAHK;AAILY,MAAAA,IAAI,EAAElB,OAAO,CAACkB,IAJT;AAKLC,MAAAA,SAAS,EAAEf,uBAAuB,GAC9BA,uBAAuB,CAACe,SADM,GAE9B,MAAM,IAPL;AAQLC,MAAAA,SAAS,EAAE,MAAM;AACf,cAAMC,KAAK,GAAGtB,QAAQ,EAAtB;AAEA,eACEE,MAAM,CAACqB,iBAAP,CAAyBD,KAAzB,EAAgC7B,aAAa,CAAC+B,MAAd,EAAhC,EAAkE;AAChEC,UAAAA,UAAU,EAAEH,KAAK,CAACG,UAD8C;AAEhEC,UAAAA,cAAc,EAAE,EAFgD;AAGhEC,UAAAA,cAAc,EAAE;AAHgD,SAAlE,MAIO,IAJP,KAKAtB,uBALA,aAKAA,uBALA,uBAKAA,uBAAuB,CAAEgB,SAAzB,EALA,KAMA,KAPF;AASD,OApBI;AAqBLO,MAAAA,SAAS,EAAE,MAAMvB,uBArBZ;AAsBLL,MAAAA;AAtBK,KAAP;AA0BD,GAnDM,EAmDJ,CACDC,OAAO,CAACkB,IADP,EAEDnB,QAFC,EAGDD,QAHC,EAIDI,iBAJC,EAKDE,uBALC,EAMDH,MANC,CAnDI,CAAP;AA2DD","sourcesContent":["import {\n CommonActions,\n NavigationAction,\n NavigationState,\n ParamListBase,\n Router,\n} from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport NavigationContext from './NavigationContext';\nimport { NavigationHelpers, NavigationProp, PrivateValueStore } from './types';\nimport UnhandledActionContext from './UnhandledActionContext';\nimport type { NavigationEventEmitter } from './useEventEmitter';\n\n// This is to make TypeScript compiler happy\n// eslint-disable-next-line babel/no-unused-expressions\nPrivateValueStore;\n\ntype Options<State extends NavigationState, Action extends NavigationAction> = {\n onAction: (action: NavigationAction) => boolean;\n getState: () => State;\n emitter: NavigationEventEmitter<any>;\n router: Router<State, Action>;\n};\n\n/**\n * Navigation object with helper methods to be used by a navigator.\n * This object includes methods for common actions as well as methods the parent screen's navigation object.\n */\nexport default function useNavigationHelpers<\n State extends NavigationState,\n ActionHelpers extends Record<string, () => void>,\n Action extends NavigationAction,\n EventMap extends Record<string, any>\n>({ onAction, getState, emitter, router }: Options<State, Action>) {\n const onUnhandledAction = React.useContext(UnhandledActionContext);\n const parentNavigationHelpers = React.useContext(NavigationContext);\n\n return React.useMemo(() => {\n const dispatch = (op: Action | ((state: State) => Action)) => {\n const action = typeof op === 'function' ? op(getState()) : op;\n\n const handled = onAction(action);\n\n if (!handled) {\n onUnhandledAction?.(action);\n }\n };\n\n const actions = {\n ...router.actionCreators,\n ...CommonActions,\n };\n\n const helpers = Object.keys(actions).reduce<Record<string, () => void>>(\n (acc, name) => {\n // @ts-expect-error: name is a valid key, but TypeScript is dumb\n acc[name] = (...args: any) => dispatch(actions[name](...args));\n return acc;\n },\n {}\n );\n\n return {\n ...parentNavigationHelpers,\n ...helpers,\n dispatch,\n emit: emitter.emit,\n isFocused: parentNavigationHelpers\n ? parentNavigationHelpers.isFocused\n : () => true,\n canGoBack: () => {\n const state = getState();\n\n return (\n router.getStateForAction(state, CommonActions.goBack() as Action, {\n routeNames: state.routeNames,\n routeParamList: {},\n routeGetIdList: {},\n }) !== null ||\n parentNavigationHelpers?.canGoBack() ||\n false\n );\n },\n getParent: () => parentNavigationHelpers as any,\n getState,\n } as NavigationHelpers<ParamListBase, EventMap> &\n (NavigationProp<ParamListBase, string, any, any, any> | undefined) &\n ActionHelpers;\n }, [\n emitter.emit,\n getState,\n onAction,\n onUnhandledAction,\n parentNavigationHelpers,\n router,\n ]);\n}\n"]}
@@ -11,16 +11,17 @@ import useOnPreventRemove, { shouldPreventRemove } from './useOnPreventRemove';
11
11
  *
12
12
  * When the action handler handles as action, it returns `true`, otherwise `false`.
13
13
  */
14
- export default function useOnAction({
15
- router,
16
- getState,
17
- setState,
18
- key,
19
- actionListeners,
20
- beforeRemoveListeners,
21
- routerConfigOptions,
22
- emitter
23
- }) {
14
+ export default function useOnAction(_ref) {
15
+ let {
16
+ router,
17
+ getState,
18
+ setState,
19
+ key,
20
+ actionListeners,
21
+ beforeRemoveListeners,
22
+ routerConfigOptions,
23
+ emitter
24
+ } = _ref;
24
25
  const {
25
26
  onAction: onActionParent,
26
27
  onRouteFocus: onRouteFocusParent,
@@ -31,7 +32,8 @@ export default function useOnAction({
31
32
  React.useEffect(() => {
32
33
  routerConfigOptionsRef.current = routerConfigOptions;
33
34
  });
34
- const onAction = React.useCallback((action, visitedNavigators = new Set()) => {
35
+ const onAction = React.useCallback(function (action) {
36
+ let visitedNavigators = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set();
35
37
  const state = getState(); // Since actions can bubble both up and down, they could come to the same navigator again
36
38
  // We keep track of navigators which have already tried to handle the action and return if it's already visited
37
39
 
@@ -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":"AACA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,OAAOC,wBAAP,MAAqC,4BAArC;AACA,OAAOC,sBAAP,MAAmC,0BAAnC;AASA,eAAe,SAASC,iBAAT,OAIH;AAAA,MAJ8B;AACxCC,IAAAA,GADwC;AAExCC,IAAAA,OAFwC;AAGxCC,IAAAA;AAHwC,GAI9B;AACV,QAAMC,UAAU,GAAGP,KAAK,CAACQ,MAAN,CAAiCH,OAAjC,CAAnB;AACA,QAAMI,0BAA0B,GAAGT,KAAK,CAACQ,MAAN,CAEjC,EAFiC,CAAnC;AAIA,QAAM;AAAEE,IAAAA;AAAF,MAAsBV,KAAK,CAACW,UAAN,CAAiBV,wBAAjB,CAA5B;AACA,QAAM;AAAEW,IAAAA,gBAAgB,EAAEC;AAApB,MAA+Cb,KAAK,CAACW,UAAN,CACnDT,sBADmD,CAArD;AAIA,QAAMY,qBAAqB,GAAGd,KAAK,CAACe,WAAN,CAAkB,MAAM;AAAA;;AACpD,UAAMC,SAAS,4BAAGV,UAAH,aAAGA,UAAH,uBAAGA,UAAU,CAAEU,SAAZ,EAAH,yEAA8B,IAA7C;AACA,UAAMC,WAAW,GAAGC,MAAM,CAACC,IAAP,CAAYV,0BAA0B,CAACW,OAAvC,EAAgDC,MAApE;;AAEA,QAAIL,SAAS,IAAI,CAACC,WAAlB,EAA+B;AAAA;;AAC7BP,MAAAA,eAAe,wBAACH,UAAU,CAACa,OAAZ,qEAAuB,EAAvB,CAAf;AACD;AACF,GAP6B,EAO3B,CAACd,UAAD,EAAaI,eAAb,CAP2B,CAA9B;AASAV,EAAAA,KAAK,CAACsB,SAAN,CAAgB,MAAM;AACpBf,IAAAA,UAAU,CAACa,OAAX,GAAqBf,OAArB;AACAS,IAAAA,qBAAqB;AAErB,WAAOR,UAAP,aAAOA,UAAP,uBAAOA,UAAU,CAAEiB,WAAZ,CAAwB,OAAxB,EAAiCT,qBAAjC,CAAP;AACD,GALD,EAKG,CAACR,UAAD,EAAaD,OAAb,EAAsBS,qBAAtB,CALH;AAOA,QAAMU,sBAAsB,GAAGxB,KAAK,CAACe,WAAN,CAAkB,MAAM;AACrD,SAAK,IAAIX,GAAT,IAAgBK,0BAA0B,CAACW,OAA3C,EAAoD;AAClD,UAAIX,0BAA0B,CAACW,OAA3B,CAAmCK,cAAnC,CAAkDrB,GAAlD,CAAJ,EAA4D;AAAA;;AAC1D,cAAMsB,MAAM,4BAAG,0BAAAjB,0BAA0B,CAACW,OAA3B,EAAmChB,GAAnC,CAAH,0DAAG,kDAAf,CAD0D,CAG1D;;AACA,YAAIsB,MAAM,KAAK,IAAf,EAAqB;AACnB,iBAAOA,MAAP;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAb8B,EAa5B,EAb4B,CAA/B;AAeA,QAAMC,iBAAiB,GAAG3B,KAAK,CAACe,WAAN,CAAkB,MAAM;AAAA;;AAChD,UAAMC,SAAS,6BAAGV,UAAH,aAAGA,UAAH,uBAAGA,UAAU,CAAEU,SAAZ,EAAH,2EAA8B,IAA7C;;AAEA,QAAI,CAACA,SAAL,EAAgB;AACd,aAAO,IAAP;AACD;;AAED,UAAMY,mBAAmB,GAAGJ,sBAAsB,EAAlD;;AAEA,QAAII,mBAAmB,KAAK,IAA5B,EAAkC;AAChC,aAAOA,mBAAP;AACD;;AAED,WAAOrB,UAAU,CAACa,OAAlB;AACD,GAdyB,EAcvB,CAACd,UAAD,EAAakB,sBAAb,CAduB,CAA1B;AAgBAxB,EAAAA,KAAK,CAACsB,SAAN,CAAgB,MAAM;AACpB,WAAOT,sBAAP,aAAOA,sBAAP,uBAAOA,sBAAsB,CAAGT,GAAH,EAASuB,iBAAT,CAA7B;AACD,GAFD,EAEG,CAACA,iBAAD,EAAoBd,sBAApB,EAA4CT,GAA5C,CAFH;AAIA,QAAMQ,gBAAgB,GAAGZ,KAAK,CAACe,WAAN,CACvB,CAACX,GAAD,EAAcyB,MAAd,KAA0D;AACxDpB,IAAAA,0BAA0B,CAACW,OAA3B,CAAmChB,GAAnC,IAA0CyB,MAA1C;AACAf,IAAAA,qBAAqB;AAErB,WAAO,MAAM;AACX;AACA,aAAOL,0BAA0B,CAACW,OAA3B,CAAmChB,GAAnC,CAAP;AACAU,MAAAA,qBAAqB;AACtB,KAJD;AAKD,GAVsB,EAWvB,CAACA,qBAAD,CAXuB,CAAzB;AAcA,SAAO;AACLF,IAAAA,gBADK;AAELe,IAAAA;AAFK,GAAP;AAID","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"]}
@@ -11,7 +11,7 @@ export default function useRegisterNavigator() {
11
11
  const container = React.useContext(SingleNavigatorContext);
12
12
 
13
13
  if (container === undefined) {
14
- throw new Error("Couldn't register the navigator. Have you wrapped your app with 'NavigationContainer'?");
14
+ throw new Error("Couldn't register the navigator. Have you wrapped your app with 'NavigationContainer'?\n\nThis can also happen if there are multiple copies of '@react-navigation' packages installed.");
15
15
  }
16
16
 
17
17
  React.useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["useRegisterNavigator.tsx"],"names":["nanoid","React","SingleNavigatorContext","useRegisterNavigator","key","useState","container","useContext","undefined","Error","useEffect","register","unregister"],"mappings":"AAAA,SAASA,MAAT,QAAuB,mBAAvB;AACA,OAAO,KAAKC,KAAZ,MAAuB,OAAvB;AAEA,SAASC,sBAAT,QAAuC,yBAAvC;AAEA;AACA;AACA;AACA;;AACA,eAAe,SAASC,oBAAT,GAAgC;AAC7C,QAAM,CAACC,GAAD,IAAQH,KAAK,CAACI,QAAN,CAAe,MAAML,MAAM,EAA3B,CAAd;AACA,QAAMM,SAAS,GAAGL,KAAK,CAACM,UAAN,CAAiBL,sBAAjB,CAAlB;;AAEA,MAAII,SAAS,KAAKE,SAAlB,EAA6B;AAC3B,UAAM,IAAIC,KAAJ,CACJ,wFADI,CAAN;AAGD;;AAEDR,EAAAA,KAAK,CAACS,SAAN,CAAgB,MAAM;AACpB,UAAM;AAAEC,MAAAA,QAAF;AAAYC,MAAAA;AAAZ,QAA2BN,SAAjC;AAEAK,IAAAA,QAAQ,CAACP,GAAD,CAAR;AAEA,WAAO,MAAMQ,UAAU,CAACR,GAAD,CAAvB;AACD,GAND,EAMG,CAACE,SAAD,EAAYF,GAAZ,CANH;AAQA,SAAOA,GAAP;AACD","sourcesContent":["import { nanoid } from 'nanoid/non-secure';\nimport * as React from 'react';\n\nimport { SingleNavigatorContext } from './EnsureSingleNavigator';\n\n/**\n * Register a navigator in the parent context (either a navigation container or a screen).\n * This is used to prevent multiple navigators under a single container or screen.\n */\nexport default function useRegisterNavigator() {\n const [key] = React.useState(() => nanoid());\n const container = React.useContext(SingleNavigatorContext);\n\n if (container === undefined) {\n throw new Error(\n \"Couldn't register the navigator. Have you wrapped your app with 'NavigationContainer'?\"\n );\n }\n\n React.useEffect(() => {\n const { register, unregister } = container;\n\n register(key);\n\n return () => unregister(key);\n }, [container, key]);\n\n return key;\n}\n"]}
1
+ {"version":3,"sources":["useRegisterNavigator.tsx"],"names":["nanoid","React","SingleNavigatorContext","useRegisterNavigator","key","useState","container","useContext","undefined","Error","useEffect","register","unregister"],"mappings":"AAAA,SAASA,MAAT,QAAuB,mBAAvB;AACA,OAAO,KAAKC,KAAZ,MAAuB,OAAvB;AAEA,SAASC,sBAAT,QAAuC,yBAAvC;AAEA;AACA;AACA;AACA;;AACA,eAAe,SAASC,oBAAT,GAAgC;AAC7C,QAAM,CAACC,GAAD,IAAQH,KAAK,CAACI,QAAN,CAAe,MAAML,MAAM,EAA3B,CAAd;AACA,QAAMM,SAAS,GAAGL,KAAK,CAACM,UAAN,CAAiBL,sBAAjB,CAAlB;;AAEA,MAAII,SAAS,KAAKE,SAAlB,EAA6B;AAC3B,UAAM,IAAIC,KAAJ,CACJ,wLADI,CAAN;AAGD;;AAEDR,EAAAA,KAAK,CAACS,SAAN,CAAgB,MAAM;AACpB,UAAM;AAAEC,MAAAA,QAAF;AAAYC,MAAAA;AAAZ,QAA2BN,SAAjC;AAEAK,IAAAA,QAAQ,CAACP,GAAD,CAAR;AAEA,WAAO,MAAMQ,UAAU,CAACR,GAAD,CAAvB;AACD,GAND,EAMG,CAACE,SAAD,EAAYF,GAAZ,CANH;AAQA,SAAOA,GAAP;AACD","sourcesContent":["import { nanoid } from 'nanoid/non-secure';\nimport * as React from 'react';\n\nimport { SingleNavigatorContext } from './EnsureSingleNavigator';\n\n/**\n * Register a navigator in the parent context (either a navigation container or a screen).\n * This is used to prevent multiple navigators under a single container or screen.\n */\nexport default function useRegisterNavigator() {\n const [key] = React.useState(() => nanoid());\n const container = React.useContext(SingleNavigatorContext);\n\n if (container === undefined) {\n throw new Error(\n \"Couldn't register the navigator. Have you wrapped your app with 'NavigationContainer'?\\n\\nThis can also happen if there are multiple copies of '@react-navigation' packages installed.\"\n );\n }\n\n React.useEffect(() => {\n const { register, unregister } = container;\n\n register(key);\n\n return () => unregister(key);\n }, [container, key]);\n\n return key;\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"]}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Compare two records with primitive values as the content.
3
+ */
4
+ export default function isRecordEqual(a: Record<string, any>, b: Record<string, any>): boolean;
@@ -321,6 +321,12 @@ export declare type RouteConfigComponent<ParamList extends ParamListBase, RouteN
321
321
  getComponent?: never;
322
322
  };
323
323
  export declare type RouteConfig<ParamList extends ParamListBase, RouteName extends keyof ParamList, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase> = {
324
+ /**
325
+ * Optional key for this screen. This doesn't need to be unique.
326
+ * If the key changes, existing screens with this name will be removed or reset.
327
+ * Useful when we have some common screens and have conditional rendering.
328
+ */
329
+ navigationKey?: string;
324
330
  /**
325
331
  * Route name of this screen.
326
332
  */
@@ -354,6 +360,11 @@ export declare type RouteConfig<ParamList extends ParamListBase, RouteName exten
354
360
  initialParams?: Partial<ParamList[RouteName]>;
355
361
  } & RouteConfigComponent<ParamList, RouteName>;
356
362
  export declare type RouteGroupConfig<ParamList extends ParamListBase, ScreenOptions extends {}> = {
363
+ /**
364
+ * Optional key for the screens in this group.
365
+ * If the key changes, all existing screens in this group will be removed or reset.
366
+ */
367
+ navigationKey?: string;
357
368
  /**
358
369
  * Navigator options for this screen.
359
370
  */
@@ -2,10 +2,11 @@ import type { NavigationAction, NavigationState, ParamListBase, Router } from '@
2
2
  import { AddKeyedListener, AddListener } from './NavigationBuilderContext';
3
3
  import type { Descriptor, EventMapBase, NavigationHelpers, NavigationProp, RouteConfig, RouteProp } from './types';
4
4
  import type { NavigationEventEmitter } from './useEventEmitter';
5
- export declare type ScreenConfigWithParent<State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase> = [
6
- (ScreenOptionsOrCallback<ScreenOptions> | undefined)[] | undefined,
7
- RouteConfig<ParamListBase, string, State, ScreenOptions, EventMap>
8
- ];
5
+ export declare type ScreenConfigWithParent<State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase> = {
6
+ keys: (string | undefined)[];
7
+ options: (ScreenOptionsOrCallback<ScreenOptions> | undefined)[] | undefined;
8
+ props: RouteConfig<ParamListBase, string, State, ScreenOptions, EventMap>;
9
+ };
9
10
  declare type ScreenOptionsOrCallback<ScreenOptions extends {}> = ScreenOptions | ((props: {
10
11
  route: RouteProp<ParamListBase, string>;
11
12
  navigation: any;
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.0.1",
4
+ "version": "6.1.1",
5
5
  "keywords": [
6
6
  "react",
7
7
  "react-native",
@@ -35,7 +35,7 @@
35
35
  "clean": "del lib"
36
36
  },
37
37
  "dependencies": {
38
- "@react-navigation/routers": "^6.0.1",
38
+ "@react-navigation/routers": "^6.1.0",
39
39
  "escape-string-regexp": "^4.0.0",
40
40
  "nanoid": "^3.1.23",
41
41
  "query-string": "^7.0.0",
@@ -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": "e299167e105d8113c2e021846fe174e28b929354"
72
+ "gitHead": "4c5805867ce946d99ba17f71b4d6086bb8751262"
73
73
  }
@@ -192,12 +192,13 @@ const BaseNavigationContainer = React.forwardRef(
192
192
  return acc;
193
193
  }, {}),
194
194
  ...emitter.create('root'),
195
- resetRoot,
196
195
  dispatch,
196
+ resetRoot,
197
+ isFocused: () => true,
197
198
  canGoBack,
198
- getRootState,
199
- getState: () => stateRef.current,
200
199
  getParent: () => undefined,
200
+ getState: () => stateRef.current,
201
+ getRootState,
201
202
  getCurrentRoute,
202
203
  getCurrentOptions,
203
204
  isReady: () => listeners.focus[0] != null,
@@ -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;