@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,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { useNavigationBuilderContext } from "./NavigationBuilderContext.js";
|
|
5
5
|
/**
|
|
6
6
|
* Hook to handle focus actions for a route.
|
|
7
7
|
* Focus action needs to be treated specially, coz when a nested route is focused,
|
|
@@ -15,7 +15,7 @@ export function useOnRouteFocus({
|
|
|
15
15
|
}) {
|
|
16
16
|
const {
|
|
17
17
|
onRouteFocus: onRouteFocusParent
|
|
18
|
-
} =
|
|
18
|
+
} = useNavigationBuilderContext();
|
|
19
19
|
return React.useCallback(key => {
|
|
20
20
|
const state = getState();
|
|
21
21
|
const result = router.getStateForRouteFocus(state, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","
|
|
1
|
+
{"version":3,"names":["React","useNavigationBuilderContext","useOnRouteFocus","router","getState","key","sourceRouteKey","setState","onRouteFocus","onRouteFocusParent","useCallback","state","result","getStateForRouteFocus","undefined"],"sourceRoot":"../../src","sources":["useOnRouteFocus.tsx"],"mappings":";;AAKA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,2BAA2B,QAAQ,+BAA4B;AASxE;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAG7B;EAAEC,MAAM;EAAEC,QAAQ;EAAEC,GAAG,EAAEC,cAAc;EAAEC;AAAiC,CAAC,EAAE;EAC7E,MAAM;IAAEC,YAAY,EAAEC;EAAmB,CAAC,GAAGR,2BAA2B,CAAC,CAAC;EAE1E,OAAOD,KAAK,CAACU,WAAW,CACrBL,GAAW,IAAK;IACf,MAAMM,KAAK,GAAGP,QAAQ,CAAC,CAAC;IACxB,MAAMQ,MAAM,GAAGT,MAAM,CAACU,qBAAqB,CAACF,KAAK,EAAEN,GAAG,CAAC;IAEvD,IAAIO,MAAM,KAAKD,KAAK,EAAE;MACpBJ,QAAQ,CAACK,MAAM,CAAC;IAClB;IAEA,IAAIH,kBAAkB,KAAKK,SAAS,IAAIR,cAAc,KAAKQ,SAAS,EAAE;MACpEL,kBAAkB,CAACH,cAAc,CAAC;IACpC;EACF,CAAC,EACD,CAACF,QAAQ,EAAEK,kBAAkB,EAAEN,MAAM,EAAEI,QAAQ,EAAED,cAAc,CACjE,CAAC;AACH","ignoreList":[]}
|
|
@@ -3,31 +3,25 @@
|
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { NavigationBuilderContext } from "./NavigationBuilderContext.js";
|
|
5
5
|
import { NavigationStateContext } from "./NavigationStateContext.js";
|
|
6
|
+
import { IsFocusedContext } from "./useIsFocused.js";
|
|
6
7
|
export function useOptionsGetters({
|
|
7
8
|
key,
|
|
8
9
|
options,
|
|
9
|
-
|
|
10
|
+
getFocusedRouteKey
|
|
10
11
|
}) {
|
|
12
|
+
const isFocused = React.use(IsFocusedContext) ?? true;
|
|
11
13
|
const optionsRef = React.useRef(options);
|
|
12
14
|
const optionsGettersFromChildRef = React.useRef({});
|
|
13
|
-
const
|
|
14
|
-
onOptionsChange
|
|
15
|
-
} = React.useContext(NavigationBuilderContext);
|
|
15
|
+
const onOptionsChange = React.use(NavigationBuilderContext)?.onOptionsChange;
|
|
16
16
|
const {
|
|
17
17
|
addOptionsGetter: parentAddOptionsGetter
|
|
18
|
-
} = React.
|
|
19
|
-
|
|
20
|
-
const isFocused = navigation?.isFocused() ?? true;
|
|
21
|
-
const hasChildren = Object.keys(optionsGettersFromChildRef.current).length;
|
|
22
|
-
if (isFocused && !hasChildren) {
|
|
23
|
-
onOptionsChange(optionsRef.current ?? {});
|
|
24
|
-
}
|
|
25
|
-
}, [navigation, onOptionsChange]);
|
|
26
|
-
React.useEffect(() => {
|
|
18
|
+
} = React.use(NavigationStateContext);
|
|
19
|
+
React.useInsertionEffect(() => {
|
|
27
20
|
optionsRef.current = options;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
}, [options]);
|
|
22
|
+
React.useEffect(() => {
|
|
23
|
+
onOptionsChange?.();
|
|
24
|
+
}, [isFocused, onOptionsChange, options]);
|
|
31
25
|
const getOptionsFromListener = React.useCallback(() => {
|
|
32
26
|
for (const key in optionsGettersFromChildRef.current) {
|
|
33
27
|
if (key in optionsGettersFromChildRef.current) {
|
|
@@ -42,8 +36,11 @@ export function useOptionsGetters({
|
|
|
42
36
|
return null;
|
|
43
37
|
}, []);
|
|
44
38
|
const getCurrentOptions = React.useCallback(() => {
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
// We use focused route key from the navigator instead of `isFocused`
|
|
40
|
+
// Because `isFocused` may reflect the value the screen last rendered with,
|
|
41
|
+
// e.g. if `Activity` hides the screen before it rendered the new value,
|
|
42
|
+
// it updates at a lower priority, so it may be delayed.
|
|
43
|
+
if (key != null && getFocusedRouteKey?.() !== key) {
|
|
47
44
|
return null;
|
|
48
45
|
}
|
|
49
46
|
const optionsFromListener = getOptionsFromListener();
|
|
@@ -51,19 +48,32 @@ export function useOptionsGetters({
|
|
|
51
48
|
return optionsFromListener;
|
|
52
49
|
}
|
|
53
50
|
return optionsRef.current;
|
|
54
|
-
}, [
|
|
55
|
-
React.
|
|
56
|
-
|
|
51
|
+
}, [key, getFocusedRouteKey, getOptionsFromListener]);
|
|
52
|
+
React.useInsertionEffect(() => {
|
|
53
|
+
// We don't have a parent at the root
|
|
54
|
+
if (key != null) {
|
|
55
|
+
return parentAddOptionsGetter?.(key, getCurrentOptions);
|
|
56
|
+
}
|
|
57
57
|
}, [getCurrentOptions, parentAddOptionsGetter, key]);
|
|
58
58
|
const addOptionsGetter = React.useCallback((key, getter) => {
|
|
59
59
|
optionsGettersFromChildRef.current[key] = getter;
|
|
60
|
-
|
|
60
|
+
|
|
61
|
+
// Hidden screens may register without running their passive effects.
|
|
62
|
+
// Wait until the commit finishes before reporting their options.
|
|
63
|
+
if (onOptionsChange !== undefined) {
|
|
64
|
+
void Promise.resolve().then(onOptionsChange);
|
|
65
|
+
}
|
|
61
66
|
return () => {
|
|
62
67
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
63
68
|
delete optionsGettersFromChildRef.current[key];
|
|
64
|
-
|
|
69
|
+
|
|
70
|
+
// Other getters and the focused route may still change during cleanup.
|
|
71
|
+
// Wait until the commit finishes before reporting the remaining options.
|
|
72
|
+
if (onOptionsChange !== undefined) {
|
|
73
|
+
void Promise.resolve().then(onOptionsChange);
|
|
74
|
+
}
|
|
65
75
|
};
|
|
66
|
-
}, [
|
|
76
|
+
}, [onOptionsChange]);
|
|
67
77
|
return {
|
|
68
78
|
addOptionsGetter,
|
|
69
79
|
getCurrentOptions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","NavigationBuilderContext","NavigationStateContext","useOptionsGetters","key","options","
|
|
1
|
+
{"version":3,"names":["React","NavigationBuilderContext","NavigationStateContext","IsFocusedContext","useOptionsGetters","key","options","getFocusedRouteKey","isFocused","use","optionsRef","useRef","optionsGettersFromChildRef","onOptionsChange","addOptionsGetter","parentAddOptionsGetter","useInsertionEffect","current","useEffect","getOptionsFromListener","useCallback","result","getCurrentOptions","optionsFromListener","getter","undefined","Promise","resolve","then"],"sourceRoot":"../../src","sources":["useOptionsGetters.tsx"],"mappings":";;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,wBAAwB,QAAQ,+BAA4B;AACrE,SAASC,sBAAsB,QAAQ,6BAA0B;AACjE,SAASC,gBAAgB,QAAQ,mBAAgB;AAQjD,OAAO,SAASC,iBAAiBA,CAAC;EAChCC,GAAG;EACHC,OAAO;EACPC;AACO,CAAC,EAAE;EACV,MAAMC,SAAS,GAAGR,KAAK,CAACS,GAAG,CAACN,gBAAgB,CAAC,IAAI,IAAI;EAErD,MAAMO,UAAU,GAAGV,KAAK,CAACW,MAAM,CAAqBL,OAAO,CAAC;EAC5D,MAAMM,0BAA0B,GAAGZ,KAAK,CAACW,MAAM,CAE7C,CAAC,CAAC,CAAC;EAEL,MAAME,eAAe,GAAGb,KAAK,CAACS,GAAG,CAACR,wBAAwB,CAAC,EAAEY,eAAe;EAE5E,MAAM;IAAEC,gBAAgB,EAAEC;EAAuB,CAAC,GAAGf,KAAK,CAACS,GAAG,CAC5DP,sBACF,CAAC;EAEDF,KAAK,CAACgB,kBAAkB,CAAC,MAAM;IAC7BN,UAAU,CAACO,OAAO,GAAGX,OAAO;EAC9B,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAEbN,KAAK,CAACkB,SAAS,CAAC,MAAM;IACpBL,eAAe,GAAG,CAAC;EACrB,CAAC,EAAE,CAACL,SAAS,EAAEK,eAAe,EAAEP,OAAO,CAAC,CAAC;EAEzC,MAAMa,sBAAsB,GAAGnB,KAAK,CAACoB,WAAW,CAAC,MAAM;IACrD,KAAK,MAAMf,GAAG,IAAIO,0BAA0B,CAACK,OAAO,EAAE;MACpD,IAAIZ,GAAG,IAAIO,0BAA0B,CAACK,OAAO,EAAE;QAC7C,MAAMI,MAAM,GAAGT,0BAA0B,CAACK,OAAO,CAACZ,GAAG,CAAC,GAAG,CAAC;;QAE1D;QACA,IAAIgB,MAAM,KAAK,IAAI,EAAE;UACnB,OAAOA,MAAM;QACf;MACF;IACF;IAEA,OAAO,IAAI;EACb,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,iBAAiB,GAAGtB,KAAK,CAACoB,WAAW,CAAC,MAAM;IAChD;IACA;IACA;IACA;IACA,IAAIf,GAAG,IAAI,IAAI,IAAIE,kBAAkB,GAAG,CAAC,KAAKF,GAAG,EAAE;MACjD,OAAO,IAAI;IACb;IAEA,MAAMkB,mBAAmB,GAAGJ,sBAAsB,CAAC,CAAC;IAEpD,IAAII,mBAAmB,KAAK,IAAI,EAAE;MAChC,OAAOA,mBAAmB;IAC5B;IAEA,OAAOb,UAAU,CAACO,OAAO;EAC3B,CAAC,EAAE,CAACZ,GAAG,EAAEE,kBAAkB,EAAEY,sBAAsB,CAAC,CAAC;EAErDnB,KAAK,CAACgB,kBAAkB,CAAC,MAAM;IAC7B;IACA,IAAIX,GAAG,IAAI,IAAI,EAAE;MACf,OAAOU,sBAAsB,GAAGV,GAAG,EAAEiB,iBAAiB,CAAC;IACzD;EACF,CAAC,EAAE,CAACA,iBAAiB,EAAEP,sBAAsB,EAAEV,GAAG,CAAC,CAAC;EAEpD,MAAMS,gBAAgB,GAAGd,KAAK,CAACoB,WAAW,CACxC,CAACf,GAAW,EAAEmB,MAAuC,KAAK;IACxDZ,0BAA0B,CAACK,OAAO,CAACZ,GAAG,CAAC,GAAGmB,MAAM;;IAEhD;IACA;IACA,IAAIX,eAAe,KAAKY,SAAS,EAAE;MACjC,KAAKC,OAAO,CAACC,OAAO,CAAC,CAAC,CAACC,IAAI,CAACf,eAAe,CAAC;IAC9C;IAEA,OAAO,MAAM;MACX;MACA,OAAOD,0BAA0B,CAACK,OAAO,CAACZ,GAAG,CAAC;;MAE9C;MACA;MACA,IAAIQ,eAAe,KAAKY,SAAS,EAAE;QACjC,KAAKC,OAAO,CAACC,OAAO,CAAC,CAAC,CAACC,IAAI,CAACf,eAAe,CAAC;MAC9C;IACF,CAAC;EACH,CAAC,EACD,CAACA,eAAe,CAClB,CAAC;EAED,OAAO;IACLC,gBAAgB;IAChBQ;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { nanoid } from 'nanoid/non-secure';
|
|
4
3
|
import * as React from 'react';
|
|
5
4
|
import useLatestCallback from 'use-latest-callback';
|
|
6
5
|
import { useNavigation } from "./useNavigation.js";
|
|
@@ -14,20 +13,27 @@ import { useRoute } from "./useRoute.js";
|
|
|
14
13
|
* @param callback Function which is executed when screen was prevented from being removed.
|
|
15
14
|
*/
|
|
16
15
|
export function usePreventRemove(preventRemove, callback) {
|
|
17
|
-
const
|
|
16
|
+
const id = React.useId();
|
|
18
17
|
const navigation = useNavigation();
|
|
19
18
|
const {
|
|
20
19
|
key: routeKey
|
|
21
20
|
} = useRoute();
|
|
22
21
|
const {
|
|
23
|
-
setPreventRemove
|
|
22
|
+
setPreventRemove,
|
|
23
|
+
notifyPreventRemove
|
|
24
24
|
} = usePreventRemoveContext();
|
|
25
|
-
React.
|
|
25
|
+
React.useInsertionEffect(() => {
|
|
26
26
|
setPreventRemove(id, routeKey, preventRemove);
|
|
27
27
|
return () => {
|
|
28
28
|
setPreventRemove(id, routeKey, false);
|
|
29
29
|
};
|
|
30
30
|
}, [setPreventRemove, id, routeKey, preventRemove]);
|
|
31
|
+
React.useEffect(() => {
|
|
32
|
+
notifyPreventRemove();
|
|
33
|
+
return () => {
|
|
34
|
+
notifyPreventRemove();
|
|
35
|
+
};
|
|
36
|
+
}, [id, routeKey, preventRemove, notifyPreventRemove]);
|
|
31
37
|
const beforeRemoveListener = useLatestCallback(e => {
|
|
32
38
|
if (!preventRemove) {
|
|
33
39
|
return;
|
|
@@ -37,6 +43,6 @@ export function usePreventRemove(preventRemove, callback) {
|
|
|
37
43
|
data: e.data
|
|
38
44
|
});
|
|
39
45
|
});
|
|
40
|
-
React.
|
|
46
|
+
React.useInsertionEffect(() => navigation?.addListener('beforeRemove', beforeRemoveListener), [navigation, beforeRemoveListener]);
|
|
41
47
|
}
|
|
42
48
|
//# sourceMappingURL=usePreventRemove.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["React","useLatestCallback","useNavigation","usePreventRemoveContext","useRoute","usePreventRemove","preventRemove","callback","id","useId","navigation","key","routeKey","setPreventRemove","notifyPreventRemove","useInsertionEffect","useEffect","beforeRemoveListener","e","preventDefault","data","addListener"],"sourceRoot":"../../src","sources":["usePreventRemove.tsx"],"mappings":";;AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,OAAOC,iBAAiB,MAAM,qBAAqB;AAGnD,SAASC,aAAa,QAAQ,oBAAiB;AAC/C,SAASC,uBAAuB,QAAQ,8BAA2B;AACnE,SAASC,QAAQ,QAAQ,eAAY;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAC9BC,aAAsB,EACtBC,QAAmE,EACnE;EACA,MAAMC,EAAE,GAAGR,KAAK,CAACS,KAAK,CAAC,CAAC;EAExB,MAAMC,UAAU,GAAGR,aAAa,CAAC,CAAC;EAClC,MAAM;IAAES,GAAG,EAAEC;EAAS,CAAC,GAAGR,QAAQ,CAAC,CAAC;EAEpC,MAAM;IAAES,gBAAgB;IAAEC;EAAoB,CAAC,GAAGX,uBAAuB,CAAC,CAAC;EAE3EH,KAAK,CAACe,kBAAkB,CAAC,MAAM;IAC7BF,gBAAgB,CAACL,EAAE,EAAEI,QAAQ,EAAEN,aAAa,CAAC;IAE7C,OAAO,MAAM;MACXO,gBAAgB,CAACL,EAAE,EAAEI,QAAQ,EAAE,KAAK,CAAC;IACvC,CAAC;EACH,CAAC,EAAE,CAACC,gBAAgB,EAAEL,EAAE,EAAEI,QAAQ,EAAEN,aAAa,CAAC,CAAC;EAEnDN,KAAK,CAACgB,SAAS,CAAC,MAAM;IACpBF,mBAAmB,CAAC,CAAC;IAErB,OAAO,MAAM;MACXA,mBAAmB,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACN,EAAE,EAAEI,QAAQ,EAAEN,aAAa,EAAEQ,mBAAmB,CAAC,CAAC;EAEtD,MAAMG,oBAAoB,GAAGhB,iBAAiB,CAE3CiB,CAAC,IAAK;IACP,IAAI,CAACZ,aAAa,EAAE;MAClB;IACF;IAEAY,CAAC,CAACC,cAAc,CAAC,CAAC;IAElBZ,QAAQ,CAAC;MAAEa,IAAI,EAAEF,CAAC,CAACE;IAAK,CAAC,CAAC;EAC5B,CAAC,CAAC;EAEFpB,KAAK,CAACe,kBAAkB,CACtB,MAAML,UAAU,EAAEW,WAAW,CAAC,cAAc,EAAEJ,oBAAoB,CAAC,EACnE,CAACP,UAAU,EAAEO,oBAAoB,CACnC,CAAC;AACH","ignoreList":[]}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { PreventRemoveContext } from "./PreventRemoveContext.js";
|
|
5
5
|
export function usePreventRemoveContext() {
|
|
6
|
-
const value = React.
|
|
6
|
+
const value = React.use(PreventRemoveContext);
|
|
7
7
|
if (value == null) {
|
|
8
|
-
throw new Error("Couldn't find the prevent remove context.
|
|
8
|
+
throw new Error("Couldn't find the prevent remove context. 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'.");
|
|
9
9
|
}
|
|
10
10
|
return value;
|
|
11
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","PreventRemoveContext","usePreventRemoveContext","value","
|
|
1
|
+
{"version":3,"names":["React","PreventRemoveContext","usePreventRemoveContext","value","use","Error"],"sourceRoot":"../../src","sources":["usePreventRemoveContext.tsx"],"mappings":";;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,oBAAoB,QAAQ,2BAAwB;AAE7D,OAAO,SAASC,uBAAuBA,CAAA,EAAG;EACxC,MAAMC,KAAK,GAAGH,KAAK,CAACI,GAAG,CAACH,oBAAoB,CAAC;EAE7C,IAAIE,KAAK,IAAI,IAAI,EAAE;IACjB,MAAM,IAAIE,KAAK,CACb,sOACF,CAAC;EACH;EAEA,OAAOF,KAAK;AACd","ignoreList":[]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { nanoid } from 'nanoid/non-secure';
|
|
4
3
|
import * as React from 'react';
|
|
5
4
|
import { SingleNavigatorContext } from "./EnsureSingleNavigator.js";
|
|
6
5
|
|
|
@@ -9,12 +8,12 @@ import { SingleNavigatorContext } from "./EnsureSingleNavigator.js";
|
|
|
9
8
|
* This is used to prevent multiple navigators under a single container or screen.
|
|
10
9
|
*/
|
|
11
10
|
export function useRegisterNavigator() {
|
|
12
|
-
const
|
|
13
|
-
const container = React.
|
|
11
|
+
const key = React.useId();
|
|
12
|
+
const container = React.use(SingleNavigatorContext);
|
|
14
13
|
if (container === undefined) {
|
|
15
14
|
throw new Error("Couldn't register the navigator. Have you wrapped your app with 'NavigationContainer'?\n\nThis can also happen if there are multiple copies of '@react-navigation' packages installed.");
|
|
16
15
|
}
|
|
17
|
-
React.
|
|
16
|
+
React.useInsertionEffect(() => {
|
|
18
17
|
const {
|
|
19
18
|
register,
|
|
20
19
|
unregister
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["React","SingleNavigatorContext","useRegisterNavigator","key","useId","container","use","undefined","Error","useInsertionEffect","register","unregister"],"sourceRoot":"../../src","sources":["useRegisterNavigator.tsx"],"mappings":";;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,sBAAsB,QAAQ,4BAAyB;;AAEhE;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAAA,EAAG;EACrC,MAAMC,GAAG,GAAGH,KAAK,CAACI,KAAK,CAAC,CAAC;EAEzB,MAAMC,SAAS,GAAGL,KAAK,CAACM,GAAG,CAACL,sBAAsB,CAAC;EAEnD,IAAII,SAAS,KAAKE,SAAS,EAAE;IAC3B,MAAM,IAAIC,KAAK,CACb,wLACF,CAAC;EACH;EAEAR,KAAK,CAACS,kBAAkB,CAAC,MAAM;IAC7B,MAAM;MAAEC,QAAQ;MAAEC;IAAW,CAAC,GAAGN,SAAS;IAE1CK,QAAQ,CAACP,GAAG,CAAC;IAEb,OAAO,MAAMQ,UAAU,CAACR,GAAG,CAAC;EAC9B,CAAC,EAAE,CAACE,SAAS,EAAEF,GAAG,CAAC,CAAC;EAEpB,OAAOA,GAAG;AACZ","ignoreList":[]}
|
package/lib/module/useRoute.js
CHANGED
|
@@ -5,6 +5,8 @@ import { NamedRouteContextListContext, NavigationRouteContext } from "./Navigati
|
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Get all possible route names from a param list and its nested navigators.
|
|
8
|
+
* Recurses into the param lists directly instead of using `RouteForName`,
|
|
9
|
+
* So the route objects don't need to be built just to get the names.
|
|
8
10
|
*/
|
|
9
11
|
|
|
10
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","NamedRouteContextListContext","NavigationRouteContext","useRoute","name","undefined","route","use","Error","NamedRouteContextList","NamedRouteContext"],"sourceRoot":"../../src","sources":["useRoute.tsx"],"mappings":";;AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SACEC,4BAA4B,EAC5BC,sBAAsB,QACjB,yBAAsB;;
|
|
1
|
+
{"version":3,"names":["React","NamedRouteContextListContext","NavigationRouteContext","useRoute","name","undefined","route","use","Error","NamedRouteContextList","NamedRouteContext"],"sourceRoot":"../../src","sources":["useRoute.tsx"],"mappings":";;AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SACEC,4BAA4B,EAC5BC,sBAAsB,QACjB,yBAAsB;;AAS7B;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;AACA;;AAgBA,OAAO,SAASC,QAAQA,CAACC,IAAa,EAAE;EACtC,IAAIA,IAAI,KAAKC,SAAS,EAAE;IACtB,MAAMC,KAAK,GAAGN,KAAK,CAACO,GAAG,CAACL,sBAAsB,CAAC;IAE/C,IAAII,KAAK,KAAKD,SAAS,EAAE;MACvB,MAAM,IAAIG,KAAK,CACb,iFACF,CAAC;IACH;IAEA,OAAOF,KAAK;EACd;EAEA,MAAMG,qBAAqB,GAAGT,KAAK,CAACO,GAAG,CAACN,4BAA4B,CAAC;EAErE,IAAIQ,qBAAqB,KAAKJ,SAAS,EAAE;IACvC,MAAM,IAAIG,KAAK,CACb,kFACF,CAAC;EACH;EAEA,MAAME,iBAAiB,GAAGD,qBAAqB,CAACL,IAAI,CAAC;EAErD,IAAIM,iBAAiB,KAAKL,SAAS,EAAE;IACnC,MAAM,IAAIG,KAAK,CACb,gCAAgCJ,IAAI,8EACtC,CAAC;EACH;EAEA,MAAME,KAAK,GAAGN,KAAK,CAACO,GAAG,CAACG,iBAAiB,CAAC;EAE1C,OAAOJ,KAAK;AACd","ignoreList":[]}
|
|
@@ -8,7 +8,6 @@ import { isRecordEqual } from "./isRecordEqual.js";
|
|
|
8
8
|
* This is fine since they are internal utilities and this is not public API.
|
|
9
9
|
*/
|
|
10
10
|
export const CHILD_STATE = Symbol('CHILD_STATE');
|
|
11
|
-
|
|
12
11
|
/**
|
|
13
12
|
* Hook to cache route props for each screen in the navigator.
|
|
14
13
|
* This lets add warnings and modifications to the route object but keep references between renders.
|
|
@@ -18,41 +17,58 @@ export function useRouteCache(routes) {
|
|
|
18
17
|
const cache = React.useMemo(() => ({
|
|
19
18
|
current: new Map()
|
|
20
19
|
}), []);
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
20
|
+
const next = React.useMemo(() => {
|
|
21
|
+
return routes.reduce((acc, route) => {
|
|
22
|
+
const previous = cache.current.get(route.key);
|
|
23
|
+
const {
|
|
24
|
+
state: _,
|
|
25
|
+
...routeWithoutState
|
|
26
|
+
} = route;
|
|
27
|
+
let proxy;
|
|
28
|
+
if (previous && isRecordEqual(previous, routeWithoutState)) {
|
|
29
|
+
// If a cached route object already exists, reuse it
|
|
30
|
+
proxy = previous;
|
|
31
|
+
} else {
|
|
32
|
+
proxy = routeWithoutState;
|
|
33
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
34
|
+
// FIXME: since the state is updated with mutation, the route object cannot be frozen
|
|
35
|
+
// As a workaround, loop through the object and make the properties readonly
|
|
36
|
+
// Only needed once per proxy - skip if we're reusing a previously-frozen one
|
|
37
|
+
for (const [key, value] of Object.entries(proxy)) {
|
|
38
|
+
Object.defineProperty(proxy, key, {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: false,
|
|
42
|
+
value
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
46
|
}
|
|
47
|
+
acc.set(route.key, proxy);
|
|
48
|
+
return acc;
|
|
49
|
+
}, new Map());
|
|
50
|
+
}, [cache, routes]);
|
|
51
|
+
React.useInsertionEffect(() => {
|
|
52
|
+
cache.current = next;
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Update child state on every render, including when the memo is reused.
|
|
56
|
+
// This restores the previous child state when a pending render is canceled.
|
|
57
|
+
return Array.from(next.values(), (proxy, index) => {
|
|
58
|
+
const state = routes[index]?.state;
|
|
59
|
+
|
|
60
|
+
// FIXME: We mutate the child state without replacing the cached route object,
|
|
61
|
+
// so nested navigation doesn't re-render the parent screen.
|
|
62
|
+
// This is not concurrent render safe, pending renders mutate this shared child state.
|
|
63
|
+
// Then `getFocusedRouteNameFromRoute` can expose it before the render commits.
|
|
64
|
+
if (proxy[CHILD_STATE] !== state) {
|
|
65
|
+
Object.defineProperty(proxy, CHILD_STATE, {
|
|
66
|
+
enumerable: false,
|
|
67
|
+
configurable: true,
|
|
68
|
+
value: state
|
|
69
|
+
});
|
|
47
70
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
configurable: true,
|
|
51
|
-
value: state
|
|
52
|
-
});
|
|
53
|
-
acc.set(route.key, proxy);
|
|
54
|
-
return acc;
|
|
55
|
-
}, new Map());
|
|
56
|
-
return Array.from(cache.current.values());
|
|
71
|
+
return proxy;
|
|
72
|
+
});
|
|
57
73
|
}
|
|
58
74
|
//# sourceMappingURL=useRouteCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","isRecordEqual","CHILD_STATE","Symbol","useRouteCache","routes","cache","useMemo","current","Map","reduce","acc","route","previous","get","key","state","routeWithoutState","proxy","process","env","NODE_ENV","value","Object","defineProperty","enumerable","configurable","writable","set","Array","from","values"],"sourceRoot":"../../src","sources":["useRouteCache.tsx"],"mappings":";;AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,aAAa,QAAQ,oBAAiB;
|
|
1
|
+
{"version":3,"names":["React","isRecordEqual","CHILD_STATE","Symbol","useRouteCache","routes","cache","useMemo","current","Map","next","reduce","acc","route","previous","get","key","state","_","routeWithoutState","proxy","process","env","NODE_ENV","value","Object","entries","defineProperty","enumerable","configurable","writable","set","useInsertionEffect","Array","from","values","index"],"sourceRoot":"../../src","sources":["useRouteCache.tsx"],"mappings":";;AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,aAAa,QAAQ,oBAAiB;AAG/C;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,WAAW,GAAGC,MAAM,CAAC,aAAa,CAAC;AAMhD;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAC3BC,MAAuB,EACvB;EACA;EACA,MAAMC,KAAK,GAAGN,KAAK,CAACO,OAAO,CACzB,OAAO;IAAEC,OAAO,EAAE,IAAIC,GAAG,CAAsB;EAAE,CAAC,CAAC,EACnD,EACF,CAAC;EAED,MAAMC,IAAI,GAAGV,KAAK,CAACO,OAAO,CAAC,MAAM;IAC/B,OAAOF,MAAM,CAACM,MAAM,CAAC,CAACC,GAAG,EAAEC,KAAK,KAAK;MACnC,MAAMC,QAAQ,GAAGR,KAAK,CAACE,OAAO,CAACO,GAAG,CAACF,KAAK,CAACG,GAAG,CAAC;MAE7C,MAAM;QAAEC,KAAK,EAAEC,CAAC;QAAE,GAAGC;MAAkB,CAAC,GAAGN,KAAK;MAEhD,IAAIO,KAAkB;MAEtB,IAAIN,QAAQ,IAAIb,aAAa,CAACa,QAAQ,EAAEK,iBAAiB,CAAC,EAAE;QAC1D;QACAC,KAAK,GAAGN,QAAQ;MAClB,CAAC,MAAM;QACLM,KAAK,GAAGD,iBAAiB;QAEzB,IAAIE,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;UACzC;UACA;UACA;UACA,KAAK,MAAM,CAACP,GAAG,EAAEQ,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACN,KAAK,CAAC,EAAE;YAChDK,MAAM,CAACE,cAAc,CAACP,KAAK,EAAEJ,GAAG,EAAE;cAChCY,UAAU,EAAE,IAAI;cAChBC,YAAY,EAAE,IAAI;cAClBC,QAAQ,EAAE,KAAK;cACfN;YACF,CAAC,CAAC;UACJ;QACF;MACF;MAEAZ,GAAG,CAACmB,GAAG,CAAClB,KAAK,CAACG,GAAG,EAAEI,KAAK,CAAC;MAEzB,OAAOR,GAAG;IACZ,CAAC,EAAE,IAAIH,GAAG,CAAsB,CAAC,CAAC;EACpC,CAAC,EAAE,CAACH,KAAK,EAAED,MAAM,CAAC,CAAC;EAEnBL,KAAK,CAACgC,kBAAkB,CAAC,MAAM;IAC7B1B,KAAK,CAACE,OAAO,GAAGE,IAAI;EACtB,CAAC,CAAC;;EAEF;EACA;EACA,OAAOuB,KAAK,CAACC,IAAI,CAACxB,IAAI,CAACyB,MAAM,CAAC,CAAC,EAAE,CAACf,KAAK,EAAEgB,KAAK,KAAK;IACjD,MAAMnB,KAAK,GAAGZ,MAAM,CAAC+B,KAAK,CAAC,EAAEnB,KAAK;;IAElC;IACA;IACA;IACA;IACA,IAAIG,KAAK,CAAClB,WAAW,CAAC,KAAKe,KAAK,EAAE;MAChCQ,MAAM,CAACE,cAAc,CAACP,KAAK,EAAElB,WAAW,EAAE;QACxC0B,UAAU,EAAE,KAAK;QACjBC,YAAY,EAAE,IAAI;QAClBL,KAAK,EAAEP;MACT,CAAC,CAAC;IACJ;IAEA,OAAOG,KAAK;EACd,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import
|
|
4
|
+
import useLatestCallback from 'use-latest-callback';
|
|
5
|
+
import { useNavigationBuilderContext } from "./NavigationBuilderContext.js";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* When screen config changes, we want to update the navigator in the same update phase.
|
|
8
|
-
* However, navigation state is in the root component and React won't let us update it from a child.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* However, navigation state is in the root component and React won't let us update it from a child during render.
|
|
10
|
+
* The render could also be interrupted in concurrent mode, so we need to update after commit.
|
|
11
|
+
* So we queue the update in an insertion effect and flush it in a layout effect.
|
|
12
|
+
* Insertion effects run before layout effects, so every navigator in the tree has queued its update before we flush.
|
|
13
|
+
* This lets nested updates be applied from the root down without clobbering each other.
|
|
12
14
|
*/
|
|
13
15
|
export function useScheduleUpdate(callback) {
|
|
14
16
|
const {
|
|
15
17
|
scheduleUpdate,
|
|
16
18
|
flushUpdates
|
|
17
|
-
} =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
} = useNavigationBuilderContext();
|
|
20
|
+
const latestCallback = useLatestCallback(callback);
|
|
21
|
+
React.useInsertionEffect(() => {
|
|
22
|
+
scheduleUpdate(latestCallback);
|
|
23
|
+
});
|
|
22
24
|
React.useLayoutEffect(flushUpdates);
|
|
23
25
|
}
|
|
24
26
|
//# sourceMappingURL=useScheduleUpdate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","
|
|
1
|
+
{"version":3,"names":["React","useLatestCallback","useNavigationBuilderContext","useScheduleUpdate","callback","scheduleUpdate","flushUpdates","latestCallback","useInsertionEffect","useLayoutEffect"],"sourceRoot":"../../src","sources":["useScheduleUpdate.tsx"],"mappings":";;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,OAAOC,iBAAiB,MAAM,qBAAqB;AAEnD,SAASC,2BAA2B,QAAQ,+BAA4B;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAACC,QAAoB,EAAE;EACtD,MAAM;IAAEC,cAAc;IAAEC;EAAa,CAAC,GAAGJ,2BAA2B,CAAC,CAAC;EAEtE,MAAMK,cAAc,GAAGN,iBAAiB,CAACG,QAAQ,CAAC;EAElDJ,KAAK,CAACQ,kBAAkB,CAAC,MAAM;IAC7BH,cAAc,CAACE,cAAc,CAAC;EAChC,CAAC,CAAC;EAEFP,KAAK,CAACS,eAAe,CAACH,YAAY,CAAC;AACrC","ignoreList":[]}
|
|
@@ -10,7 +10,7 @@ import { NavigationFocusedRouteStateContext } from "./NavigationFocusedRouteStat
|
|
|
10
10
|
* @returns Minimal state to build a path for the current route.
|
|
11
11
|
*/
|
|
12
12
|
export function useStateForPath() {
|
|
13
|
-
const state = React.
|
|
13
|
+
const state = React.use(NavigationFocusedRouteStateContext);
|
|
14
14
|
return state;
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=useStateForPath.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","NavigationFocusedRouteStateContext","useStateForPath","state","
|
|
1
|
+
{"version":3,"names":["React","NavigationFocusedRouteStateContext","useStateForPath","state","use"],"sourceRoot":"../../src","sources":["useStateForPath.tsx"],"mappings":";;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,kCAAkC,QAAQ,yCAAsC;;AAEzF;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAAA,EAAG;EAChC,MAAMC,KAAK,GAAGH,KAAK,CAACI,GAAG,CAACH,kCAAkC,CAAC;EAE3D,OAAOE,KAAK;AACd","ignoreList":[]}
|
|
@@ -18,11 +18,27 @@ const createStore = getInitialState => {
|
|
|
18
18
|
};
|
|
19
19
|
let isBatching = false;
|
|
20
20
|
let didUpdate = false;
|
|
21
|
+
const notify = () => {
|
|
22
|
+
let error;
|
|
23
|
+
listeners.forEach(listener => {
|
|
24
|
+
try {
|
|
25
|
+
listener();
|
|
26
|
+
} catch (e) {
|
|
27
|
+
error = error ?? {
|
|
28
|
+
value: e
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
if (error) {
|
|
33
|
+
throw error.value;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
21
36
|
const setState = newState => {
|
|
22
37
|
state = deepFreeze(newState);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
38
|
+
if (isBatching) {
|
|
39
|
+
didUpdate = true;
|
|
40
|
+
} else {
|
|
41
|
+
notify();
|
|
26
42
|
}
|
|
27
43
|
};
|
|
28
44
|
const subscribe = callback => {
|
|
@@ -33,11 +49,14 @@ const createStore = getInitialState => {
|
|
|
33
49
|
};
|
|
34
50
|
const batchUpdates = callback => {
|
|
35
51
|
isBatching = true;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
52
|
+
try {
|
|
53
|
+
callback();
|
|
54
|
+
} finally {
|
|
55
|
+
isBatching = false;
|
|
56
|
+
if (didUpdate) {
|
|
57
|
+
didUpdate = false;
|
|
58
|
+
notify();
|
|
59
|
+
}
|
|
41
60
|
}
|
|
42
61
|
};
|
|
43
62
|
return {
|
|
@@ -68,17 +87,19 @@ export function useSyncState(getInitialState) {
|
|
|
68
87
|
rerender();
|
|
69
88
|
return unsubscribe;
|
|
70
89
|
}, [store]);
|
|
71
|
-
const
|
|
90
|
+
const pendingUpdates = useLazyValue(() => new Set());
|
|
72
91
|
const scheduleUpdate = useLatestCallback(callback => {
|
|
73
|
-
|
|
92
|
+
pendingUpdates.add(callback);
|
|
74
93
|
});
|
|
75
94
|
const flushUpdates = useLatestCallback(() => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
95
|
+
if (pendingUpdates.size !== 0) {
|
|
96
|
+
// Updates are queued child-first as insertion effects run bottom-up.
|
|
97
|
+
// The root navigator replaces the whole state while nested navigators merge into it.
|
|
98
|
+
// So we apply them root-first to avoid the root clobbering nested updates.
|
|
99
|
+
const callbacks = Array.from(pendingUpdates).reverse();
|
|
100
|
+
pendingUpdates.clear();
|
|
79
101
|
store.batchUpdates(() => {
|
|
80
|
-
|
|
81
|
-
for (const update of pendingUpdates) {
|
|
102
|
+
for (const update of callbacks) {
|
|
82
103
|
update();
|
|
83
104
|
}
|
|
84
105
|
});
|
|
@@ -89,6 +110,7 @@ export function useSyncState(getInitialState) {
|
|
|
89
110
|
state,
|
|
90
111
|
getState: store.getState,
|
|
91
112
|
setState: store.setState,
|
|
113
|
+
subscribe: store.subscribe,
|
|
92
114
|
scheduleUpdate,
|
|
93
115
|
flushUpdates
|
|
94
116
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useLatestCallback","deepFreeze","useLazyValue","createStore","getInitialState","listeners","Set","initialized","state","getState","isBatching","didUpdate","
|
|
1
|
+
{"version":3,"names":["React","useLatestCallback","deepFreeze","useLazyValue","createStore","getInitialState","listeners","Set","initialized","state","getState","isBatching","didUpdate","notify","error","forEach","listener","e","value","setState","newState","subscribe","callback","add","delete","batchUpdates","useSyncState","store","rerender","useReducer","_","undefined","useEffect","unsubscribe","pendingUpdates","scheduleUpdate","flushUpdates","size","callbacks","Array","from","reverse","clear","update"],"sourceRoot":"../../src","sources":["useSyncState.tsx"],"mappings":"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","ignoreList":[]}
|