@react-navigation/core 8.0.0-alpha.4 → 8.0.0-alpha.40
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.
- package/README.md +17 -14
- package/lib/module/BaseNavigationContainer.js +168 -87
- package/lib/module/BaseNavigationContainer.js.map +1 -1
- package/lib/module/ConsumedParamsContext.js +5 -0
- package/lib/module/ConsumedParamsContext.js.map +1 -0
- package/lib/module/DataLoading.js +129 -0
- package/lib/module/DataLoading.js.map +1 -0
- package/lib/module/NavigationBuilderContext.js +7 -10
- package/lib/module/NavigationBuilderContext.js.map +1 -1
- package/lib/module/NavigationIndependentTree.js +54 -9
- package/lib/module/NavigationIndependentTree.js.map +1 -1
- package/lib/module/NavigationProvider.js +36 -11
- package/lib/module/NavigationProvider.js.map +1 -1
- package/lib/module/NavigationRootContext.js +8 -0
- package/lib/module/NavigationRootContext.js.map +1 -0
- package/lib/module/NavigationStateContext.js +3 -0
- package/lib/module/NavigationStateContext.js.map +1 -1
- package/lib/module/PreventRemoveContext.js.map +1 -1
- package/lib/module/PreventRemoveProvider.js +40 -31
- package/lib/module/PreventRemoveProvider.js.map +1 -1
- package/lib/module/SceneView.js +12 -42
- package/lib/module/SceneView.js.map +1 -1
- package/lib/module/StaticNavigation.js +219 -67
- package/lib/module/StaticNavigation.js.map +1 -1
- package/lib/module/StaticTreeContext.js +5 -0
- package/lib/module/StaticTreeContext.js.map +1 -0
- package/lib/module/createNavigationContainerRef.js +7 -9
- package/lib/module/createNavigationContainerRef.js.map +1 -1
- package/lib/module/createNavigatorFactory.js +27 -5
- package/lib/module/createNavigatorFactory.js.map +1 -1
- package/lib/module/findFocusedRoute.js +7 -4
- package/lib/module/findFocusedRoute.js.map +1 -1
- package/lib/module/getActionFromState.js +45 -20
- package/lib/module/getActionFromState.js.map +1 -1
- package/lib/module/getPathFromState.js +204 -94
- package/lib/module/getPathFromState.js.map +1 -1
- package/lib/module/getPatternParts.js +61 -14
- package/lib/module/getPatternParts.js.map +1 -1
- package/lib/module/getStateFromPath.js +608 -272
- package/lib/module/getStateFromPath.js.map +1 -1
- package/lib/module/getStateFromRouteParams.js +23 -0
- package/lib/module/getStateFromRouteParams.js.map +1 -0
- package/lib/module/index.js +7 -6
- package/lib/module/index.js.map +1 -1
- package/lib/module/internal.js +2 -0
- package/lib/module/internal.js.map +1 -0
- package/lib/module/isRecordEqual.js +1 -1
- package/lib/module/isRecordEqual.js.map +1 -1
- package/lib/module/queryString.js +71 -0
- package/lib/module/queryString.js.map +1 -0
- package/lib/module/theming/useTheme.js +1 -1
- package/lib/module/theming/useTheme.js.map +1 -1
- package/lib/module/types.js +35 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/useDescriptors.js +65 -25
- package/lib/module/useDescriptors.js.map +1 -1
- package/lib/module/useEventEmitter.js +48 -33
- package/lib/module/useEventEmitter.js.map +1 -1
- package/lib/module/useFocusEffect.js +4 -2
- package/lib/module/useFocusEffect.js.map +1 -1
- package/lib/module/useFocusEvents.js +15 -5
- package/lib/module/useFocusEvents.js.map +1 -1
- package/lib/module/useFocusedListenersChildrenAdapter.js +3 -3
- package/lib/module/useFocusedListenersChildrenAdapter.js.map +1 -1
- package/lib/module/useIsFocused.js +8 -12
- package/lib/module/useIsFocused.js.map +1 -1
- package/lib/module/useKeyedChildListeners.js +5 -2
- package/lib/module/useKeyedChildListeners.js.map +1 -1
- package/lib/module/useLazyValue.js.map +1 -1
- package/lib/module/useNavigation.js +4 -17
- package/lib/module/useNavigation.js.map +1 -1
- package/lib/module/useNavigationBuilder.js +244 -147
- package/lib/module/useNavigationBuilder.js.map +1 -1
- package/lib/module/useNavigationCache.js +92 -89
- package/lib/module/useNavigationCache.js.map +1 -1
- package/lib/module/useNavigationHelpers.js +22 -29
- package/lib/module/useNavigationHelpers.js.map +1 -1
- package/lib/module/useNavigationIndependentTree.js +1 -1
- package/lib/module/useNavigationIndependentTree.js.map +1 -1
- package/lib/module/useNavigationState.js +158 -46
- package/lib/module/useNavigationState.js.map +1 -1
- package/lib/module/useOnAction.js +58 -11
- package/lib/module/useOnAction.js.map +1 -1
- package/lib/module/useOnGetNavigation.js +26 -0
- package/lib/module/useOnGetNavigation.js.map +1 -0
- package/lib/module/useOnGetState.js +7 -4
- package/lib/module/useOnGetState.js.map +1 -1
- package/lib/module/useOnPreventRemove.js +40 -31
- package/lib/module/useOnPreventRemove.js.map +1 -1
- package/lib/module/useOnRouteFocus.js +2 -2
- package/lib/module/useOnRouteFocus.js.map +1 -1
- package/lib/module/useOptionsGetters.js +34 -24
- package/lib/module/useOptionsGetters.js.map +1 -1
- package/lib/module/usePreventRemove.js +11 -5
- package/lib/module/usePreventRemove.js.map +1 -1
- package/lib/module/usePreventRemoveContext.js +2 -2
- package/lib/module/usePreventRemoveContext.js.map +1 -1
- package/lib/module/useRegisterNavigator.js +3 -4
- package/lib/module/useRegisterNavigator.js.map +1 -1
- package/lib/module/useRoute.js +2 -0
- package/lib/module/useRoute.js.map +1 -1
- package/lib/module/useRouteCache.js +51 -35
- package/lib/module/useRouteCache.js.map +1 -1
- package/lib/module/useScheduleUpdate.js +12 -10
- package/lib/module/useScheduleUpdate.js.map +1 -1
- package/lib/module/useStateForPath.js +1 -1
- package/lib/module/useStateForPath.js.map +1 -1
- package/lib/module/useSyncState.js +37 -15
- package/lib/module/useSyncState.js.map +1 -1
- package/lib/module/validatePathConfig.js +50 -36
- package/lib/module/validatePathConfig.js.map +1 -1
- package/lib/typescript/src/BaseNavigationContainer.d.ts +6 -3
- package/lib/typescript/src/BaseNavigationContainer.d.ts.map +1 -1
- package/lib/typescript/src/ConsumedParamsContext.d.ts +3 -0
- package/lib/typescript/src/ConsumedParamsContext.d.ts.map +1 -0
- package/lib/typescript/src/DataLoading.d.ts +21 -0
- package/lib/typescript/src/DataLoading.d.ts.map +1 -0
- package/lib/typescript/src/EnsureSingleNavigator.d.ts +1 -1
- package/lib/typescript/src/EnsureSingleNavigator.d.ts.map +1 -1
- package/lib/typescript/src/Group.d.ts +1 -1
- package/lib/typescript/src/Group.d.ts.map +1 -1
- package/lib/typescript/src/NavigationBuilderContext.d.ts +22 -14
- package/lib/typescript/src/NavigationBuilderContext.d.ts.map +1 -1
- package/lib/typescript/src/NavigationContainerRefContext.d.ts +1 -1
- package/lib/typescript/src/NavigationContainerRefContext.d.ts.map +1 -1
- package/lib/typescript/src/NavigationFocusedRouteStateContext.d.ts +4 -4
- package/lib/typescript/src/NavigationFocusedRouteStateContext.d.ts.map +1 -1
- package/lib/typescript/src/NavigationHelpersContext.d.ts +1 -1
- package/lib/typescript/src/NavigationHelpersContext.d.ts.map +1 -1
- package/lib/typescript/src/NavigationIndependentTree.d.ts +1 -1
- package/lib/typescript/src/NavigationIndependentTree.d.ts.map +1 -1
- package/lib/typescript/src/NavigationProvider.d.ts +21 -18
- package/lib/typescript/src/NavigationProvider.d.ts.map +1 -1
- package/lib/typescript/src/NavigationRootContext.d.ts +8 -0
- package/lib/typescript/src/NavigationRootContext.d.ts.map +1 -0
- package/lib/typescript/src/NavigationStateContext.d.ts +4 -3
- package/lib/typescript/src/NavigationStateContext.d.ts.map +1 -1
- package/lib/typescript/src/PreventRemoveContext.d.ts +1 -0
- package/lib/typescript/src/PreventRemoveContext.d.ts.map +1 -1
- package/lib/typescript/src/PreventRemoveProvider.d.ts +1 -1
- package/lib/typescript/src/PreventRemoveProvider.d.ts.map +1 -1
- package/lib/typescript/src/SceneView.d.ts +5 -2
- package/lib/typescript/src/SceneView.d.ts.map +1 -1
- package/lib/typescript/src/Screen.d.ts +1 -1
- package/lib/typescript/src/Screen.d.ts.map +1 -1
- package/lib/typescript/src/StaticContainer.d.ts +1 -1
- package/lib/typescript/src/StaticContainer.d.ts.map +1 -1
- package/lib/typescript/src/StaticNavigation.d.ts +189 -111
- package/lib/typescript/src/StaticNavigation.d.ts.map +1 -1
- package/lib/typescript/src/StaticTreeContext.d.ts +4 -0
- package/lib/typescript/src/StaticTreeContext.d.ts.map +1 -0
- package/lib/typescript/src/createNavigationContainerRef.d.ts +1 -1
- package/lib/typescript/src/createNavigationContainerRef.d.ts.map +1 -1
- package/lib/typescript/src/createNavigatorFactory.d.ts +23 -5
- package/lib/typescript/src/createNavigatorFactory.d.ts.map +1 -1
- package/lib/typescript/src/findFocusedRoute.d.ts +3 -8
- package/lib/typescript/src/findFocusedRoute.d.ts.map +1 -1
- package/lib/typescript/src/getActionFromState.d.ts +4 -4
- package/lib/typescript/src/getActionFromState.d.ts.map +1 -1
- package/lib/typescript/src/getPathFromState.d.ts +3 -3
- package/lib/typescript/src/getPathFromState.d.ts.map +1 -1
- package/lib/typescript/src/getPatternParts.d.ts +5 -2
- package/lib/typescript/src/getPatternParts.d.ts.map +1 -1
- package/lib/typescript/src/getStateFromPath.d.ts +4 -7
- package/lib/typescript/src/getStateFromPath.d.ts.map +1 -1
- package/lib/typescript/src/getStateFromRouteParams.d.ts +3 -0
- package/lib/typescript/src/getStateFromRouteParams.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +36 -33
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/internal.d.ts +3 -0
- package/lib/typescript/src/internal.d.ts.map +1 -0
- package/lib/typescript/src/isRecordEqual.d.ts.map +1 -1
- package/lib/typescript/src/queryString.d.ts +5 -0
- package/lib/typescript/src/queryString.d.ts.map +1 -0
- package/lib/typescript/src/theming/ThemeContext.d.ts +1 -1
- package/lib/typescript/src/theming/ThemeContext.d.ts.map +1 -1
- package/lib/typescript/src/theming/ThemeProvider.d.ts +2 -2
- package/lib/typescript/src/theming/ThemeProvider.d.ts.map +1 -1
- package/lib/typescript/src/theming/useTheme.d.ts +1 -1
- package/lib/typescript/src/theming/useTheme.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +265 -167
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/useChildListeners.d.ts +3 -3
- package/lib/typescript/src/useChildListeners.d.ts.map +1 -1
- package/lib/typescript/src/useDescriptors.d.ts +13 -11
- package/lib/typescript/src/useDescriptors.d.ts.map +1 -1
- package/lib/typescript/src/useEventEmitter.d.ts +2 -2
- package/lib/typescript/src/useEventEmitter.d.ts.map +1 -1
- package/lib/typescript/src/useFocusEffect.d.ts.map +1 -1
- package/lib/typescript/src/useFocusEvents.d.ts +2 -2
- package/lib/typescript/src/useFocusEvents.d.ts.map +1 -1
- package/lib/typescript/src/useFocusedListenersChildrenAdapter.d.ts +2 -2
- package/lib/typescript/src/useFocusedListenersChildrenAdapter.d.ts.map +1 -1
- package/lib/typescript/src/useIsFocused.d.ts +4 -0
- package/lib/typescript/src/useIsFocused.d.ts.map +1 -1
- package/lib/typescript/src/useKeyedChildListeners.d.ts +4 -3
- package/lib/typescript/src/useKeyedChildListeners.d.ts.map +1 -1
- package/lib/typescript/src/useLazyValue.d.ts.map +1 -1
- package/lib/typescript/src/useNavigation.d.ts +4 -2
- package/lib/typescript/src/useNavigation.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationBuilder.d.ts +22 -63
- package/lib/typescript/src/useNavigationBuilder.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationCache.d.ts +6 -5
- package/lib/typescript/src/useNavigationCache.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationContainerRef.d.ts +1 -1
- package/lib/typescript/src/useNavigationContainerRef.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationHelpers.d.ts +18 -58
- package/lib/typescript/src/useNavigationHelpers.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationState.d.ts +19 -3
- package/lib/typescript/src/useNavigationState.d.ts.map +1 -1
- package/lib/typescript/src/useOnAction.d.ts +9 -9
- package/lib/typescript/src/useOnAction.d.ts.map +1 -1
- package/lib/typescript/src/useOnGetNavigation.d.ts +12 -0
- package/lib/typescript/src/useOnGetNavigation.d.ts.map +1 -0
- package/lib/typescript/src/useOnGetState.d.ts +1 -1
- package/lib/typescript/src/useOnGetState.d.ts.map +1 -1
- package/lib/typescript/src/useOnPreventRemove.d.ts +5 -9
- package/lib/typescript/src/useOnPreventRemove.d.ts.map +1 -1
- package/lib/typescript/src/useOnRouteFocus.d.ts +6 -6
- package/lib/typescript/src/useOnRouteFocus.d.ts.map +1 -1
- package/lib/typescript/src/useOptionsGetters.d.ts +2 -4
- package/lib/typescript/src/useOptionsGetters.d.ts.map +1 -1
- package/lib/typescript/src/usePreventRemove.d.ts.map +1 -1
- package/lib/typescript/src/usePreventRemoveContext.d.ts +2 -1
- package/lib/typescript/src/usePreventRemoveContext.d.ts.map +1 -1
- package/lib/typescript/src/useRegisterNavigator.d.ts.map +1 -1
- package/lib/typescript/src/useRoute.d.ts +7 -3
- package/lib/typescript/src/useRoute.d.ts.map +1 -1
- package/lib/typescript/src/useRouteCache.d.ts +7 -12
- package/lib/typescript/src/useRouteCache.d.ts.map +1 -1
- package/lib/typescript/src/useScheduleUpdate.d.ts +5 -4
- package/lib/typescript/src/useScheduleUpdate.d.ts.map +1 -1
- package/lib/typescript/src/useStateForPath.d.ts +1 -1
- package/lib/typescript/src/useStateForPath.d.ts.map +1 -1
- package/lib/typescript/src/useSyncState.d.ts +1 -0
- package/lib/typescript/src/useSyncState.d.ts.map +1 -1
- package/lib/typescript/src/utilities.d.ts +79 -39
- package/lib/typescript/src/utilities.d.ts.map +1 -1
- package/lib/typescript/src/validatePathConfig.d.ts.map +1 -1
- package/package.json +26 -22
- package/src/BaseNavigationContainer.tsx +468 -333
- package/src/ConsumedParamsContext.tsx +5 -0
- package/src/DataLoading.tsx +206 -0
- package/src/NavigationBuilderContext.tsx +44 -25
- package/src/NavigationFocusedRouteStateContext.tsx +4 -4
- package/src/NavigationIndependentTree.tsx +60 -12
- package/src/NavigationProvider.tsx +47 -20
- package/src/NavigationRootContext.tsx +11 -0
- package/src/NavigationStateContext.tsx +9 -6
- package/src/PreventRemoveContext.tsx +1 -0
- package/src/PreventRemoveProvider.tsx +55 -56
- package/src/SceneView.tsx +14 -40
- package/src/StaticNavigation.tsx +715 -328
- package/src/StaticTreeContext.tsx +7 -0
- package/src/createNavigationContainerRef.tsx +12 -11
- package/src/createNavigatorFactory.tsx +92 -8
- package/src/findFocusedRoute.tsx +16 -16
- package/src/getActionFromState.tsx +87 -51
- package/src/getPathFromState.tsx +310 -134
- package/src/getPatternParts.tsx +98 -16
- package/src/getStateFromPath.tsx +971 -344
- package/src/getStateFromRouteParams.tsx +59 -0
- package/src/index.tsx +57 -6
- package/src/internal.tsx +2 -0
- package/src/isRecordEqual.tsx +3 -1
- package/src/queryString.ts +109 -0
- package/src/theming/useTheme.tsx +1 -1
- package/src/types.tsx +799 -377
- package/src/useDescriptors.tsx +151 -43
- package/src/useEventEmitter.tsx +53 -39
- package/src/useFocusEffect.tsx +5 -2
- package/src/useFocusEvents.tsx +19 -8
- package/src/useFocusedListenersChildrenAdapter.tsx +3 -3
- package/src/useIsFocused.tsx +18 -21
- package/src/useKeyedChildListeners.tsx +5 -2
- package/src/useLazyValue.tsx +2 -2
- package/src/useNavigation.tsx +9 -26
- package/src/useNavigationBuilder.tsx +370 -201
- package/src/useNavigationCache.tsx +148 -123
- package/src/useNavigationHelpers.tsx +27 -37
- package/src/useNavigationIndependentTree.tsx +1 -1
- package/src/useNavigationState.tsx +207 -69
- package/src/useOnAction.tsx +92 -18
- package/src/useOnGetNavigation.tsx +30 -0
- package/src/useOnGetState.tsx +8 -4
- package/src/useOnPreventRemove.tsx +78 -43
- package/src/useOnRouteFocus.tsx +11 -15
- package/src/useOptionsGetters.tsx +41 -28
- package/src/usePreventRemove.tsx +13 -5
- package/src/usePreventRemoveContext.tsx +2 -2
- package/src/useRegisterNavigator.tsx +4 -4
- package/src/useRoute.tsx +20 -6
- package/src/useRouteCache.tsx +57 -35
- package/src/useScheduleUpdate.tsx +13 -11
- package/src/useStateForPath.tsx +1 -1
- package/src/useSyncState.tsx +39 -15
- package/src/utilities.tsx +151 -35
- package/src/validatePathConfig.tsx +86 -57
- package/lib/module/CurrentRenderContext.js +0 -10
- package/lib/module/CurrentRenderContext.js.map +0 -1
- package/lib/module/NavigationMetaContext.js +0 -15
- package/lib/module/NavigationMetaContext.js.map +0 -1
- package/lib/module/checkSerializable.js +0 -46
- package/lib/module/checkSerializable.js.map +0 -1
- package/lib/module/useComponent.js +0 -34
- package/lib/module/useComponent.js.map +0 -1
- package/lib/module/useCurrentRender.js +0 -19
- package/lib/module/useCurrentRender.js.map +0 -1
- package/lib/typescript/src/CurrentRenderContext.d.ts +0 -9
- package/lib/typescript/src/CurrentRenderContext.d.ts.map +0 -1
- package/lib/typescript/src/NavigationMetaContext.d.ts +0 -12
- package/lib/typescript/src/NavigationMetaContext.d.ts.map +0 -1
- package/lib/typescript/src/checkSerializable.d.ts +0 -10
- package/lib/typescript/src/checkSerializable.d.ts.map +0 -1
- package/lib/typescript/src/useComponent.d.ts +0 -7
- package/lib/typescript/src/useComponent.d.ts.map +0 -1
- package/lib/typescript/src/useCurrentRender.d.ts +0 -14
- package/lib/typescript/src/useCurrentRender.d.ts.map +0 -1
- package/src/CurrentRenderContext.tsx +0 -9
- package/src/NavigationMetaContext.tsx +0 -14
- package/src/checkSerializable.tsx +0 -74
- package/src/useComponent.tsx +0 -37
- 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
|
|
23
|
+
const preventedRoutes: PreventedRoutes = {};
|
|
31
24
|
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
36
|
+
const parentId = React.useId();
|
|
37
|
+
|
|
50
38
|
const [preventedRoutesMap, setPreventedRoutesMap] =
|
|
51
39
|
React.useState<PreventedRoutesMap>(() => new Map());
|
|
52
40
|
|
|
53
|
-
const
|
|
54
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
100
|
-
|
|
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
|
@@ -22,8 +22,10 @@ type Props<State extends NavigationState, ScreenOptions extends {}> = {
|
|
|
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
|
-
|
|
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
|
|
74
|
-
return
|
|
77
|
+
if (r.key === route.key && r.state !== child) {
|
|
78
|
+
return {
|
|
79
|
+
...r,
|
|
80
|
+
state: child,
|
|
81
|
+
};
|
|
75
82
|
}
|
|
76
83
|
|
|
77
|
-
|
|
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.
|
|
138
|
-
NavigationFocusedRouteStateContext
|
|
139
|
-
);
|
|
111
|
+
const parentFocusedRouteState = React.use(NavigationFocusedRouteStateContext);
|
|
140
112
|
|
|
141
113
|
const focusedRouteState = React.useMemo(() => {
|
|
142
114
|
const state: FocusedRouteState = {
|
|
@@ -184,6 +156,7 @@ 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,
|
|
@@ -193,6 +166,7 @@ export function SceneView<
|
|
|
193
166
|
routeState,
|
|
194
167
|
getCurrentState,
|
|
195
168
|
setCurrentState,
|
|
169
|
+
subscribe,
|
|
196
170
|
getKey,
|
|
197
171
|
setKey,
|
|
198
172
|
getIsInitial,
|