@react-navigation/core 7.0.0-alpha.0 → 7.0.0-alpha.10

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 (486) hide show
  1. package/lib/commonjs/BaseNavigationContainer.js +57 -63
  2. package/lib/commonjs/BaseNavigationContainer.js.map +1 -1
  3. package/lib/commonjs/CurrentRenderContext.js +4 -6
  4. package/lib/commonjs/CurrentRenderContext.js.map +1 -1
  5. package/lib/commonjs/DeprecatedNavigationInChildContext.js +4 -6
  6. package/lib/commonjs/DeprecatedNavigationInChildContext.js.map +1 -1
  7. package/lib/commonjs/EnsureSingleNavigator.js +4 -5
  8. package/lib/commonjs/EnsureSingleNavigator.js.map +1 -1
  9. package/lib/commonjs/Group.js +1 -1
  10. package/lib/commonjs/Group.js.map +1 -1
  11. package/lib/commonjs/NavigationBuilderContext.js +4 -6
  12. package/lib/commonjs/NavigationBuilderContext.js.map +1 -1
  13. package/lib/commonjs/NavigationContainerRefContext.js +4 -6
  14. package/lib/commonjs/NavigationContainerRefContext.js.map +1 -1
  15. package/lib/commonjs/NavigationContext.js +4 -6
  16. package/lib/commonjs/NavigationContext.js.map +1 -1
  17. package/lib/commonjs/NavigationHelpersContext.js +4 -6
  18. package/lib/commonjs/NavigationHelpersContext.js.map +1 -1
  19. package/lib/commonjs/NavigationIndependentTree.js +9 -10
  20. package/lib/commonjs/NavigationIndependentTree.js.map +1 -1
  21. package/lib/commonjs/NavigationIndependentTreeContext.js +4 -6
  22. package/lib/commonjs/NavigationIndependentTreeContext.js.map +1 -1
  23. package/lib/commonjs/NavigationRouteContext.js +4 -6
  24. package/lib/commonjs/NavigationRouteContext.js.map +1 -1
  25. package/lib/commonjs/NavigationStateContext.js +4 -5
  26. package/lib/commonjs/NavigationStateContext.js.map +1 -1
  27. package/lib/commonjs/PreventRemoveContext.js +9 -6
  28. package/lib/commonjs/PreventRemoveContext.js.map +1 -1
  29. package/lib/commonjs/PreventRemoveProvider.js +16 -18
  30. package/lib/commonjs/PreventRemoveProvider.js.map +1 -1
  31. package/lib/commonjs/SceneView.js +10 -11
  32. package/lib/commonjs/SceneView.js.map +1 -1
  33. package/lib/commonjs/Screen.js +1 -1
  34. package/lib/commonjs/Screen.js.map +1 -1
  35. package/lib/commonjs/StaticContainer.js +5 -7
  36. package/lib/commonjs/StaticContainer.js.map +1 -1
  37. package/lib/commonjs/StaticNavigation.js +36 -10
  38. package/lib/commonjs/StaticNavigation.js.map +1 -1
  39. package/lib/commonjs/UnhandledActionContext.js +4 -6
  40. package/lib/commonjs/UnhandledActionContext.js.map +1 -1
  41. package/lib/commonjs/checkDuplicateRouteNames.js +2 -3
  42. package/lib/commonjs/checkDuplicateRouteNames.js.map +1 -1
  43. package/lib/commonjs/checkSerializable.js +1 -1
  44. package/lib/commonjs/checkSerializable.js.map +1 -1
  45. package/lib/commonjs/createNavigationContainerRef.js +2 -3
  46. package/lib/commonjs/createNavigationContainerRef.js.map +1 -1
  47. package/lib/commonjs/createNavigatorFactory.js +7 -11
  48. package/lib/commonjs/createNavigatorFactory.js.map +1 -1
  49. package/lib/commonjs/findFocusedRoute.js +3 -5
  50. package/lib/commonjs/findFocusedRoute.js.map +1 -1
  51. package/lib/commonjs/getActionFromState.js +7 -9
  52. package/lib/commonjs/getActionFromState.js.map +1 -1
  53. package/lib/commonjs/getFocusedRouteNameFromRoute.js +2 -2
  54. package/lib/commonjs/getFocusedRouteNameFromRoute.js.map +1 -1
  55. package/lib/commonjs/getPathFromState.js +24 -25
  56. package/lib/commonjs/getPathFromState.js.map +1 -1
  57. package/lib/commonjs/getStateFromPath.js +29 -22
  58. package/lib/commonjs/getStateFromPath.js.map +1 -1
  59. package/lib/commonjs/index.js +78 -76
  60. package/lib/commonjs/index.js.map +1 -1
  61. package/lib/commonjs/isArrayEqual.js +1 -1
  62. package/lib/commonjs/isArrayEqual.js.map +1 -1
  63. package/lib/commonjs/isRecordEqual.js +1 -1
  64. package/lib/commonjs/isRecordEqual.js.map +1 -1
  65. package/lib/commonjs/theming/ThemeContext.js +12 -0
  66. package/lib/commonjs/theming/ThemeContext.js.map +1 -0
  67. package/lib/commonjs/theming/ThemeProvider.js +20 -0
  68. package/lib/commonjs/theming/ThemeProvider.js.map +1 -0
  69. package/lib/commonjs/theming/useTheme.js +18 -0
  70. package/lib/commonjs/theming/useTheme.js.map +1 -0
  71. package/lib/commonjs/types.js +1 -8
  72. package/lib/commonjs/types.js.map +1 -1
  73. package/lib/commonjs/useChildListeners.js +3 -3
  74. package/lib/commonjs/useChildListeners.js.map +1 -1
  75. package/lib/commonjs/useComponent.js +3 -3
  76. package/lib/commonjs/useComponent.js.map +1 -1
  77. package/lib/commonjs/useCurrentRender.js +5 -6
  78. package/lib/commonjs/useCurrentRender.js.map +1 -1
  79. package/lib/commonjs/useDescriptors.js +92 -41
  80. package/lib/commonjs/useDescriptors.js.map +1 -1
  81. package/lib/commonjs/useEventEmitter.js +6 -7
  82. package/lib/commonjs/useEventEmitter.js.map +1 -1
  83. package/lib/commonjs/useFocusEffect.js +7 -6
  84. package/lib/commonjs/useFocusEffect.js.map +1 -1
  85. package/lib/commonjs/useFocusEvents.js +7 -8
  86. package/lib/commonjs/useFocusEvents.js.map +1 -1
  87. package/lib/commonjs/useFocusedListenersChildrenAdapter.js +6 -7
  88. package/lib/commonjs/useFocusedListenersChildrenAdapter.js.map +1 -1
  89. package/lib/commonjs/useIsFocused.js +8 -8
  90. package/lib/commonjs/useIsFocused.js.map +1 -1
  91. package/lib/commonjs/useIsomorphicLayoutEffect.js +12 -0
  92. package/lib/commonjs/useIsomorphicLayoutEffect.js.map +1 -0
  93. package/lib/commonjs/useIsomorphicLayoutEffect.native.js +9 -0
  94. package/lib/commonjs/useIsomorphicLayoutEffect.native.js.map +1 -0
  95. package/lib/commonjs/useKeyedChildListeners.js +3 -3
  96. package/lib/commonjs/useKeyedChildListeners.js.map +1 -1
  97. package/lib/commonjs/useNavigation.js +7 -8
  98. package/lib/commonjs/useNavigation.js.map +1 -1
  99. package/lib/commonjs/useNavigationBuilder.js +115 -106
  100. package/lib/commonjs/useNavigationBuilder.js.map +1 -1
  101. package/lib/commonjs/useNavigationCache.js +60 -20
  102. package/lib/commonjs/useNavigationCache.js.map +1 -1
  103. package/lib/commonjs/useNavigationContainerRef.js +5 -6
  104. package/lib/commonjs/useNavigationContainerRef.js.map +1 -1
  105. package/lib/commonjs/useNavigationHelpers.js +9 -11
  106. package/lib/commonjs/useNavigationHelpers.js.map +1 -1
  107. package/lib/commonjs/useNavigationIndependentTree.js +5 -6
  108. package/lib/commonjs/useNavigationIndependentTree.js.map +1 -1
  109. package/lib/commonjs/useNavigationState.js +5 -6
  110. package/lib/commonjs/useNavigationState.js.map +1 -1
  111. package/lib/commonjs/useOnAction.js +13 -12
  112. package/lib/commonjs/useOnAction.js.map +1 -1
  113. package/lib/commonjs/useOnGetState.js +11 -13
  114. package/lib/commonjs/useOnGetState.js.map +1 -1
  115. package/lib/commonjs/useOnPreventRemove.js +10 -12
  116. package/lib/commonjs/useOnPreventRemove.js.map +1 -1
  117. package/lib/commonjs/useOnRouteFocus.js +5 -6
  118. package/lib/commonjs/useOnRouteFocus.js.map +1 -1
  119. package/lib/commonjs/useOptionsGetters.js +14 -16
  120. package/lib/commonjs/useOptionsGetters.js.map +1 -1
  121. package/lib/commonjs/usePreventRemove.js +10 -10
  122. package/lib/commonjs/usePreventRemove.js.map +1 -1
  123. package/lib/commonjs/usePreventRemoveContext.js +5 -6
  124. package/lib/commonjs/usePreventRemoveContext.js.map +1 -1
  125. package/lib/commonjs/useRegisterNavigator.js +3 -3
  126. package/lib/commonjs/useRegisterNavigator.js.map +1 -1
  127. package/lib/commonjs/useRoute.js +5 -6
  128. package/lib/commonjs/useRoute.js.map +1 -1
  129. package/lib/commonjs/useRouteCache.js +20 -17
  130. package/lib/commonjs/useRouteCache.js.map +1 -1
  131. package/lib/commonjs/useSyncState.js +28 -57
  132. package/lib/commonjs/useSyncState.js.map +1 -1
  133. package/lib/commonjs/validatePathConfig.js +38 -11
  134. package/lib/commonjs/validatePathConfig.js.map +1 -1
  135. package/lib/module/BaseNavigationContainer.js +39 -44
  136. package/lib/module/BaseNavigationContainer.js.map +1 -1
  137. package/lib/module/CurrentRenderContext.js +1 -2
  138. package/lib/module/CurrentRenderContext.js.map +1 -1
  139. package/lib/module/DeprecatedNavigationInChildContext.js +1 -2
  140. package/lib/module/DeprecatedNavigationInChildContext.js.map +1 -1
  141. package/lib/module/EnsureSingleNavigator.js +1 -1
  142. package/lib/module/EnsureSingleNavigator.js.map +1 -1
  143. package/lib/module/Group.js +1 -1
  144. package/lib/module/Group.js.map +1 -1
  145. package/lib/module/NavigationBuilderContext.js +1 -2
  146. package/lib/module/NavigationBuilderContext.js.map +1 -1
  147. package/lib/module/NavigationContainerRefContext.js +1 -2
  148. package/lib/module/NavigationContainerRefContext.js.map +1 -1
  149. package/lib/module/NavigationContext.js +1 -2
  150. package/lib/module/NavigationContext.js.map +1 -1
  151. package/lib/module/NavigationHelpersContext.js +1 -2
  152. package/lib/module/NavigationHelpersContext.js.map +1 -1
  153. package/lib/module/NavigationIndependentTree.js +4 -4
  154. package/lib/module/NavigationIndependentTree.js.map +1 -1
  155. package/lib/module/NavigationIndependentTreeContext.js +1 -2
  156. package/lib/module/NavigationIndependentTreeContext.js.map +1 -1
  157. package/lib/module/NavigationRouteContext.js +1 -2
  158. package/lib/module/NavigationRouteContext.js.map +1 -1
  159. package/lib/module/NavigationStateContext.js +1 -1
  160. package/lib/module/NavigationStateContext.js.map +1 -1
  161. package/lib/module/PreventRemoveContext.js +1 -2
  162. package/lib/module/PreventRemoveContext.js.map +1 -1
  163. package/lib/module/PreventRemoveProvider.js +10 -12
  164. package/lib/module/PreventRemoveProvider.js.map +1 -1
  165. package/lib/module/SceneView.js +5 -5
  166. package/lib/module/SceneView.js.map +1 -1
  167. package/lib/module/Screen.js +1 -1
  168. package/lib/module/Screen.js.map +1 -1
  169. package/lib/module/StaticContainer.js +2 -3
  170. package/lib/module/StaticContainer.js.map +1 -1
  171. package/lib/module/StaticNavigation.js +28 -6
  172. package/lib/module/StaticNavigation.js.map +1 -1
  173. package/lib/module/UnhandledActionContext.js +1 -2
  174. package/lib/module/UnhandledActionContext.js.map +1 -1
  175. package/lib/module/checkDuplicateRouteNames.js +2 -3
  176. package/lib/module/checkDuplicateRouteNames.js.map +1 -1
  177. package/lib/module/checkSerializable.js +1 -1
  178. package/lib/module/checkSerializable.js.map +1 -1
  179. package/lib/module/createNavigationContainerRef.js +1 -1
  180. package/lib/module/createNavigationContainerRef.js.map +1 -1
  181. package/lib/module/createNavigatorFactory.js +3 -6
  182. package/lib/module/createNavigatorFactory.js.map +1 -1
  183. package/lib/module/findFocusedRoute.js +3 -5
  184. package/lib/module/findFocusedRoute.js.map +1 -1
  185. package/lib/module/getActionFromState.js +7 -9
  186. package/lib/module/getActionFromState.js.map +1 -1
  187. package/lib/module/getFocusedRouteNameFromRoute.js +2 -2
  188. package/lib/module/getFocusedRouteNameFromRoute.js.map +1 -1
  189. package/lib/module/getPathFromState.js +21 -21
  190. package/lib/module/getPathFromState.js.map +1 -1
  191. package/lib/module/getStateFromPath.js +25 -18
  192. package/lib/module/getStateFromPath.js.map +1 -1
  193. package/lib/module/index.js +31 -28
  194. package/lib/module/index.js.map +1 -1
  195. package/lib/module/isArrayEqual.js +1 -1
  196. package/lib/module/isArrayEqual.js.map +1 -1
  197. package/lib/module/isRecordEqual.js +1 -1
  198. package/lib/module/isRecordEqual.js.map +1 -1
  199. package/lib/module/theming/ThemeContext.js +4 -0
  200. package/lib/module/theming/ThemeContext.js.map +1 -0
  201. package/lib/module/theming/ThemeProvider.js +12 -0
  202. package/lib/module/theming/ThemeProvider.js.map +1 -0
  203. package/lib/module/theming/useTheme.js +10 -0
  204. package/lib/module/theming/useTheme.js.map +1 -0
  205. package/lib/module/types.js +1 -8
  206. package/lib/module/types.js.map +1 -1
  207. package/lib/module/useChildListeners.js +1 -1
  208. package/lib/module/useChildListeners.js.map +1 -1
  209. package/lib/module/useComponent.js +1 -1
  210. package/lib/module/useComponent.js.map +1 -1
  211. package/lib/module/useCurrentRender.js +2 -2
  212. package/lib/module/useCurrentRender.js.map +1 -1
  213. package/lib/module/useDescriptors.js +88 -36
  214. package/lib/module/useDescriptors.js.map +1 -1
  215. package/lib/module/useEventEmitter.js +4 -5
  216. package/lib/module/useEventEmitter.js.map +1 -1
  217. package/lib/module/useFocusEffect.js +4 -2
  218. package/lib/module/useFocusEffect.js.map +1 -1
  219. package/lib/module/useFocusEvents.js +4 -4
  220. package/lib/module/useFocusEvents.js.map +1 -1
  221. package/lib/module/useFocusedListenersChildrenAdapter.js +3 -3
  222. package/lib/module/useFocusedListenersChildrenAdapter.js.map +1 -1
  223. package/lib/module/useIsFocused.js +2 -2
  224. package/lib/module/useIsFocused.js.map +1 -1
  225. package/lib/module/useIsomorphicLayoutEffect.js +7 -0
  226. package/lib/module/useIsomorphicLayoutEffect.js.map +1 -0
  227. package/lib/module/useIsomorphicLayoutEffect.native.js +3 -0
  228. package/lib/module/useIsomorphicLayoutEffect.native.js.map +1 -0
  229. package/lib/module/useKeyedChildListeners.js +1 -1
  230. package/lib/module/useKeyedChildListeners.js.map +1 -1
  231. package/lib/module/useNavigation.js +3 -3
  232. package/lib/module/useNavigation.js.map +1 -1
  233. package/lib/module/useNavigationBuilder.js +97 -88
  234. package/lib/module/useNavigationBuilder.js.map +1 -1
  235. package/lib/module/useNavigationCache.js +57 -16
  236. package/lib/module/useNavigationCache.js.map +1 -1
  237. package/lib/module/useNavigationContainerRef.js +2 -2
  238. package/lib/module/useNavigationContainerRef.js.map +1 -1
  239. package/lib/module/useNavigationHelpers.js +5 -6
  240. package/lib/module/useNavigationHelpers.js.map +1 -1
  241. package/lib/module/useNavigationIndependentTree.js +2 -2
  242. package/lib/module/useNavigationIndependentTree.js.map +1 -1
  243. package/lib/module/useNavigationState.js +2 -2
  244. package/lib/module/useNavigationState.js.map +1 -1
  245. package/lib/module/useOnAction.js +8 -6
  246. package/lib/module/useOnAction.js.map +1 -1
  247. package/lib/module/useOnGetState.js +6 -7
  248. package/lib/module/useOnGetState.js.map +1 -1
  249. package/lib/module/useOnPreventRemove.js +6 -7
  250. package/lib/module/useOnPreventRemove.js.map +1 -1
  251. package/lib/module/useOnRouteFocus.js +2 -2
  252. package/lib/module/useOnRouteFocus.js.map +1 -1
  253. package/lib/module/useOptionsGetters.js +10 -11
  254. package/lib/module/useOptionsGetters.js.map +1 -1
  255. package/lib/module/usePreventRemove.js +5 -5
  256. package/lib/module/usePreventRemove.js.map +1 -1
  257. package/lib/module/usePreventRemoveContext.js +2 -2
  258. package/lib/module/usePreventRemoveContext.js.map +1 -1
  259. package/lib/module/useRegisterNavigator.js +1 -1
  260. package/lib/module/useRegisterNavigator.js.map +1 -1
  261. package/lib/module/useRoute.js +2 -2
  262. package/lib/module/useRoute.js.map +1 -1
  263. package/lib/module/useRouteCache.js +17 -13
  264. package/lib/module/useRouteCache.js.map +1 -1
  265. package/lib/module/useSyncState.js +25 -54
  266. package/lib/module/useSyncState.js.map +1 -1
  267. package/lib/module/validatePathConfig.js +38 -11
  268. package/lib/module/validatePathConfig.js.map +1 -1
  269. package/lib/typescript/src/BaseNavigationContainer.d.ts +3 -3
  270. package/lib/typescript/src/BaseNavigationContainer.d.ts.map +1 -1
  271. package/lib/typescript/src/CurrentRenderContext.d.ts +1 -2
  272. package/lib/typescript/src/CurrentRenderContext.d.ts.map +1 -1
  273. package/lib/typescript/src/DeprecatedNavigationInChildContext.d.ts +1 -2
  274. package/lib/typescript/src/DeprecatedNavigationInChildContext.d.ts.map +1 -1
  275. package/lib/typescript/src/EnsureSingleNavigator.d.ts +1 -1
  276. package/lib/typescript/src/EnsureSingleNavigator.d.ts.map +1 -1
  277. package/lib/typescript/src/Group.d.ts +1 -1
  278. package/lib/typescript/src/Group.d.ts.map +1 -1
  279. package/lib/typescript/src/NavigationBuilderContext.d.ts +1 -2
  280. package/lib/typescript/src/NavigationBuilderContext.d.ts.map +1 -1
  281. package/lib/typescript/src/NavigationContainerRefContext.d.ts +1 -2
  282. package/lib/typescript/src/NavigationContainerRefContext.d.ts.map +1 -1
  283. package/lib/typescript/src/NavigationContext.d.ts +1 -18
  284. package/lib/typescript/src/NavigationContext.d.ts.map +1 -1
  285. package/lib/typescript/src/NavigationHelpersContext.d.ts +1 -2
  286. package/lib/typescript/src/NavigationHelpersContext.d.ts.map +1 -1
  287. package/lib/typescript/src/NavigationIndependentTree.d.ts +2 -2
  288. package/lib/typescript/src/NavigationIndependentTree.d.ts.map +1 -1
  289. package/lib/typescript/src/NavigationIndependentTreeContext.d.ts +1 -2
  290. package/lib/typescript/src/NavigationIndependentTreeContext.d.ts.map +1 -1
  291. package/lib/typescript/src/NavigationRouteContext.d.ts +1 -2
  292. package/lib/typescript/src/NavigationRouteContext.d.ts.map +1 -1
  293. package/lib/typescript/src/NavigationStateContext.d.ts +3 -20
  294. package/lib/typescript/src/NavigationStateContext.d.ts.map +1 -1
  295. package/lib/typescript/src/PreventRemoveContext.d.ts +1 -2
  296. package/lib/typescript/src/PreventRemoveContext.d.ts.map +1 -1
  297. package/lib/typescript/src/PreventRemoveProvider.d.ts +1 -1
  298. package/lib/typescript/src/PreventRemoveProvider.d.ts.map +1 -1
  299. package/lib/typescript/src/SceneView.d.ts +2 -2
  300. package/lib/typescript/src/SceneView.d.ts.map +1 -1
  301. package/lib/typescript/src/Screen.d.ts +1 -1
  302. package/lib/typescript/src/Screen.d.ts.map +1 -1
  303. package/lib/typescript/src/StaticContainer.d.ts +1 -3
  304. package/lib/typescript/src/StaticContainer.d.ts.map +1 -1
  305. package/lib/typescript/src/StaticNavigation.d.ts +12 -5
  306. package/lib/typescript/src/StaticNavigation.d.ts.map +1 -1
  307. package/lib/typescript/src/UnhandledActionContext.d.ts +1 -2
  308. package/lib/typescript/src/UnhandledActionContext.d.ts.map +1 -1
  309. package/lib/typescript/src/checkDuplicateRouteNames.d.ts +1 -1
  310. package/lib/typescript/src/checkDuplicateRouteNames.d.ts.map +1 -1
  311. package/lib/typescript/src/checkSerializable.d.ts +1 -1
  312. package/lib/typescript/src/checkSerializable.d.ts.map +1 -1
  313. package/lib/typescript/src/createNavigationContainerRef.d.ts +1 -1
  314. package/lib/typescript/src/createNavigationContainerRef.d.ts.map +1 -1
  315. package/lib/typescript/src/createNavigatorFactory.d.ts +1 -1
  316. package/lib/typescript/src/createNavigatorFactory.d.ts.map +1 -1
  317. package/lib/typescript/src/findFocusedRoute.d.ts +2 -10
  318. package/lib/typescript/src/findFocusedRoute.d.ts.map +1 -1
  319. package/lib/typescript/src/getActionFromState.d.ts +1 -1
  320. package/lib/typescript/src/getActionFromState.d.ts.map +1 -1
  321. package/lib/typescript/src/getFocusedRouteNameFromRoute.d.ts +1 -1
  322. package/lib/typescript/src/getFocusedRouteNameFromRoute.d.ts.map +1 -1
  323. package/lib/typescript/src/getPathFromState.d.ts +2 -1
  324. package/lib/typescript/src/getPathFromState.d.ts.map +1 -1
  325. package/lib/typescript/src/getStateFromPath.d.ts +2 -1
  326. package/lib/typescript/src/getStateFromPath.d.ts.map +1 -1
  327. package/lib/typescript/src/index.d.ts +31 -28
  328. package/lib/typescript/src/index.d.ts.map +1 -1
  329. package/lib/typescript/src/isArrayEqual.d.ts +1 -1
  330. package/lib/typescript/src/isArrayEqual.d.ts.map +1 -1
  331. package/lib/typescript/src/isRecordEqual.d.ts +1 -1
  332. package/lib/typescript/src/isRecordEqual.d.ts.map +1 -1
  333. package/lib/typescript/src/theming/ThemeContext.d.ts +3 -0
  334. package/lib/typescript/src/theming/ThemeContext.d.ts.map +1 -0
  335. package/lib/typescript/src/theming/ThemeProvider.d.ts +8 -0
  336. package/lib/typescript/src/theming/ThemeProvider.d.ts.map +1 -0
  337. package/lib/typescript/src/theming/useTheme.d.ts +2 -0
  338. package/lib/typescript/src/theming/useTheme.d.ts.map +1 -0
  339. package/lib/typescript/src/types.d.ts +80 -1
  340. package/lib/typescript/src/types.d.ts.map +1 -1
  341. package/lib/typescript/src/useChildListeners.d.ts +1 -1
  342. package/lib/typescript/src/useChildListeners.d.ts.map +1 -1
  343. package/lib/typescript/src/useComponent.d.ts +2 -2
  344. package/lib/typescript/src/useComponent.d.ts.map +1 -1
  345. package/lib/typescript/src/useCurrentRender.d.ts +1 -1
  346. package/lib/typescript/src/useCurrentRender.d.ts.map +1 -1
  347. package/lib/typescript/src/useDescriptors.d.ts +107 -59
  348. package/lib/typescript/src/useDescriptors.d.ts.map +1 -1
  349. package/lib/typescript/src/useEventEmitter.d.ts +1 -1
  350. package/lib/typescript/src/useEventEmitter.d.ts.map +1 -1
  351. package/lib/typescript/src/useFocusEffect.d.ts +1 -1
  352. package/lib/typescript/src/useFocusEffect.d.ts.map +1 -1
  353. package/lib/typescript/src/useFocusEvents.d.ts +1 -1
  354. package/lib/typescript/src/useFocusEvents.d.ts.map +1 -1
  355. package/lib/typescript/src/useFocusedListenersChildrenAdapter.d.ts +2 -2
  356. package/lib/typescript/src/useFocusedListenersChildrenAdapter.d.ts.map +1 -1
  357. package/lib/typescript/src/useIsFocused.d.ts +1 -1
  358. package/lib/typescript/src/useIsFocused.d.ts.map +1 -1
  359. package/lib/typescript/src/useIsomorphicLayoutEffect.d.ts +6 -0
  360. package/lib/typescript/src/useIsomorphicLayoutEffect.d.ts.map +1 -0
  361. package/lib/typescript/src/useIsomorphicLayoutEffect.native.d.ts +3 -0
  362. package/lib/typescript/src/useIsomorphicLayoutEffect.native.d.ts.map +1 -0
  363. package/lib/typescript/src/useKeyedChildListeners.d.ts +1 -1
  364. package/lib/typescript/src/useKeyedChildListeners.d.ts.map +1 -1
  365. package/lib/typescript/src/useNavigation.d.ts +4 -1
  366. package/lib/typescript/src/useNavigation.d.ts.map +1 -1
  367. package/lib/typescript/src/useNavigationBuilder.d.ts +99 -63
  368. package/lib/typescript/src/useNavigationBuilder.d.ts.map +1 -1
  369. package/lib/typescript/src/useNavigationCache.d.ts +53 -3
  370. package/lib/typescript/src/useNavigationCache.d.ts.map +1 -1
  371. package/lib/typescript/src/useNavigationContainerRef.d.ts +1 -1
  372. package/lib/typescript/src/useNavigationContainerRef.d.ts.map +1 -1
  373. package/lib/typescript/src/useNavigationHelpers.d.ts +26 -40
  374. package/lib/typescript/src/useNavigationHelpers.d.ts.map +1 -1
  375. package/lib/typescript/src/useNavigationIndependentTree.d.ts +1 -1
  376. package/lib/typescript/src/useNavigationIndependentTree.d.ts.map +1 -1
  377. package/lib/typescript/src/useNavigationState.d.ts +1 -1
  378. package/lib/typescript/src/useNavigationState.d.ts.map +1 -1
  379. package/lib/typescript/src/useOnAction.d.ts +2 -2
  380. package/lib/typescript/src/useOnAction.d.ts.map +1 -1
  381. package/lib/typescript/src/useOnGetState.d.ts +2 -2
  382. package/lib/typescript/src/useOnGetState.d.ts.map +1 -1
  383. package/lib/typescript/src/useOnPreventRemove.d.ts +2 -2
  384. package/lib/typescript/src/useOnPreventRemove.d.ts.map +1 -1
  385. package/lib/typescript/src/useOnRouteFocus.d.ts +1 -1
  386. package/lib/typescript/src/useOnRouteFocus.d.ts.map +1 -1
  387. package/lib/typescript/src/useOptionsGetters.d.ts +1 -1
  388. package/lib/typescript/src/useOptionsGetters.d.ts.map +1 -1
  389. package/lib/typescript/src/usePreventRemove.d.ts +1 -1
  390. package/lib/typescript/src/usePreventRemove.d.ts.map +1 -1
  391. package/lib/typescript/src/usePreventRemoveContext.d.ts +1 -1
  392. package/lib/typescript/src/usePreventRemoveContext.d.ts.map +1 -1
  393. package/lib/typescript/src/useRegisterNavigator.d.ts +1 -1
  394. package/lib/typescript/src/useRegisterNavigator.d.ts.map +1 -1
  395. package/lib/typescript/src/useRoute.d.ts +1 -1
  396. package/lib/typescript/src/useRoute.d.ts.map +1 -1
  397. package/lib/typescript/src/useRouteCache.d.ts +1 -1
  398. package/lib/typescript/src/useRouteCache.d.ts.map +1 -1
  399. package/lib/typescript/src/useSyncState.d.ts +1 -4
  400. package/lib/typescript/src/useSyncState.d.ts.map +1 -1
  401. package/lib/typescript/src/validatePathConfig.d.ts +1 -1
  402. package/lib/typescript/src/validatePathConfig.d.ts.map +1 -1
  403. package/lib/typescript/utils/usePrevious.d.ts +6 -0
  404. package/lib/typescript/utils/usePrevious.d.ts.map +1 -0
  405. package/package.json +14 -14
  406. package/src/BaseNavigationContainer.tsx +52 -55
  407. package/src/CurrentRenderContext.tsx +1 -3
  408. package/src/DeprecatedNavigationInChildContext.tsx +1 -3
  409. package/src/EnsureSingleNavigator.tsx +1 -1
  410. package/src/Group.tsx +2 -2
  411. package/src/NavigationBuilderContext.tsx +1 -3
  412. package/src/NavigationContainerRefContext.tsx +1 -3
  413. package/src/NavigationContext.tsx +1 -3
  414. package/src/NavigationHelpersContext.tsx +1 -3
  415. package/src/NavigationIndependentTree.tsx +4 -4
  416. package/src/NavigationIndependentTreeContext.tsx +1 -3
  417. package/src/NavigationRouteContext.tsx +3 -5
  418. package/src/NavigationStateContext.tsx +1 -1
  419. package/src/PreventRemoveContext.tsx +1 -3
  420. package/src/PreventRemoveProvider.tsx +7 -4
  421. package/src/SceneView.tsx +6 -6
  422. package/src/Screen.tsx +2 -2
  423. package/src/StaticContainer.tsx +19 -18
  424. package/src/StaticNavigation.tsx +35 -33
  425. package/src/UnhandledActionContext.tsx +1 -3
  426. package/src/checkDuplicateRouteNames.tsx +2 -2
  427. package/src/checkSerializable.tsx +1 -1
  428. package/src/createNavigationContainerRef.tsx +2 -2
  429. package/src/createNavigatorFactory.tsx +5 -7
  430. package/src/findFocusedRoute.tsx +1 -1
  431. package/src/getActionFromState.tsx +2 -2
  432. package/src/getFocusedRouteNameFromRoute.tsx +4 -4
  433. package/src/getPathFromState.tsx +16 -13
  434. package/src/getStateFromPath.tsx +25 -6
  435. package/src/index.tsx +33 -30
  436. package/src/isArrayEqual.tsx +1 -1
  437. package/src/isRecordEqual.tsx +1 -4
  438. package/src/theming/ThemeContext.tsx +7 -0
  439. package/src/theming/ThemeProvider.tsx +14 -0
  440. package/src/theming/useTheme.tsx +15 -0
  441. package/src/types.tsx +133 -17
  442. package/src/useChildListeners.tsx +1 -1
  443. package/src/useComponent.tsx +1 -1
  444. package/src/useCurrentRender.tsx +2 -6
  445. package/src/useDescriptors.tsx +161 -66
  446. package/src/useEventEmitter.tsx +1 -1
  447. package/src/useFocusEffect.tsx +3 -2
  448. package/src/useFocusEvents.tsx +2 -2
  449. package/src/useFocusedListenersChildrenAdapter.tsx +5 -4
  450. package/src/useIsFocused.tsx +2 -2
  451. package/src/useIsomorphicLayoutEffect.native.tsx +3 -0
  452. package/src/useIsomorphicLayoutEffect.tsx +7 -0
  453. package/src/useKeyedChildListeners.tsx +1 -1
  454. package/src/useNavigation.tsx +7 -4
  455. package/src/useNavigationBuilder.tsx +141 -122
  456. package/src/useNavigationCache.tsx +93 -32
  457. package/src/useNavigationContainerRef.tsx +3 -3
  458. package/src/useNavigationHelpers.tsx +9 -10
  459. package/src/useNavigationIndependentTree.tsx +2 -2
  460. package/src/useNavigationState.tsx +2 -2
  461. package/src/useOnAction.tsx +13 -7
  462. package/src/useOnGetState.tsx +6 -8
  463. package/src/useOnPreventRemove.tsx +5 -4
  464. package/src/useOnRouteFocus.tsx +2 -2
  465. package/src/useOptionsGetters.tsx +5 -9
  466. package/src/usePreventRemove.tsx +4 -4
  467. package/src/usePreventRemoveContext.tsx +2 -2
  468. package/src/useRegisterNavigator.tsx +1 -1
  469. package/src/useRoute.tsx +2 -2
  470. package/src/useRouteCache.tsx +18 -17
  471. package/src/useSyncState.tsx +31 -59
  472. package/src/validatePathConfig.tsx +58 -14
  473. package/lib/commonjs/fromEntries.js +0 -18
  474. package/lib/commonjs/fromEntries.js.map +0 -1
  475. package/lib/commonjs/useScheduleUpdate.js +0 -37
  476. package/lib/commonjs/useScheduleUpdate.js.map +0 -1
  477. package/lib/module/fromEntries.js +0 -12
  478. package/lib/module/fromEntries.js.map +0 -1
  479. package/lib/module/useScheduleUpdate.js +0 -27
  480. package/lib/module/useScheduleUpdate.js.map +0 -1
  481. package/lib/typescript/src/fromEntries.d.ts +0 -2
  482. package/lib/typescript/src/fromEntries.d.ts.map +0 -1
  483. package/lib/typescript/src/useScheduleUpdate.d.ts +0 -14
  484. package/lib/typescript/src/useScheduleUpdate.d.ts.map +0 -1
  485. package/src/fromEntries.tsx +0 -13
  486. package/src/useScheduleUpdate.tsx +0 -32
@@ -1,68 +1,53 @@
1
1
  import {
2
2
  CommonActions,
3
- DefaultRouterOptions,
4
- NavigationAction,
5
- NavigationState,
6
- ParamListBase,
7
- PartialState,
8
- Route,
9
- Router,
10
- RouterConfigOptions,
11
- RouterFactory,
3
+ type DefaultRouterOptions,
4
+ type NavigationAction,
5
+ type NavigationState,
6
+ type ParamListBase,
7
+ type PartialState,
8
+ type Route,
9
+ type Router,
10
+ type RouterConfigOptions,
11
+ type RouterFactory,
12
12
  } from '@react-navigation/routers';
13
13
  import * as React from 'react';
14
14
  import { isValidElementType } from 'react-is';
15
-
16
- import Group from './Group';
17
- import isArrayEqual from './isArrayEqual';
18
- import isRecordEqual from './isRecordEqual';
19
- import NavigationHelpersContext from './NavigationHelpersContext';
20
- import NavigationRouteContext from './NavigationRouteContext';
21
- import NavigationStateContext from './NavigationStateContext';
22
- import PreventRemoveProvider from './PreventRemoveProvider';
23
- import Screen from './Screen';
15
+ import useLatestCallback from 'use-latest-callback';
16
+
17
+ import { Group } from './Group';
18
+ import { isArrayEqual } from './isArrayEqual';
19
+ import { isRecordEqual } from './isRecordEqual';
20
+ import { NavigationHelpersContext } from './NavigationHelpersContext';
21
+ import { NavigationRouteContext } from './NavigationRouteContext';
22
+ import { NavigationStateContext } from './NavigationStateContext';
23
+ import { PreventRemoveProvider } from './PreventRemoveProvider';
24
+ import { Screen } from './Screen';
24
25
  import {
25
- DefaultNavigatorOptions,
26
- EventMapBase,
27
- EventMapCore,
28
- NavigatorScreenParams,
26
+ type DefaultNavigatorOptions,
27
+ type EventMapBase,
28
+ type EventMapCore,
29
+ type NavigatorScreenParams,
29
30
  PrivateValueStore,
30
- RouteConfig,
31
- RouteProp,
31
+ type RouteConfig,
32
32
  } from './types';
33
- import useChildListeners from './useChildListeners';
34
- import useComponent from './useComponent';
35
- import useCurrentRender from './useCurrentRender';
36
- import useDescriptors, { ScreenConfigWithParent } from './useDescriptors';
37
- import useEventEmitter from './useEventEmitter';
38
- import useFocusedListenersChildrenAdapter from './useFocusedListenersChildrenAdapter';
39
- import useFocusEvents from './useFocusEvents';
40
- import useKeyedChildListeners from './useKeyedChildListeners';
41
- import useNavigationHelpers from './useNavigationHelpers';
42
- import useOnAction from './useOnAction';
43
- import useOnGetState from './useOnGetState';
44
- import useOnRouteFocus from './useOnRouteFocus';
45
- import useRegisterNavigator from './useRegisterNavigator';
46
- import useScheduleUpdate from './useScheduleUpdate';
33
+ import { useChildListeners } from './useChildListeners';
34
+ import { useComponent } from './useComponent';
35
+ import { useCurrentRender } from './useCurrentRender';
36
+ import { type ScreenConfigWithParent, useDescriptors } from './useDescriptors';
37
+ import { useEventEmitter } from './useEventEmitter';
38
+ import { useFocusedListenersChildrenAdapter } from './useFocusedListenersChildrenAdapter';
39
+ import { useFocusEvents } from './useFocusEvents';
40
+ import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';
41
+ import { useKeyedChildListeners } from './useKeyedChildListeners';
42
+ import { useNavigationHelpers } from './useNavigationHelpers';
43
+ import { useOnAction } from './useOnAction';
44
+ import { useOnGetState } from './useOnGetState';
45
+ import { useOnRouteFocus } from './useOnRouteFocus';
46
+ import { useRegisterNavigator } from './useRegisterNavigator';
47
47
 
48
48
  // This is to make TypeScript compiler happy
49
- // eslint-disable-next-line babel/no-unused-expressions
50
49
  PrivateValueStore;
51
50
 
52
- type NavigationBuilderOptions<ScreenOptions extends {}> = {
53
- /**
54
- * Default options specified by the navigator.
55
- * It receives the custom options in the arguments if a function is specified.
56
- */
57
- defaultScreenOptions?:
58
- | ScreenOptions
59
- | ((props: {
60
- route: RouteProp<ParamListBase>;
61
- navigation: any;
62
- options: ScreenOptions;
63
- }) => ScreenOptions);
64
- };
65
-
66
51
  type NavigatorRoute = {
67
52
  key: string;
68
53
  params?: NavigatorScreenParams<ParamListBase>;
@@ -79,7 +64,7 @@ const isValidKey = (key: unknown) =>
79
64
  const getRouteConfigsFromChildren = <
80
65
  State extends NavigationState,
81
66
  ScreenOptions extends {},
82
- EventMap extends EventMapBase
67
+ EventMap extends EventMapBase,
83
68
  >(
84
69
  children: React.ReactNode,
85
70
  groupKey?: string,
@@ -87,7 +72,8 @@ const getRouteConfigsFromChildren = <
87
72
  State,
88
73
  ScreenOptions,
89
74
  EventMap
90
- >['options']
75
+ >['options'],
76
+ groupLayout?: ScreenConfigWithParent<State, ScreenOptions, EventMap>['layout']
91
77
  ) => {
92
78
  const configs = React.Children.toArray(children).reduce<
93
79
  ScreenConfigWithParent<State, ScreenOptions, EventMap>[]
@@ -110,6 +96,7 @@ const getRouteConfigsFromChildren = <
110
96
  acc.push({
111
97
  keys: [groupKey, child.props.navigationKey],
112
98
  options: groupOptions,
99
+ layout: groupLayout,
113
100
  props: child.props as RouteConfig<
114
101
  ParamListBase,
115
102
  string,
@@ -118,6 +105,7 @@ const getRouteConfigsFromChildren = <
118
105
  EventMap
119
106
  >,
120
107
  });
108
+
121
109
  return acc;
122
110
  }
123
111
 
@@ -139,8 +127,9 @@ const getRouteConfigsFromChildren = <
139
127
  child.type !== Group
140
128
  ? groupOptions
141
129
  : groupOptions != null
142
- ? [...groupOptions, child.props.screenOptions]
143
- : [child.props.screenOptions]
130
+ ? [...groupOptions, child.props.screenOptions]
131
+ : [child.props.screenOptions],
132
+ child.props.screenLayout ?? groupLayout
144
133
  )
145
134
  );
146
135
  return acc;
@@ -161,8 +150,8 @@ const getRouteConfigsFromChildren = <
161
150
  : ''
162
151
  }`
163
152
  : typeof child === 'object'
164
- ? JSON.stringify(child)
165
- : `'${String(child)}'`
153
+ ? JSON.stringify(child)
154
+ : `'${String(child)}'`
166
155
  }). To render this component in the navigator, pass it in the 'component' prop to 'Screen'.`
167
156
  );
168
157
  }, []);
@@ -252,12 +241,12 @@ const getRouteConfigsFromChildren = <
252
241
  * @param options Options object containing `children` and additional options for the router.
253
242
  * @returns An object containing `state`, `navigation`, `descriptors` objects.
254
243
  */
255
- export default function useNavigationBuilder<
244
+ export function useNavigationBuilder<
256
245
  State extends NavigationState,
257
246
  RouterOptions extends DefaultRouterOptions,
258
247
  ActionHelpers extends Record<string, () => void>,
259
248
  ScreenOptions extends {},
260
- EventMap extends Record<string, any>
249
+ EventMap extends Record<string, any>,
261
250
  >(
262
251
  createRouter: RouterFactory<State, any, RouterOptions>,
263
252
  options: DefaultNavigatorOptions<
@@ -266,7 +255,6 @@ export default function useNavigationBuilder<
266
255
  ScreenOptions,
267
256
  EventMap
268
257
  > &
269
- NavigationBuilderOptions<ScreenOptions> &
270
258
  RouterOptions
271
259
  ) {
272
260
  const navigatorKey = useRegisterNavigator();
@@ -275,17 +263,17 @@ export default function useNavigationBuilder<
275
263
  | NavigatorRoute
276
264
  | undefined;
277
265
 
278
- const { children, screenListeners, ...rest } = options;
266
+ const {
267
+ children,
268
+ layout,
269
+ screenOptions,
270
+ screenLayout,
271
+ screenListeners,
272
+ ...rest
273
+ } = options;
274
+
279
275
  const { current: router } = React.useRef<Router<State, any>>(
280
- createRouter({
281
- ...(rest as unknown as RouterOptions),
282
- ...(route?.params &&
283
- route.params.state == null &&
284
- route.params.initial !== false &&
285
- typeof route.params.screen === 'string'
286
- ? { initialRouteName: route.params.screen }
287
- : null),
288
- })
276
+ createRouter(rest as unknown as RouterOptions)
289
277
  );
290
278
 
291
279
  const routeConfigs = getRouteConfigsFromChildren<
@@ -362,12 +350,7 @@ export default function useNavigationBuilder<
362
350
 
363
351
  const stateCleanedUp = React.useRef(false);
364
352
 
365
- const cleanUpState = React.useCallback(() => {
366
- setCurrentState(undefined);
367
- stateCleanedUp.current = true;
368
- }, [setCurrentState]);
369
-
370
- const setState = React.useCallback(
353
+ const setState = useLatestCallback(
371
354
  (state: NavigationState | PartialState<NavigationState> | undefined) => {
372
355
  if (stateCleanedUp.current) {
373
356
  // State might have been already cleaned up due to unmount
@@ -375,9 +358,9 @@ export default function useNavigationBuilder<
375
358
  // This would lead to old data preservation on main navigator unmount
376
359
  return;
377
360
  }
361
+
378
362
  setCurrentState(state);
379
- },
380
- [setCurrentState]
363
+ }
381
364
  );
382
365
 
383
366
  const [initializedState, isFirstStateInitialization] = React.useMemo(() => {
@@ -409,7 +392,11 @@ export default function useNavigationBuilder<
409
392
  // So we need to rehydrate it to make it usable
410
393
  if (
411
394
  (currentState === undefined || !isStateValid(currentState)) &&
412
- route?.params?.state == null
395
+ route?.params?.state == null &&
396
+ !(
397
+ typeof route?.params?.screen === 'string' &&
398
+ route?.params?.initial !== false
399
+ )
413
400
  ) {
414
401
  return [
415
402
  router.getInitialState({
@@ -420,9 +407,29 @@ export default function useNavigationBuilder<
420
407
  true,
421
408
  ];
422
409
  } else {
410
+ let stateFromParams;
411
+
412
+ if (route?.params?.state != null) {
413
+ stateFromParams = route.params.state;
414
+ } else if (
415
+ typeof route?.params?.screen === 'string' &&
416
+ route?.params?.initial !== false
417
+ ) {
418
+ stateFromParams = {
419
+ index: 0,
420
+ routes: [
421
+ {
422
+ name: route.params.screen,
423
+ params: route.params.params,
424
+ path: route.params.path,
425
+ },
426
+ ],
427
+ };
428
+ }
429
+
423
430
  return [
424
431
  router.getRehydratedState(
425
- (route?.params?.state ?? currentState) as PartialState<State>,
432
+ (stateFromParams ?? currentState) as PartialState<State>,
426
433
  {
427
434
  routeNames,
428
435
  routeParamList: initialRouteParamList,
@@ -462,17 +469,26 @@ export default function useNavigationBuilder<
462
469
  !isArrayEqual(state.routeNames, routeNames) ||
463
470
  !isRecordEqual(routeKeyList, previousRouteKeyList)
464
471
  ) {
472
+ const navigatorStateForNextRouteNamesChange =
473
+ options.getStateForRouteNamesChange?.(state);
465
474
  // When the list of route names change, the router should handle it to remove invalid routes
466
- nextState = router.getStateForRouteNamesChange(state, {
467
- routeNames,
468
- routeParamList,
469
- routeGetIdList,
470
- routeKeyChanges: Object.keys(routeKeyList).filter(
471
- (name) =>
472
- previousRouteKeyList.hasOwnProperty(name) &&
473
- routeKeyList[name] !== previousRouteKeyList[name]
474
- ),
475
- });
475
+ nextState = navigatorStateForNextRouteNamesChange
476
+ ? // @ts-expect-error this is ok
477
+ router.getRehydratedState(navigatorStateForNextRouteNamesChange, {
478
+ routeNames,
479
+ routeParamList,
480
+ routeGetIdList,
481
+ })
482
+ : router.getStateForRouteNamesChange(state, {
483
+ routeNames,
484
+ routeParamList,
485
+ routeGetIdList,
486
+ routeKeyChanges: Object.keys(routeKeyList).filter(
487
+ (name) =>
488
+ name in previousRouteKeyList &&
489
+ routeKeyList[name] !== previousRouteKeyList[name]
490
+ ),
491
+ });
476
492
  }
477
493
 
478
494
  const previousNestedParamsRef = React.useRef(route?.params);
@@ -527,7 +543,7 @@ export default function useNavigationBuilder<
527
543
 
528
544
  const shouldUpdate = state !== nextState;
529
545
 
530
- useScheduleUpdate(() => {
546
+ useIsomorphicLayoutEffect(() => {
531
547
  if (shouldUpdate) {
532
548
  // If the state needs to be updated, we'll schedule an update
533
549
  setState(nextState);
@@ -551,34 +567,24 @@ export default function useNavigationBuilder<
551
567
 
552
568
  return () => {
553
569
  // We need to clean up state for this navigator on unmount
554
- // We do it in a timeout because we need to detect if another navigator mounted in the meantime
555
- // For example, if another navigator has started rendering, we should skip cleanup
556
- // Otherwise, our cleanup step will cleanup state for the other navigator and re-initialize it
557
- setTimeout(() => {
558
- if (getCurrentState() !== undefined && getKey() === navigatorKey) {
559
- cleanUpState();
560
- }
561
- }, 0);
570
+ if (getCurrentState() !== undefined && getKey() === navigatorKey) {
571
+ setCurrentState(undefined);
572
+ stateCleanedUp.current = true;
573
+ }
562
574
  };
563
575
  // eslint-disable-next-line react-hooks/exhaustive-deps
564
576
  }, []);
565
577
 
566
- // We initialize this ref here to avoid a new getState getting initialized
567
- // whenever initializedState changes. We want getState to have access to the
568
- // latest initializedState, but don't need it to change when that happens
569
- const initializedStateRef = React.useRef<State>();
570
- initializedStateRef.current = initializedState;
571
-
572
- const getState = React.useCallback((): State => {
573
- const currentState = getCurrentState();
578
+ const getState = useLatestCallback((): State => {
579
+ const currentState = shouldUpdate ? nextState : getCurrentState();
574
580
 
575
- return isStateInitialized(currentState)
576
- ? (currentState as State)
577
- : (initializedStateRef.current as State);
578
- }, [getCurrentState, isStateInitialized]);
581
+ return (
582
+ isStateInitialized(currentState) ? currentState : initializedState
583
+ ) as State;
584
+ });
579
585
 
580
586
  const emitter = useEventEmitter<EventMapCore<State>>((e) => {
581
- let routeNames = [];
587
+ const routeNames = [];
582
588
 
583
589
  let route: Route<string> | undefined;
584
590
 
@@ -685,7 +691,7 @@ export default function useNavigationBuilder<
685
691
  getStateListeners: keyedListeners.getState,
686
692
  });
687
693
 
688
- const descriptors = useDescriptors<
694
+ const { describe, descriptors } = useDescriptors<
689
695
  State,
690
696
  ActionHelpers,
691
697
  ScreenOptions,
@@ -694,8 +700,8 @@ export default function useNavigationBuilder<
694
700
  state,
695
701
  screens,
696
702
  navigation,
697
- screenOptions: options.screenOptions,
698
- defaultScreenOptions: options.defaultScreenOptions,
703
+ screenOptions,
704
+ screenLayout,
699
705
  onAction,
700
706
  getState,
701
707
  setState,
@@ -713,15 +719,28 @@ export default function useNavigationBuilder<
713
719
  descriptors,
714
720
  });
715
721
 
716
- const NavigationContent = useComponent((children: React.ReactNode) => (
717
- <NavigationHelpersContext.Provider value={navigation}>
718
- <PreventRemoveProvider>{children}</PreventRemoveProvider>
719
- </NavigationHelpersContext.Provider>
720
- ));
722
+ const NavigationContent = useComponent((children: React.ReactNode) => {
723
+ const element =
724
+ layout != null
725
+ ? layout({
726
+ state,
727
+ descriptors,
728
+ navigation,
729
+ children,
730
+ })
731
+ : children;
732
+
733
+ return (
734
+ <NavigationHelpersContext.Provider value={navigation}>
735
+ <PreventRemoveProvider>{element}</PreventRemoveProvider>
736
+ </NavigationHelpersContext.Provider>
737
+ );
738
+ });
721
739
 
722
740
  return {
723
741
  state,
724
742
  navigation,
743
+ describe,
725
744
  descriptors,
726
745
  NavigationContent,
727
746
  };
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  CommonActions,
3
- NavigationAction,
4
- NavigationState,
5
- ParamListBase,
6
- Router,
3
+ type NavigationAction,
4
+ type NavigationState,
5
+ type ParamListBase,
6
+ type Router,
7
7
  } from '@react-navigation/routers';
8
8
  import * as React from 'react';
9
9
 
10
- import NavigationBuilderContext from './NavigationBuilderContext';
10
+ import { NavigationBuilderContext } from './NavigationBuilderContext';
11
11
  import type { NavigationHelpers, NavigationProp } from './types';
12
12
  import type { NavigationEventEmitter } from './useEventEmitter';
13
13
 
14
14
  type Options<
15
15
  State extends NavigationState,
16
16
  ScreenOptions extends {},
17
- EventMap extends Record<string, any>
17
+ EventMap extends Record<string, any>,
18
18
  > = {
19
19
  state: State;
20
20
  getState: () => State;
@@ -29,31 +29,35 @@ type Options<
29
29
  emitter: NavigationEventEmitter<EventMap>;
30
30
  };
31
31
 
32
- type NavigationCache<
32
+ type NavigationItem<
33
33
  State extends NavigationState,
34
34
  ScreenOptions extends {},
35
- EventMap extends Record<string, any>
36
- > = Record<
35
+ EventMap extends Record<string, any>,
36
+ > = NavigationProp<
37
+ ParamListBase,
37
38
  string,
38
- NavigationProp<
39
- ParamListBase,
40
- string,
41
- string | undefined,
42
- State,
43
- ScreenOptions,
44
- EventMap
45
- >
39
+ string | undefined,
40
+ State,
41
+ ScreenOptions,
42
+ EventMap
46
43
  >;
47
44
 
45
+ type NavigationCache<
46
+ State extends NavigationState,
47
+ ScreenOptions extends {},
48
+ EventMap extends Record<string, any>,
49
+ > = Record<string, NavigationItem<State, ScreenOptions, EventMap>>;
50
+
48
51
  /**
49
52
  * Hook to cache navigation objects for each screen in the navigator.
50
53
  * It's important to cache them to make sure navigation objects don't change between renders.
51
54
  * This lets us apply optimizations like `React.memo` to minimize re-rendering screens.
52
55
  */
53
- export default function useNavigationCache<
56
+ export function useNavigationCache<
54
57
  State extends NavigationState,
55
58
  ScreenOptions extends {},
56
- EventMap extends Record<string, any>
59
+ EventMap extends Record<string, any>,
60
+ ActionHelpers extends Record<string, () => void>,
57
61
  >({
58
62
  state,
59
63
  getState,
@@ -64,20 +68,72 @@ export default function useNavigationCache<
64
68
  }: Options<State, ScreenOptions, EventMap>) {
65
69
  const { stackRef } = React.useContext(NavigationBuilderContext);
66
70
 
71
+ const base = React.useMemo((): NavigationItem<
72
+ State,
73
+ ScreenOptions,
74
+ EventMap
75
+ > &
76
+ ActionHelpers => {
77
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
78
+ const { emit, ...rest } = navigation;
79
+
80
+ const actions = {
81
+ ...router.actionCreators,
82
+ ...CommonActions,
83
+ };
84
+
85
+ const dispatch = () => {
86
+ throw new Error(
87
+ 'Actions cannot be dispatched from a placeholder screen.'
88
+ );
89
+ };
90
+
91
+ const helpers = Object.keys(actions).reduce<Record<string, () => void>>(
92
+ (acc, name) => {
93
+ acc[name] = dispatch;
94
+
95
+ return acc;
96
+ },
97
+ {}
98
+ ) as ActionHelpers;
99
+
100
+ return {
101
+ ...rest,
102
+ ...helpers,
103
+ addListener: () => {
104
+ // Event listeners are not supported for placeholder screens
105
+
106
+ return () => {
107
+ // Empty function
108
+ };
109
+ },
110
+ removeListener: () => {
111
+ // Event listeners are not supported for placeholder screens
112
+ },
113
+ dispatch,
114
+ getParent: (id?: string) => {
115
+ if (id !== undefined && id === rest.getId()) {
116
+ return base;
117
+ }
118
+
119
+ return rest.getParent(id);
120
+ },
121
+ setOptions: () => {
122
+ throw new Error('Options cannot be set from a placeholder screen.');
123
+ },
124
+ isFocused: () => false,
125
+ };
126
+ }, [navigation, router.actionCreators]);
127
+
67
128
  // Cache object which holds navigation objects for each screen
68
129
  // We use `React.useMemo` instead of `React.useRef` coz we want to invalidate it when deps change
69
130
  // In reality, these deps will rarely change, if ever
70
131
  const cache = React.useMemo(
71
132
  () => ({ current: {} as NavigationCache<State, ScreenOptions, EventMap> }),
72
133
  // eslint-disable-next-line react-hooks/exhaustive-deps
73
- [getState, navigation, setOptions, router, emitter]
134
+ [base, getState, navigation, setOptions, emitter]
74
135
  );
75
136
 
76
- const actions = {
77
- ...router.actionCreators,
78
- ...CommonActions,
79
- };
80
-
81
137
  cache.current = state.routes.reduce<
82
138
  NavigationCache<State, ScreenOptions, EventMap>
83
139
  >((acc, route) => {
@@ -91,9 +147,6 @@ export default function useNavigationCache<
91
147
  // If a cached navigation object already exists, reuse it
92
148
  acc[route.key] = previous;
93
149
  } else {
94
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
95
- const { emit, ...rest } = navigation;
96
-
97
150
  const dispatch = (thunk: Thunk) => {
98
151
  const action = typeof thunk === 'function' ? thunk(getState()) : thunk;
99
152
 
@@ -124,6 +177,11 @@ export default function useNavigationCache<
124
177
  }
125
178
  };
126
179
 
180
+ const actions = {
181
+ ...router.actionCreators,
182
+ ...CommonActions,
183
+ };
184
+
127
185
  const helpers = Object.keys(actions).reduce<Record<string, () => void>>(
128
186
  (acc, name) => {
129
187
  acc[name] = (...args: any) =>
@@ -138,19 +196,19 @@ export default function useNavigationCache<
138
196
  );
139
197
 
140
198
  acc[route.key] = {
141
- ...rest,
199
+ ...base,
142
200
  ...helpers,
143
201
  // FIXME: too much work to fix the types for now
144
202
  ...(emitter.create(route.key) as any),
145
203
  dispatch: (thunk: Thunk) => withStack(() => dispatch(thunk)),
146
204
  getParent: (id?: string) => {
147
- if (id !== undefined && id === rest.getId()) {
205
+ if (id !== undefined && id === base.getId()) {
148
206
  // If the passed id is the same as the current navigation id,
149
207
  // we return the cached navigation object for the relevant route
150
208
  return acc[route.key];
151
209
  }
152
210
 
153
- return rest.getParent(id);
211
+ return base.getParent(id);
154
212
  },
155
213
  setOptions: (options: object) => {
156
214
  setOptions((o) => ({
@@ -175,5 +233,8 @@ export default function useNavigationCache<
175
233
  return acc;
176
234
  }, {});
177
235
 
178
- return cache.current;
236
+ return {
237
+ base,
238
+ navigations: cache.current,
239
+ };
179
240
  }
@@ -1,10 +1,10 @@
1
1
  import * as React from 'react';
2
2
 
3
- import createNavigationContainerRef from './createNavigationContainerRef';
3
+ import { createNavigationContainerRef } from './createNavigationContainerRef';
4
4
  import type { NavigationContainerRefWithCurrent } from './types';
5
5
 
6
- export default function useNavigationContainerRef<
7
- ParamList extends {} = ReactNavigation.RootParamList
6
+ export function useNavigationContainerRef<
7
+ ParamList extends {} = ReactNavigation.RootParamList,
8
8
  >(): NavigationContainerRefWithCurrent<ParamList> {
9
9
  const navigation =
10
10
  React.useRef<NavigationContainerRefWithCurrent<ParamList> | null>(null);
@@ -1,19 +1,18 @@
1
1
  import {
2
2
  CommonActions,
3
- NavigationAction,
4
- NavigationState,
5
- ParamListBase,
6
- Router,
3
+ type NavigationAction,
4
+ type NavigationState,
5
+ type ParamListBase,
6
+ type Router,
7
7
  } from '@react-navigation/routers';
8
8
  import * as React from 'react';
9
9
 
10
- import NavigationContext from './NavigationContext';
11
- import { NavigationHelpers, PrivateValueStore } from './types';
12
- import UnhandledActionContext from './UnhandledActionContext';
10
+ import { NavigationContext } from './NavigationContext';
11
+ import { type NavigationHelpers, PrivateValueStore } from './types';
12
+ import { UnhandledActionContext } from './UnhandledActionContext';
13
13
  import type { NavigationEventEmitter } from './useEventEmitter';
14
14
 
15
15
  // This is to make TypeScript compiler happy
16
- // eslint-disable-next-line babel/no-unused-expressions
17
16
  PrivateValueStore;
18
17
 
19
18
  type Options<State extends NavigationState, Action extends NavigationAction> = {
@@ -28,11 +27,11 @@ type Options<State extends NavigationState, Action extends NavigationAction> = {
28
27
  * Navigation object with helper methods to be used by a navigator.
29
28
  * This object includes methods for common actions as well as methods the parent screen's navigation object.
30
29
  */
31
- export default function useNavigationHelpers<
30
+ export function useNavigationHelpers<
32
31
  State extends NavigationState,
33
32
  ActionHelpers extends Record<string, () => void>,
34
33
  Action extends NavigationAction,
35
- EventMap extends Record<string, any>
34
+ EventMap extends Record<string, any>,
36
35
  >({
37
36
  id: navigatorId,
38
37
  onAction,