@react-navigation/core 8.0.0-alpha.4 → 8.0.0-alpha.41

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 (323) hide show
  1. package/README.md +17 -14
  2. package/lib/module/BaseNavigationContainer.js +173 -90
  3. package/lib/module/BaseNavigationContainer.js.map +1 -1
  4. package/lib/module/ConsumedParamsContext.js +5 -0
  5. package/lib/module/ConsumedParamsContext.js.map +1 -0
  6. package/lib/module/DataLoading.js +129 -0
  7. package/lib/module/DataLoading.js.map +1 -0
  8. package/lib/module/NavigationBuilderContext.js +7 -10
  9. package/lib/module/NavigationBuilderContext.js.map +1 -1
  10. package/lib/module/NavigationIndependentTree.js +54 -9
  11. package/lib/module/NavigationIndependentTree.js.map +1 -1
  12. package/lib/module/NavigationProvider.js +37 -12
  13. package/lib/module/NavigationProvider.js.map +1 -1
  14. package/lib/module/NavigationRootContext.js +8 -0
  15. package/lib/module/NavigationRootContext.js.map +1 -0
  16. package/lib/module/NavigationStateContext.js +3 -0
  17. package/lib/module/NavigationStateContext.js.map +1 -1
  18. package/lib/module/PreventRemoveContext.js.map +1 -1
  19. package/lib/module/PreventRemoveProvider.js +40 -31
  20. package/lib/module/PreventRemoveProvider.js.map +1 -1
  21. package/lib/module/SceneView.js +29 -57
  22. package/lib/module/SceneView.js.map +1 -1
  23. package/lib/module/StaticNavigation.js +219 -67
  24. package/lib/module/StaticNavigation.js.map +1 -1
  25. package/lib/module/StaticTreeContext.js +5 -0
  26. package/lib/module/StaticTreeContext.js.map +1 -0
  27. package/lib/module/createNavigationContainerRef.js +7 -9
  28. package/lib/module/createNavigationContainerRef.js.map +1 -1
  29. package/lib/module/createNavigatorFactory.js +27 -5
  30. package/lib/module/createNavigatorFactory.js.map +1 -1
  31. package/lib/module/findFocusedRoute.js +7 -4
  32. package/lib/module/findFocusedRoute.js.map +1 -1
  33. package/lib/module/getActionFromState.js +45 -20
  34. package/lib/module/getActionFromState.js.map +1 -1
  35. package/lib/module/getPathFromState.js +204 -94
  36. package/lib/module/getPathFromState.js.map +1 -1
  37. package/lib/module/getPatternParts.js +61 -14
  38. package/lib/module/getPatternParts.js.map +1 -1
  39. package/lib/module/getStateFromPath.js +608 -272
  40. package/lib/module/getStateFromPath.js.map +1 -1
  41. package/lib/module/getStateFromRouteParams.js +23 -0
  42. package/lib/module/getStateFromRouteParams.js.map +1 -0
  43. package/lib/module/index.js +7 -6
  44. package/lib/module/index.js.map +1 -1
  45. package/lib/module/internal.js +2 -0
  46. package/lib/module/internal.js.map +1 -0
  47. package/lib/module/isRecordEqual.js +1 -1
  48. package/lib/module/isRecordEqual.js.map +1 -1
  49. package/lib/module/queryString.js +71 -0
  50. package/lib/module/queryString.js.map +1 -0
  51. package/lib/module/theming/useTheme.js +1 -1
  52. package/lib/module/theming/useTheme.js.map +1 -1
  53. package/lib/module/types.js +35 -1
  54. package/lib/module/types.js.map +1 -1
  55. package/lib/module/useDescriptors.js +65 -25
  56. package/lib/module/useDescriptors.js.map +1 -1
  57. package/lib/module/useEventEmitter.js +48 -33
  58. package/lib/module/useEventEmitter.js.map +1 -1
  59. package/lib/module/useFocusEffect.js +4 -2
  60. package/lib/module/useFocusEffect.js.map +1 -1
  61. package/lib/module/useFocusEvents.js +15 -5
  62. package/lib/module/useFocusEvents.js.map +1 -1
  63. package/lib/module/useFocusedListenersChildrenAdapter.js +3 -3
  64. package/lib/module/useFocusedListenersChildrenAdapter.js.map +1 -1
  65. package/lib/module/useIsFocused.js +8 -12
  66. package/lib/module/useIsFocused.js.map +1 -1
  67. package/lib/module/useKeyedChildListeners.js +5 -2
  68. package/lib/module/useKeyedChildListeners.js.map +1 -1
  69. package/lib/module/useLazyValue.js.map +1 -1
  70. package/lib/module/useNavigation.js +4 -17
  71. package/lib/module/useNavigation.js.map +1 -1
  72. package/lib/module/useNavigationBuilder.js +244 -147
  73. package/lib/module/useNavigationBuilder.js.map +1 -1
  74. package/lib/module/useNavigationCache.js +92 -89
  75. package/lib/module/useNavigationCache.js.map +1 -1
  76. package/lib/module/useNavigationHelpers.js +22 -29
  77. package/lib/module/useNavigationHelpers.js.map +1 -1
  78. package/lib/module/useNavigationIndependentTree.js +1 -1
  79. package/lib/module/useNavigationIndependentTree.js.map +1 -1
  80. package/lib/module/useNavigationState.js +158 -46
  81. package/lib/module/useNavigationState.js.map +1 -1
  82. package/lib/module/useOnAction.js +58 -11
  83. package/lib/module/useOnAction.js.map +1 -1
  84. package/lib/module/useOnGetNavigation.js +26 -0
  85. package/lib/module/useOnGetNavigation.js.map +1 -0
  86. package/lib/module/useOnGetState.js +7 -4
  87. package/lib/module/useOnGetState.js.map +1 -1
  88. package/lib/module/useOnPreventRemove.js +40 -31
  89. package/lib/module/useOnPreventRemove.js.map +1 -1
  90. package/lib/module/useOnRouteFocus.js +2 -2
  91. package/lib/module/useOnRouteFocus.js.map +1 -1
  92. package/lib/module/useOptionsGetters.js +35 -27
  93. package/lib/module/useOptionsGetters.js.map +1 -1
  94. package/lib/module/usePreventRemove.js +11 -5
  95. package/lib/module/usePreventRemove.js.map +1 -1
  96. package/lib/module/usePreventRemoveContext.js +2 -2
  97. package/lib/module/usePreventRemoveContext.js.map +1 -1
  98. package/lib/module/useRegisterNavigator.js +3 -4
  99. package/lib/module/useRegisterNavigator.js.map +1 -1
  100. package/lib/module/useRoute.js +2 -0
  101. package/lib/module/useRoute.js.map +1 -1
  102. package/lib/module/useRouteCache.js +51 -35
  103. package/lib/module/useRouteCache.js.map +1 -1
  104. package/lib/module/useScheduleUpdate.js +12 -10
  105. package/lib/module/useScheduleUpdate.js.map +1 -1
  106. package/lib/module/useStateForPath.js +1 -1
  107. package/lib/module/useStateForPath.js.map +1 -1
  108. package/lib/module/useSyncState.js +37 -15
  109. package/lib/module/useSyncState.js.map +1 -1
  110. package/lib/module/validatePathConfig.js +50 -36
  111. package/lib/module/validatePathConfig.js.map +1 -1
  112. package/lib/typescript/src/BaseNavigationContainer.d.ts +6 -3
  113. package/lib/typescript/src/BaseNavigationContainer.d.ts.map +1 -1
  114. package/lib/typescript/src/ConsumedParamsContext.d.ts +3 -0
  115. package/lib/typescript/src/ConsumedParamsContext.d.ts.map +1 -0
  116. package/lib/typescript/src/DataLoading.d.ts +21 -0
  117. package/lib/typescript/src/DataLoading.d.ts.map +1 -0
  118. package/lib/typescript/src/EnsureSingleNavigator.d.ts +1 -1
  119. package/lib/typescript/src/EnsureSingleNavigator.d.ts.map +1 -1
  120. package/lib/typescript/src/Group.d.ts +1 -1
  121. package/lib/typescript/src/Group.d.ts.map +1 -1
  122. package/lib/typescript/src/NavigationBuilderContext.d.ts +22 -14
  123. package/lib/typescript/src/NavigationBuilderContext.d.ts.map +1 -1
  124. package/lib/typescript/src/NavigationContainerRefContext.d.ts +1 -1
  125. package/lib/typescript/src/NavigationContainerRefContext.d.ts.map +1 -1
  126. package/lib/typescript/src/NavigationFocusedRouteStateContext.d.ts +4 -4
  127. package/lib/typescript/src/NavigationFocusedRouteStateContext.d.ts.map +1 -1
  128. package/lib/typescript/src/NavigationHelpersContext.d.ts +1 -1
  129. package/lib/typescript/src/NavigationHelpersContext.d.ts.map +1 -1
  130. package/lib/typescript/src/NavigationIndependentTree.d.ts +1 -1
  131. package/lib/typescript/src/NavigationIndependentTree.d.ts.map +1 -1
  132. package/lib/typescript/src/NavigationProvider.d.ts +21 -18
  133. package/lib/typescript/src/NavigationProvider.d.ts.map +1 -1
  134. package/lib/typescript/src/NavigationRootContext.d.ts +8 -0
  135. package/lib/typescript/src/NavigationRootContext.d.ts.map +1 -0
  136. package/lib/typescript/src/NavigationStateContext.d.ts +3 -3
  137. package/lib/typescript/src/NavigationStateContext.d.ts.map +1 -1
  138. package/lib/typescript/src/PreventRemoveContext.d.ts +1 -0
  139. package/lib/typescript/src/PreventRemoveContext.d.ts.map +1 -1
  140. package/lib/typescript/src/PreventRemoveProvider.d.ts +1 -1
  141. package/lib/typescript/src/PreventRemoveProvider.d.ts.map +1 -1
  142. package/lib/typescript/src/SceneView.d.ts +5 -2
  143. package/lib/typescript/src/SceneView.d.ts.map +1 -1
  144. package/lib/typescript/src/Screen.d.ts +1 -1
  145. package/lib/typescript/src/Screen.d.ts.map +1 -1
  146. package/lib/typescript/src/StaticContainer.d.ts +1 -1
  147. package/lib/typescript/src/StaticContainer.d.ts.map +1 -1
  148. package/lib/typescript/src/StaticNavigation.d.ts +189 -111
  149. package/lib/typescript/src/StaticNavigation.d.ts.map +1 -1
  150. package/lib/typescript/src/StaticTreeContext.d.ts +4 -0
  151. package/lib/typescript/src/StaticTreeContext.d.ts.map +1 -0
  152. package/lib/typescript/src/createNavigationContainerRef.d.ts +1 -1
  153. package/lib/typescript/src/createNavigationContainerRef.d.ts.map +1 -1
  154. package/lib/typescript/src/createNavigatorFactory.d.ts +23 -5
  155. package/lib/typescript/src/createNavigatorFactory.d.ts.map +1 -1
  156. package/lib/typescript/src/findFocusedRoute.d.ts +3 -8
  157. package/lib/typescript/src/findFocusedRoute.d.ts.map +1 -1
  158. package/lib/typescript/src/getActionFromState.d.ts +4 -4
  159. package/lib/typescript/src/getActionFromState.d.ts.map +1 -1
  160. package/lib/typescript/src/getPathFromState.d.ts +3 -3
  161. package/lib/typescript/src/getPathFromState.d.ts.map +1 -1
  162. package/lib/typescript/src/getPatternParts.d.ts +5 -2
  163. package/lib/typescript/src/getPatternParts.d.ts.map +1 -1
  164. package/lib/typescript/src/getStateFromPath.d.ts +4 -7
  165. package/lib/typescript/src/getStateFromPath.d.ts.map +1 -1
  166. package/lib/typescript/src/getStateFromRouteParams.d.ts +3 -0
  167. package/lib/typescript/src/getStateFromRouteParams.d.ts.map +1 -0
  168. package/lib/typescript/src/index.d.ts +36 -33
  169. package/lib/typescript/src/index.d.ts.map +1 -1
  170. package/lib/typescript/src/internal.d.ts +3 -0
  171. package/lib/typescript/src/internal.d.ts.map +1 -0
  172. package/lib/typescript/src/isRecordEqual.d.ts.map +1 -1
  173. package/lib/typescript/src/queryString.d.ts +5 -0
  174. package/lib/typescript/src/queryString.d.ts.map +1 -0
  175. package/lib/typescript/src/theming/ThemeContext.d.ts +1 -1
  176. package/lib/typescript/src/theming/ThemeContext.d.ts.map +1 -1
  177. package/lib/typescript/src/theming/ThemeProvider.d.ts +2 -2
  178. package/lib/typescript/src/theming/ThemeProvider.d.ts.map +1 -1
  179. package/lib/typescript/src/theming/useTheme.d.ts +1 -1
  180. package/lib/typescript/src/theming/useTheme.d.ts.map +1 -1
  181. package/lib/typescript/src/types.d.ts +265 -167
  182. package/lib/typescript/src/types.d.ts.map +1 -1
  183. package/lib/typescript/src/useChildListeners.d.ts +3 -3
  184. package/lib/typescript/src/useChildListeners.d.ts.map +1 -1
  185. package/lib/typescript/src/useDescriptors.d.ts +13 -11
  186. package/lib/typescript/src/useDescriptors.d.ts.map +1 -1
  187. package/lib/typescript/src/useEventEmitter.d.ts +2 -2
  188. package/lib/typescript/src/useEventEmitter.d.ts.map +1 -1
  189. package/lib/typescript/src/useFocusEffect.d.ts.map +1 -1
  190. package/lib/typescript/src/useFocusEvents.d.ts +2 -2
  191. package/lib/typescript/src/useFocusEvents.d.ts.map +1 -1
  192. package/lib/typescript/src/useFocusedListenersChildrenAdapter.d.ts +2 -2
  193. package/lib/typescript/src/useFocusedListenersChildrenAdapter.d.ts.map +1 -1
  194. package/lib/typescript/src/useIsFocused.d.ts +4 -0
  195. package/lib/typescript/src/useIsFocused.d.ts.map +1 -1
  196. package/lib/typescript/src/useKeyedChildListeners.d.ts +4 -3
  197. package/lib/typescript/src/useKeyedChildListeners.d.ts.map +1 -1
  198. package/lib/typescript/src/useLazyValue.d.ts.map +1 -1
  199. package/lib/typescript/src/useNavigation.d.ts +4 -2
  200. package/lib/typescript/src/useNavigation.d.ts.map +1 -1
  201. package/lib/typescript/src/useNavigationBuilder.d.ts +22 -63
  202. package/lib/typescript/src/useNavigationBuilder.d.ts.map +1 -1
  203. package/lib/typescript/src/useNavigationCache.d.ts +6 -5
  204. package/lib/typescript/src/useNavigationCache.d.ts.map +1 -1
  205. package/lib/typescript/src/useNavigationContainerRef.d.ts +1 -1
  206. package/lib/typescript/src/useNavigationContainerRef.d.ts.map +1 -1
  207. package/lib/typescript/src/useNavigationHelpers.d.ts +18 -58
  208. package/lib/typescript/src/useNavigationHelpers.d.ts.map +1 -1
  209. package/lib/typescript/src/useNavigationState.d.ts +19 -3
  210. package/lib/typescript/src/useNavigationState.d.ts.map +1 -1
  211. package/lib/typescript/src/useOnAction.d.ts +9 -9
  212. package/lib/typescript/src/useOnAction.d.ts.map +1 -1
  213. package/lib/typescript/src/useOnGetNavigation.d.ts +12 -0
  214. package/lib/typescript/src/useOnGetNavigation.d.ts.map +1 -0
  215. package/lib/typescript/src/useOnGetState.d.ts +1 -1
  216. package/lib/typescript/src/useOnGetState.d.ts.map +1 -1
  217. package/lib/typescript/src/useOnPreventRemove.d.ts +5 -9
  218. package/lib/typescript/src/useOnPreventRemove.d.ts.map +1 -1
  219. package/lib/typescript/src/useOnRouteFocus.d.ts +6 -6
  220. package/lib/typescript/src/useOnRouteFocus.d.ts.map +1 -1
  221. package/lib/typescript/src/useOptionsGetters.d.ts +4 -4
  222. package/lib/typescript/src/useOptionsGetters.d.ts.map +1 -1
  223. package/lib/typescript/src/usePreventRemove.d.ts.map +1 -1
  224. package/lib/typescript/src/usePreventRemoveContext.d.ts +2 -1
  225. package/lib/typescript/src/usePreventRemoveContext.d.ts.map +1 -1
  226. package/lib/typescript/src/useRegisterNavigator.d.ts.map +1 -1
  227. package/lib/typescript/src/useRoute.d.ts +7 -3
  228. package/lib/typescript/src/useRoute.d.ts.map +1 -1
  229. package/lib/typescript/src/useRouteCache.d.ts +7 -12
  230. package/lib/typescript/src/useRouteCache.d.ts.map +1 -1
  231. package/lib/typescript/src/useScheduleUpdate.d.ts +5 -4
  232. package/lib/typescript/src/useScheduleUpdate.d.ts.map +1 -1
  233. package/lib/typescript/src/useStateForPath.d.ts +1 -1
  234. package/lib/typescript/src/useStateForPath.d.ts.map +1 -1
  235. package/lib/typescript/src/useSyncState.d.ts +1 -0
  236. package/lib/typescript/src/useSyncState.d.ts.map +1 -1
  237. package/lib/typescript/src/utilities.d.ts +79 -39
  238. package/lib/typescript/src/utilities.d.ts.map +1 -1
  239. package/lib/typescript/src/validatePathConfig.d.ts.map +1 -1
  240. package/package.json +26 -22
  241. package/src/BaseNavigationContainer.tsx +459 -332
  242. package/src/ConsumedParamsContext.tsx +5 -0
  243. package/src/DataLoading.tsx +206 -0
  244. package/src/NavigationBuilderContext.tsx +44 -25
  245. package/src/NavigationFocusedRouteStateContext.tsx +4 -4
  246. package/src/NavigationIndependentTree.tsx +60 -12
  247. package/src/NavigationProvider.tsx +59 -21
  248. package/src/NavigationRootContext.tsx +11 -0
  249. package/src/NavigationStateContext.tsx +6 -6
  250. package/src/PreventRemoveContext.tsx +1 -0
  251. package/src/PreventRemoveProvider.tsx +55 -56
  252. package/src/SceneView.tsx +31 -57
  253. package/src/StaticNavigation.tsx +715 -328
  254. package/src/StaticTreeContext.tsx +7 -0
  255. package/src/createNavigationContainerRef.tsx +12 -11
  256. package/src/createNavigatorFactory.tsx +92 -8
  257. package/src/findFocusedRoute.tsx +16 -16
  258. package/src/getActionFromState.tsx +87 -51
  259. package/src/getPathFromState.tsx +310 -134
  260. package/src/getPatternParts.tsx +98 -16
  261. package/src/getStateFromPath.tsx +971 -344
  262. package/src/getStateFromRouteParams.tsx +59 -0
  263. package/src/index.tsx +57 -6
  264. package/src/internal.tsx +2 -0
  265. package/src/isRecordEqual.tsx +3 -1
  266. package/src/queryString.ts +109 -0
  267. package/src/theming/useTheme.tsx +1 -1
  268. package/src/types.tsx +799 -377
  269. package/src/useDescriptors.tsx +151 -43
  270. package/src/useEventEmitter.tsx +53 -39
  271. package/src/useFocusEffect.tsx +5 -2
  272. package/src/useFocusEvents.tsx +19 -8
  273. package/src/useFocusedListenersChildrenAdapter.tsx +3 -3
  274. package/src/useIsFocused.tsx +18 -21
  275. package/src/useKeyedChildListeners.tsx +5 -2
  276. package/src/useLazyValue.tsx +2 -2
  277. package/src/useNavigation.tsx +9 -26
  278. package/src/useNavigationBuilder.tsx +370 -201
  279. package/src/useNavigationCache.tsx +148 -123
  280. package/src/useNavigationHelpers.tsx +27 -37
  281. package/src/useNavigationIndependentTree.tsx +1 -1
  282. package/src/useNavigationState.tsx +207 -69
  283. package/src/useOnAction.tsx +92 -18
  284. package/src/useOnGetNavigation.tsx +30 -0
  285. package/src/useOnGetState.tsx +8 -4
  286. package/src/useOnPreventRemove.tsx +78 -43
  287. package/src/useOnRouteFocus.tsx +11 -15
  288. package/src/useOptionsGetters.tsx +44 -30
  289. package/src/usePreventRemove.tsx +13 -5
  290. package/src/usePreventRemoveContext.tsx +2 -2
  291. package/src/useRegisterNavigator.tsx +4 -4
  292. package/src/useRoute.tsx +20 -6
  293. package/src/useRouteCache.tsx +57 -35
  294. package/src/useScheduleUpdate.tsx +13 -11
  295. package/src/useStateForPath.tsx +1 -1
  296. package/src/useSyncState.tsx +39 -15
  297. package/src/utilities.tsx +151 -35
  298. package/src/validatePathConfig.tsx +86 -57
  299. package/lib/module/CurrentRenderContext.js +0 -10
  300. package/lib/module/CurrentRenderContext.js.map +0 -1
  301. package/lib/module/NavigationMetaContext.js +0 -15
  302. package/lib/module/NavigationMetaContext.js.map +0 -1
  303. package/lib/module/checkSerializable.js +0 -46
  304. package/lib/module/checkSerializable.js.map +0 -1
  305. package/lib/module/useComponent.js +0 -34
  306. package/lib/module/useComponent.js.map +0 -1
  307. package/lib/module/useCurrentRender.js +0 -19
  308. package/lib/module/useCurrentRender.js.map +0 -1
  309. package/lib/typescript/src/CurrentRenderContext.d.ts +0 -9
  310. package/lib/typescript/src/CurrentRenderContext.d.ts.map +0 -1
  311. package/lib/typescript/src/NavigationMetaContext.d.ts +0 -12
  312. package/lib/typescript/src/NavigationMetaContext.d.ts.map +0 -1
  313. package/lib/typescript/src/checkSerializable.d.ts +0 -10
  314. package/lib/typescript/src/checkSerializable.d.ts.map +0 -1
  315. package/lib/typescript/src/useComponent.d.ts +0 -7
  316. package/lib/typescript/src/useComponent.d.ts.map +0 -1
  317. package/lib/typescript/src/useCurrentRender.d.ts +0 -14
  318. package/lib/typescript/src/useCurrentRender.d.ts.map +0 -1
  319. package/src/CurrentRenderContext.tsx +0 -9
  320. package/src/NavigationMetaContext.tsx +0 -14
  321. package/src/checkSerializable.tsx +0 -74
  322. package/src/useComponent.tsx +0 -37
  323. package/src/useCurrentRender.tsx +0 -31
@@ -1,4 +1,3 @@
1
- import { nanoid } from 'nanoid/non-secure';
2
1
  import * as React from 'react';
3
2
  import useLatestCallback from 'use-latest-callback';
4
3
 
@@ -13,13 +12,7 @@ type Props = {
13
12
  children: React.ReactNode;
14
13
  };
15
14
 
16
- type PreventedRoutesMap = Map<
17
- string,
18
- {
19
- routeKey: string;
20
- preventRemove: boolean;
21
- }
22
- >;
15
+ type PreventedRoutesMap = Map<string, string>;
23
16
 
24
17
  /**
25
18
  * Util function to transform map of prevented routes to a simpler object.
@@ -27,17 +20,11 @@ type PreventedRoutesMap = Map<
27
20
  const transformPreventedRoutes = (
28
21
  preventedRoutesMap: PreventedRoutesMap
29
22
  ): PreventedRoutes => {
30
- const preventedRoutesToTransform = [...preventedRoutesMap.values()];
23
+ const preventedRoutes: PreventedRoutes = {};
31
24
 
32
- const preventedRoutes = preventedRoutesToTransform.reduce<PreventedRoutes>(
33
- (acc, { routeKey, preventRemove }) => {
34
- acc[routeKey] = {
35
- preventRemove: acc[routeKey]?.preventRemove || preventRemove,
36
- };
37
- return acc;
38
- },
39
- {}
40
- );
25
+ for (const routeKey of preventedRoutesMap.values()) {
26
+ preventedRoutes[routeKey] = { preventRemove: true };
27
+ }
41
28
 
42
29
  return preventedRoutes;
43
30
  };
@@ -46,61 +33,72 @@ const transformPreventedRoutes = (
46
33
  * Component used for managing which routes have to be prevented from removal in native-stack.
47
34
  */
48
35
  export function PreventRemoveProvider({ children }: Props) {
49
- const [parentId] = React.useState(() => nanoid());
36
+ const parentId = React.useId();
37
+
50
38
  const [preventedRoutesMap, setPreventedRoutesMap] =
51
39
  React.useState<PreventedRoutesMap>(() => new Map());
52
40
 
53
- const navigation = React.useContext(NavigationHelpersContext);
54
- const route = React.useContext(NavigationRouteContext);
41
+ const registry = React.useRef<PreventedRoutesMap>(new Map());
42
+
43
+ const navigation = React.use(NavigationHelpersContext);
44
+ const route = React.use(NavigationRouteContext);
55
45
 
56
- const preventRemoveContextValue = React.useContext(PreventRemoveContext);
46
+ const preventRemoveContextValue = React.use(PreventRemoveContext);
57
47
  // take `setPreventRemove` from parent context - if exist it means we're in a nested context
58
48
  const setParentPrevented = preventRemoveContextValue?.setPreventRemove;
49
+ const notifyParentPrevented = preventRemoveContextValue?.notifyPreventRemove;
59
50
 
60
51
  const setPreventRemove = useLatestCallback(
61
52
  (id: string, routeKey: string, preventRemove: boolean): void => {
62
- if (
63
- preventRemove &&
64
- (navigation == null ||
65
- navigation
66
- ?.getState()
67
- .routes.every((route) => route.key !== routeKey))
68
- ) {
53
+ if (preventRemove && navigation == null) {
69
54
  throw new Error(
70
- `Couldn't find a route with the key ${routeKey}. Is your component inside NavigationContent?`
55
+ "Couldn't find a navigation object. This is likely a bug in the navigator.\n\nIf you're using a custom navigator, make sure that the navigator content is wrapped by the 'render' function returned by 'useNavigationBuilder'."
71
56
  );
72
57
  }
73
58
 
74
- setPreventedRoutesMap((prevPrevented) => {
75
- // values haven't changed - do nothing
76
- if (
77
- routeKey === prevPrevented.get(id)?.routeKey &&
78
- preventRemove === prevPrevented.get(id)?.preventRemove
79
- ) {
80
- return prevPrevented;
81
- }
82
-
83
- const nextPrevented = new Map(prevPrevented);
84
-
85
- if (preventRemove) {
86
- nextPrevented.set(id, {
87
- routeKey,
88
- preventRemove,
89
- });
90
- } else {
91
- nextPrevented.delete(id);
92
- }
93
-
94
- return nextPrevented;
95
- });
59
+ if (preventRemove) {
60
+ registry.current.set(id, routeKey);
61
+ } else {
62
+ registry.current.delete(id);
63
+ }
96
64
  }
97
65
  );
98
66
 
99
- const isPrevented = [...preventedRoutesMap.values()].some(
100
- ({ preventRemove }) => preventRemove
101
- );
67
+ const notifyPreventRemove = useLatestCallback(() => {
68
+ // eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect
69
+ setPreventedRoutesMap((prevPrevented) => {
70
+ const nextPrevented = registry.current;
102
71
 
72
+ const hasChanged =
73
+ prevPrevented.size !== nextPrevented.size ||
74
+ [...nextPrevented].some(
75
+ ([id, routeKey]) => prevPrevented.get(id) !== routeKey
76
+ );
77
+
78
+ // values haven't changed - do nothing
79
+ if (!hasChanged) {
80
+ return prevPrevented;
81
+ }
82
+
83
+ return new Map(nextPrevented);
84
+ });
85
+ });
86
+
87
+ // Sync the state on every commit in case the registry was changed by a screen
88
+ // unmounting while hidden with `<Activity>`, where no passive effects run
89
+ // Also notify the parent so nested prevention propagates upwards
103
90
  React.useEffect(() => {
91
+ notifyPreventRemove();
92
+ notifyParentPrevented?.();
93
+
94
+ return () => {
95
+ notifyParentPrevented?.();
96
+ };
97
+ });
98
+
99
+ const isPrevented = preventedRoutesMap.size > 0;
100
+
101
+ React.useInsertionEffect(() => {
104
102
  if (route?.key !== undefined && setParentPrevented !== undefined) {
105
103
  // when route is defined (and setParentPrevented) it means we're in a nested stack
106
104
  // route.key then will be the route key of parent
@@ -116,9 +114,10 @@ export function PreventRemoveProvider({ children }: Props) {
116
114
  const value = React.useMemo(
117
115
  () => ({
118
116
  setPreventRemove,
117
+ notifyPreventRemove,
119
118
  preventedRoutes: transformPreventedRoutes(preventedRoutesMap),
120
119
  }),
121
- [setPreventRemove, preventedRoutesMap]
120
+ [setPreventRemove, notifyPreventRemove, preventedRoutesMap]
122
121
  );
123
122
 
124
123
  return (
package/src/SceneView.tsx CHANGED
@@ -15,15 +15,17 @@ import {
15
15
  import { NavigationStateContext } from './NavigationStateContext';
16
16
  import { StaticContainer } from './StaticContainer';
17
17
  import type { NavigationProp, RouteConfigComponent } from './types';
18
- import { useOptionsGetters } from './useOptionsGetters';
18
+ import { OptionsGetterContext, useOptionsGetters } from './useOptionsGetters';
19
19
 
20
20
  type Props<State extends NavigationState, ScreenOptions extends {}> = {
21
21
  screen: RouteConfigComponent<ParamListBase, string> & { name: string };
22
22
  navigation: NavigationProp<ParamListBase, string, State, ScreenOptions>;
23
23
  route: Route<string>;
24
24
  routeState: NavigationState | PartialState<NavigationState> | undefined;
25
+ getFocusedRouteKey: () => string | undefined;
25
26
  getState: () => State;
26
27
  setState: (state: State) => void;
28
+ subscribe: (callback: () => void) => () => void;
27
29
  options: object;
28
30
  clearOptions: () => void;
29
31
  };
@@ -40,8 +42,10 @@ export function SceneView<
40
42
  route,
41
43
  navigation,
42
44
  routeState,
45
+ getFocusedRouteKey,
43
46
  getState,
44
47
  setState,
48
+ subscribe,
45
49
  options,
46
50
  clearOptions,
47
51
  }: Props<State, ScreenOptions>) {
@@ -51,7 +55,7 @@ export function SceneView<
51
55
  const { addOptionsGetter } = useOptionsGetters({
52
56
  key: route.key,
53
57
  options,
54
- navigation,
58
+ getFocusedRouteKey,
55
59
  });
56
60
 
57
61
  const setKey = React.useCallback((key: string) => {
@@ -70,46 +74,16 @@ export function SceneView<
70
74
  const state = getState();
71
75
 
72
76
  const routes = state.routes.map((r) => {
73
- if (r.key !== route.key) {
74
- return r;
77
+ if (r.key === route.key && r.state !== child) {
78
+ return {
79
+ ...r,
80
+ state: child,
81
+ };
75
82
  }
76
83
 
77
- const nextRoute = r.state !== child ? { ...r, state: child } : r;
78
-
79
- // Before updating the state, cleanup any nested screen and state
80
- // This will avoid the navigator trying to handle them again
81
- if (
82
- nextRoute.params &&
83
- (('state' in nextRoute.params &&
84
- typeof nextRoute.params.state === 'object' &&
85
- nextRoute.params.state !== null) ||
86
- ('screen' in nextRoute.params &&
87
- typeof nextRoute.params.screen === 'string'))
88
- ) {
89
- // @ts-expect-error: we don't have correct type for params
90
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
91
- const { state, screen, params, initial, ...rest } = nextRoute.params;
92
-
93
- if (Object.keys(rest).length) {
94
- return { ...nextRoute, params: rest };
95
- } else {
96
- const {
97
- // We destructure the params to omit them
98
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
99
- params,
100
- ...restRoute
101
- } = nextRoute;
102
-
103
- return restRoute;
104
- }
105
- }
106
-
107
- return nextRoute;
84
+ return r;
108
85
  });
109
86
 
110
- // Make sure not to update state if routes haven't changed
111
- // Otherwise this will result in params cleanup as well
112
- // We only want to cleanup params when state changes - after they are used
113
87
  if (!isArrayEqual(state.routes, routes)) {
114
88
  setState({
115
89
  ...state,
@@ -134,9 +108,7 @@ export function SceneView<
134
108
 
135
109
  const getIsInitial = React.useCallback(() => isInitialRef.current, []);
136
110
 
137
- const parentFocusedRouteState = React.useContext(
138
- NavigationFocusedRouteStateContext
139
- );
111
+ const parentFocusedRouteState = React.use(NavigationFocusedRouteStateContext);
140
112
 
141
113
  const focusedRouteState = React.useMemo(() => {
142
114
  const state: FocusedRouteState = {
@@ -184,19 +156,19 @@ export function SceneView<
184
156
  state: routeState,
185
157
  getState: getCurrentState,
186
158
  setState: setCurrentState,
159
+ subscribe,
187
160
  getKey,
188
161
  setKey,
189
162
  getIsInitial,
190
- addOptionsGetter,
191
163
  }),
192
164
  [
193
165
  routeState,
194
166
  getCurrentState,
195
167
  setCurrentState,
168
+ subscribe,
196
169
  getKey,
197
170
  setKey,
198
171
  getIsInitial,
199
- addOptionsGetter,
200
172
  ]
201
173
  );
202
174
 
@@ -207,20 +179,22 @@ export function SceneView<
207
179
  return (
208
180
  <NavigationStateContext.Provider value={context}>
209
181
  <NavigationFocusedRouteStateContext.Provider value={focusedRouteState}>
210
- <EnsureSingleNavigator>
211
- <StaticContainer
212
- name={screen.name}
213
- render={ScreenComponent || screen.children}
214
- navigation={navigation}
215
- route={route}
216
- >
217
- {ScreenComponent !== undefined ? (
218
- <ScreenComponent navigation={navigation} route={route} />
219
- ) : screen.children !== undefined ? (
220
- screen.children({ navigation, route })
221
- ) : null}
222
- </StaticContainer>
223
- </EnsureSingleNavigator>
182
+ <OptionsGetterContext.Provider value={addOptionsGetter}>
183
+ <EnsureSingleNavigator>
184
+ <StaticContainer
185
+ name={screen.name}
186
+ render={ScreenComponent || screen.children}
187
+ navigation={navigation}
188
+ route={route}
189
+ >
190
+ {ScreenComponent !== undefined ? (
191
+ <ScreenComponent navigation={navigation} route={route} />
192
+ ) : screen.children !== undefined ? (
193
+ screen.children({ navigation, route })
194
+ ) : null}
195
+ </StaticContainer>
196
+ </EnsureSingleNavigator>
197
+ </OptionsGetterContext.Provider>
224
198
  </NavigationFocusedRouteStateContext.Provider>
225
199
  </NavigationStateContext.Provider>
226
200
  );