@react-navigation/core 8.0.0-alpha.31 → 8.0.0-alpha.33
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/lib/module/BaseNavigationContainer.js +128 -80
- package/lib/module/BaseNavigationContainer.js.map +1 -1
- package/lib/module/DataLoading.js +3 -1
- package/lib/module/DataLoading.js.map +1 -1
- package/lib/module/NavigationBuilderContext.js +2 -1
- package/lib/module/NavigationBuilderContext.js.map +1 -1
- package/lib/module/NavigationIndependentTree.js +13 -6
- package/lib/module/NavigationIndependentTree.js.map +1 -1
- package/lib/module/NavigationProvider.js +10 -1
- 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/StaticNavigation.js +54 -19
- package/lib/module/StaticNavigation.js.map +1 -1
- package/lib/module/createNavigationContainerRef.js +1 -1
- package/lib/module/createNavigationContainerRef.js.map +1 -1
- package/lib/module/getStateFromPath.js +1 -1
- package/lib/module/index.js +1 -1
- 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/types.js +0 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/useDescriptors.js +4 -4
- package/lib/module/useDescriptors.js.map +1 -1
- package/lib/module/useKeyedChildListeners.js +1 -0
- package/lib/module/useKeyedChildListeners.js.map +1 -1
- package/lib/module/useNavigation.js +2 -2
- package/lib/module/useNavigation.js.map +1 -1
- package/lib/module/useNavigationBuilder.js +11 -4
- package/lib/module/useNavigationBuilder.js.map +1 -1
- package/lib/module/useNavigationCache.js +23 -31
- package/lib/module/useNavigationCache.js.map +1 -1
- package/lib/module/useNavigationHelpers.js +18 -37
- package/lib/module/useNavigationHelpers.js.map +1 -1
- package/lib/module/useNavigationState.js +13 -6
- package/lib/module/useNavigationState.js.map +1 -1
- package/lib/module/useOnGetNavigation.js +26 -0
- package/lib/module/useOnGetNavigation.js.map +1 -0
- package/lib/typescript/src/BaseNavigationContainer.d.ts.map +1 -1
- package/lib/typescript/src/DataLoading.d.ts.map +1 -1
- package/lib/typescript/src/NavigationBuilderContext.d.ts +4 -1
- package/lib/typescript/src/NavigationBuilderContext.d.ts.map +1 -1
- package/lib/typescript/src/NavigationIndependentTree.d.ts.map +1 -1
- package/lib/typescript/src/NavigationProvider.d.ts +9 -5
- 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/StaticNavigation.d.ts.map +1 -1
- package/lib/typescript/src/createNavigationContainerRef.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- 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/types.d.ts +3 -6
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/useKeyedChildListeners.d.ts +1 -0
- package/lib/typescript/src/useKeyedChildListeners.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationBuilder.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationCache.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationHelpers.d.ts +1 -2
- package/lib/typescript/src/useNavigationHelpers.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationState.d.ts +2 -1
- package/lib/typescript/src/useNavigationState.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/package.json +9 -3
- package/src/BaseNavigationContainer.tsx +181 -94
- package/src/DataLoading.tsx +4 -1
- package/src/NavigationBuilderContext.tsx +10 -1
- package/src/NavigationIndependentTree.tsx +13 -7
- package/src/NavigationProvider.tsx +13 -6
- package/src/NavigationRootContext.tsx +11 -0
- package/src/StaticNavigation.tsx +77 -19
- package/src/createNavigationContainerRef.tsx +0 -2
- package/src/getStateFromPath.tsx +1 -1
- package/src/index.tsx +1 -0
- package/src/internal.tsx +2 -0
- package/src/types.tsx +3 -7
- package/src/useDescriptors.tsx +3 -3
- package/src/useKeyedChildListeners.tsx +1 -0
- package/src/useNavigation.tsx +2 -2
- package/src/useNavigationBuilder.tsx +11 -4
- package/src/useNavigationCache.tsx +24 -33
- package/src/useNavigationHelpers.tsx +19 -38
- package/src/useNavigationState.tsx +16 -8
- package/src/useOnGetNavigation.tsx +29 -0
- package/lib/module/checkSerializable.js +0 -51
- package/lib/module/checkSerializable.js.map +0 -1
- package/lib/typescript/src/checkSerializable.d.ts +0 -14
- package/lib/typescript/src/checkSerializable.d.ts.map +0 -1
- package/src/checkSerializable.tsx +0 -90
|
@@ -5,6 +5,7 @@ import type { KeyedListenerMap } from './NavigationBuilderContext.js';
|
|
|
5
5
|
export declare function useKeyedChildListeners(): {
|
|
6
6
|
keyedListeners: {
|
|
7
7
|
getState: Record<string, import("./NavigationBuilderContext.js").GetStateListener | undefined>;
|
|
8
|
+
getNavigation: Record<string, import("./NavigationBuilderContext.js").GetNavigationListener | undefined>;
|
|
8
9
|
beforeRemove: Record<string, import("./NavigationBuilderContext.js").ChildBeforeRemoveListener | undefined>;
|
|
9
10
|
};
|
|
10
11
|
addKeyedListener: <T extends keyof KeyedListenerMap>(type: T, key: string, listener: KeyedListenerMap[T]) => () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeyedChildListeners.d.ts","sourceRoot":"","sources":["../../../src/useKeyedChildListeners.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA4B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,sBAAsB
|
|
1
|
+
{"version":3,"file":"useKeyedChildListeners.d.ts","sourceRoot":"","sources":["../../../src/useKeyedChildListeners.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA4B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,sBAAsB;;;;;;uBAejC,CAAC,SAAS,MAAM,gBAAgB,QACzB,CAAC,OACF,MAAM,YACD,gBAAgB,CAAC,CAAC,CAAC;EAmBlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavigationBuilder.d.ts","sourceRoot":"","sources":["../../../src/useNavigationBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,YAAY,EAIjB,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,OAAO,EACL,KAAK,uBAAuB,EAI5B,iBAAiB,EAElB,MAAM,YAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"useNavigationBuilder.d.ts","sourceRoot":"","sources":["../../../src/useNavigationBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,YAAY,EAIjB,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,OAAO,EACL,KAAK,uBAAuB,EAI5B,iBAAiB,EAElB,MAAM,YAAS,CAAC;AA+RjB;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,oBAAoB,EAC1C,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,EAC5D,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAEpC,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,CAAC,EACnE,OAAO,EAAE,uBAAuB,CAC9B,aAAa,EACb,KAAK,EACL,aAAa,EACb,QAAQ,EACR,GAAG,CACJ,GACC,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4uBhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavigationCache.d.ts","sourceRoot":"","sources":["../../../src/useNavigationCache.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;AAKnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAS,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAmB,CAAC;AAEhE,KAAK,OAAO,CACV,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAClC;IACF,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,QAAQ,EAAE,MAAM,KAAK,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC,aAAa,CAAC,GAC1C,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,UAAU,EAAE,CACV,EAAE,EAAE,CACF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,KACxD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,KACpD,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACxC,OAAO,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;CAC3C,CAAC;AAEF,KAAK,cAAc,CACjB,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,IAC1D,cAAc,CAChB,aAAa,EACb,MAAM,EACN,KAAK,EACL,aAAa,EACb,QAAQ,EACR,aAAa,CACd,CAAC;AAEF,KAAK,eAAe,CAClB,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,IAC1D,MAAM,CACR,MAAM,EACN,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,CAAC,CAC9D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,EAC5D,EACA,MAAM,EACN,QAAQ,EACR,UAAU,EACV,UAAU,EACV,MAAM,EACN,OAAO,GACR,EAAE,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"useNavigationCache.d.ts","sourceRoot":"","sources":["../../../src/useNavigationCache.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;AAKnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAS,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAmB,CAAC;AAEhE,KAAK,OAAO,CACV,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAClC;IACF,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,QAAQ,EAAE,MAAM,KAAK,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC,aAAa,CAAC,GAC1C,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,UAAU,EAAE,CACV,EAAE,EAAE,CACF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,KACxD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,KACpD,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACxC,OAAO,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;CAC3C,CAAC;AAEF,KAAK,cAAc,CACjB,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,IAC1D,cAAc,CAChB,aAAa,EACb,MAAM,EACN,KAAK,EACL,aAAa,EACb,QAAQ,EACR,aAAa,CACd,CAAC;AAEF,KAAK,eAAe,CAClB,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,IAC1D,MAAM,CACR,MAAM,EACN,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,CAAC,CAC9D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,EAAE,EACxB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,EAC5D,EACA,MAAM,EACN,QAAQ,EACR,UAAU,EACV,UAAU,EACV,MAAM,EACN,OAAO,GACR,EAAE,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,kEA6HzC"}
|
|
@@ -5,7 +5,6 @@ type Options<State extends NavigationState, Action extends NavigationAction> = {
|
|
|
5
5
|
onAction: (action: NavigationAction) => boolean;
|
|
6
6
|
onUnhandledAction: (action: NavigationAction) => void;
|
|
7
7
|
getState: () => State;
|
|
8
|
-
state: State;
|
|
9
8
|
emitter: NavigationEventEmitter<any>;
|
|
10
9
|
router: Router<State, Action>;
|
|
11
10
|
};
|
|
@@ -13,7 +12,7 @@ type Options<State extends NavigationState, Action extends NavigationAction> = {
|
|
|
13
12
|
* Navigation object with helper methods to be used by a navigator.
|
|
14
13
|
* This object includes methods for common actions as well as methods the parent screen's navigation object.
|
|
15
14
|
*/
|
|
16
|
-
export declare function useNavigationHelpers<State extends NavigationState, ActionHelpers extends Record<string, (...args: any) => void>, Action extends NavigationAction, EventMap extends Record<string, any>>({ onAction, onUnhandledAction, getState,
|
|
15
|
+
export declare function useNavigationHelpers<State extends NavigationState, ActionHelpers extends Record<string, (...args: any) => void>, Action extends NavigationAction, EventMap extends Record<string, any>>({ onAction, onUnhandledAction, getState, emitter, router, }: Options<State, Action>): {
|
|
17
16
|
dispatch(action: Readonly<{
|
|
18
17
|
type: string;
|
|
19
18
|
payload?: object | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavigationHelpers.d.ts","sourceRoot":"","sources":["../../../src/useNavigationHelpers.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"useNavigationHelpers.d.ts","sourceRoot":"","sources":["../../../src/useNavigationHelpers.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;AAKnC,OAAO,EAA0B,iBAAiB,EAAE,MAAM,YAAS,CAAC;AACpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAmB,CAAC;AAMhE,KAAK,OAAO,CAAC,KAAK,SAAS,eAAe,EAAE,MAAM,SAAS,gBAAgB,IAAI;IAC7E,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACtD,QAAQ,EAAE,MAAM,KAAK,CAAC;IACtB,OAAO,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,SAAS,eAAe,EAC7B,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,EAC5D,MAAM,SAAS,gBAAgB,EAC/B,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,EACA,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,MAAM,GACP,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kFAqExB"}
|
|
@@ -20,7 +20,8 @@ type NavigationStateForNested<Navigator, RouteName extends keyof NavigationListF
|
|
|
20
20
|
*/
|
|
21
21
|
export declare function useNavigationState<const T, const Navigator = RootNavigator, const RouteName extends keyof NavigationListForNested<Navigator> = keyof NavigationListForNested<Navigator>>(routeName: RouteName, selector: (state: NavigationStateForNested<Navigator, RouteName>) => T): T;
|
|
22
22
|
export declare function useNavigationState<T>(selector: (state: NavigationState<ParamListBase>) => T): T;
|
|
23
|
-
export declare function NavigationStateListenerProvider({ state, getState, subscribe, children, }: {
|
|
23
|
+
export declare function NavigationStateListenerProvider({ isSynced, state, getState, subscribe, children, }: {
|
|
24
|
+
isSynced: boolean;
|
|
24
25
|
state: NavigationState<ParamListBase>;
|
|
25
26
|
getState: () => NavigationState<ParamListBase>;
|
|
26
27
|
subscribe: (callback: () => void) => () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavigationState.d.ts","sourceRoot":"","sources":["../../../src/useNavigationState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,YAAS,CAAC;AAEtE,KAAK,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,KAAK,uBAAuB,GAAG;IAC7B,QAAQ,EAAE,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAC/C,WAAW,EAAE,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAClD,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CAC5E,CAAC;AAOF,KAAK,wBAAwB,CAC3B,SAAS,EACT,SAAS,SAAS,MAAM,uBAAuB,CAAC,SAAS,CAAC,IACxD,uBAAuB,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS;IACxD,QAAQ,EAAE,MAAM,MAAM,KAAK,CAAC;CAC7B,GACG,KAAK,GACL,KAAK,CAAC;AAEV;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,SAAS,GAAG,aAAa,EAC/B,KAAK,CAAC,SAAS,SAAS,MAAM,uBAAuB,CAAC,SAAS,CAAC,GAC9D,MAAM,uBAAuB,CAAC,SAAS,CAAC,EAE1C,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,GACrE,CAAC,CAAC;AACL,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,GACrD,CAAC,CAAC;AAoHL,wBAAgB,+BAA+B,CAAC,EAC9C,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAC/C,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,
|
|
1
|
+
{"version":3,"file":"useNavigationState.d.ts","sourceRoot":"","sources":["../../../src/useNavigationState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,YAAS,CAAC;AAEtE,KAAK,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,KAAK,uBAAuB,GAAG;IAC7B,QAAQ,EAAE,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAC/C,WAAW,EAAE,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAClD,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CAC5E,CAAC;AAOF,KAAK,wBAAwB,CAC3B,SAAS,EACT,SAAS,SAAS,MAAM,uBAAuB,CAAC,SAAS,CAAC,IACxD,uBAAuB,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS;IACxD,QAAQ,EAAE,MAAM,MAAM,KAAK,CAAC;CAC7B,GACG,KAAK,GACL,KAAK,CAAC;AAEV;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,SAAS,GAAG,aAAa,EAC/B,KAAK,CAAC,SAAS,SAAS,MAAM,uBAAuB,CAAC,SAAS,CAAC,GAC9D,MAAM,uBAAuB,CAAC,SAAS,CAAC,EAE1C,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,GACrE,CAAC,CAAC;AACL,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,GACrD,CAAC,CAAC;AAoHL,wBAAgB,+BAA+B,CAAC,EAC9C,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAC/C,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,qBA4CA;AAED,wBAAgB,oCAAoC,CAAC,EACnD,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,qBAwBA;AAED,eAAO,MAAM,8BAA8B,oDAE/B,CAAC;AAEb,eAAO,MAAM,uCAAuC,oEAExC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ParamListBase } from '@react-navigation/routers';
|
|
2
|
+
import type { NavigationHelpers } from './types.js';
|
|
3
|
+
type Options = {
|
|
4
|
+
navigation: NavigationHelpers<ParamListBase>;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Hook which lets the container access the navigation object of the root navigator.
|
|
8
|
+
* It's used for the navigation object returned by `useNavigation` outside a screen.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useOnGetNavigation({ navigation }: Options): void;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=useOnGetNavigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnGetNavigation.d.ts","sourceRoot":"","sources":["../../../src/useOnGetNavigation.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAS,CAAC;AAEjD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;CAC9C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,QAazD"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-navigation/core",
|
|
3
3
|
"description": "Core utilities for building navigators",
|
|
4
|
-
"version": "8.0.0-alpha.
|
|
4
|
+
"version": "8.0.0-alpha.33",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
7
7
|
"react-native",
|
|
@@ -25,6 +25,11 @@
|
|
|
25
25
|
"types": "./lib/typescript/src/index.d.ts",
|
|
26
26
|
"default": "./lib/module/index.js"
|
|
27
27
|
},
|
|
28
|
+
"./internal": {
|
|
29
|
+
"@react-navigation/source": "./src/internal.tsx",
|
|
30
|
+
"types": "./lib/typescript/src/internal.d.ts",
|
|
31
|
+
"default": "./lib/module/internal.js"
|
|
32
|
+
},
|
|
28
33
|
"./package.json": "./package.json"
|
|
29
34
|
},
|
|
30
35
|
"files": [
|
|
@@ -46,7 +51,8 @@
|
|
|
46
51
|
"nanoid": "^5.1.11",
|
|
47
52
|
"query-string": "^9.4.0",
|
|
48
53
|
"react-is": "^19.2.6",
|
|
49
|
-
"use-latest-callback": "^0.3.5"
|
|
54
|
+
"use-latest-callback": "^0.3.5",
|
|
55
|
+
"warn-once": "^0.1.1"
|
|
50
56
|
},
|
|
51
57
|
"devDependencies": {
|
|
52
58
|
"@jest/globals": "^30.4.1",
|
|
@@ -84,5 +90,5 @@
|
|
|
84
90
|
]
|
|
85
91
|
]
|
|
86
92
|
},
|
|
87
|
-
"gitHead": "
|
|
93
|
+
"gitHead": "b480c645f83ee32b649ed398bb03c75576bf6547"
|
|
88
94
|
}
|
|
@@ -3,24 +3,31 @@ import {
|
|
|
3
3
|
type InitialState,
|
|
4
4
|
type NavigationAction,
|
|
5
5
|
type NavigationState,
|
|
6
|
+
type ParamListBase,
|
|
6
7
|
type PartialState,
|
|
7
8
|
type Route,
|
|
8
9
|
} from '@react-navigation/routers';
|
|
9
10
|
import * as React from 'react';
|
|
10
11
|
import useLatestCallback from 'use-latest-callback';
|
|
12
|
+
import warnOnce from 'warn-once';
|
|
11
13
|
|
|
12
14
|
import { checkDuplicateRouteNames } from './checkDuplicateRouteNames';
|
|
13
|
-
import { checkSerializable } from './checkSerializable';
|
|
14
15
|
import { ConsumedParamsContext } from './ConsumedParamsContext';
|
|
15
16
|
import { NOT_INITIALIZED_ERROR } from './createNavigationContainerRef';
|
|
16
17
|
import { EnsureSingleNavigator } from './EnsureSingleNavigator';
|
|
17
18
|
import { findFocusedRoute } from './findFocusedRoute';
|
|
18
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
NavigationBuilderContext,
|
|
21
|
+
type WithStackTrace,
|
|
22
|
+
} from './NavigationBuilderContext';
|
|
19
23
|
import { NavigationContainerRefContext } from './NavigationContainerRefContext';
|
|
20
24
|
import { NavigationIndependentTreeContext } from './NavigationIndependentTreeContext';
|
|
25
|
+
import { NavigationRootContext } from './NavigationRootContext';
|
|
21
26
|
import { NavigationStateContext } from './NavigationStateContext';
|
|
22
27
|
import { ThemeProvider } from './theming/ThemeProvider';
|
|
23
28
|
import type {
|
|
29
|
+
EventListenerCallback,
|
|
30
|
+
GenericNavigation,
|
|
24
31
|
NavigationContainerEventMap,
|
|
25
32
|
NavigationContainerProps,
|
|
26
33
|
NavigationContainerRef,
|
|
@@ -37,9 +44,6 @@ import { useSyncState } from './useSyncState';
|
|
|
37
44
|
|
|
38
45
|
type State = NavigationState | PartialState<NavigationState> | undefined;
|
|
39
46
|
|
|
40
|
-
const serializableWarnings: string[] = [];
|
|
41
|
-
const duplicateNameWarnings: string[] = [];
|
|
42
|
-
|
|
43
47
|
type Props<ParamList extends {}> = NavigationContainerProps & {
|
|
44
48
|
ref?: React.Ref<NavigationContainerRef<ParamList>>;
|
|
45
49
|
};
|
|
@@ -125,6 +129,41 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
125
129
|
|
|
126
130
|
const { keyedListeners, addKeyedListener } = useKeyedChildListeners();
|
|
127
131
|
|
|
132
|
+
const stackRef = React.useRef<string | undefined>(undefined);
|
|
133
|
+
|
|
134
|
+
const withStackTrace = React.useCallback<WithStackTrace>(
|
|
135
|
+
(entry, callback) => {
|
|
136
|
+
if (process.env.NODE_ENV === 'production' || stackRef.current != null) {
|
|
137
|
+
callback();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const error = new Error();
|
|
142
|
+
|
|
143
|
+
if (Error.captureStackTrace) {
|
|
144
|
+
// Available on V8 and Hermes, omits the frames of `entry` and what it called
|
|
145
|
+
Error.captureStackTrace(error, entry);
|
|
146
|
+
|
|
147
|
+
stackRef.current = error.stack;
|
|
148
|
+
} else {
|
|
149
|
+
// Other engines always include them, so we drop the frames up to `entry` ourselves
|
|
150
|
+
const frames = error.stack?.split('\n') ?? [];
|
|
151
|
+
const index = frames.findIndex((frame) =>
|
|
152
|
+
frame.includes(`${entry.name}@`)
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
stackRef.current = frames.slice(index + 1).join('\n');
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
try {
|
|
159
|
+
callback();
|
|
160
|
+
} finally {
|
|
161
|
+
stackRef.current = undefined;
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
[]
|
|
165
|
+
);
|
|
166
|
+
|
|
128
167
|
const dispatch = useLatestCallback(
|
|
129
168
|
(
|
|
130
169
|
action: NavigationAction | ((state: NavigationState) => NavigationAction)
|
|
@@ -134,11 +173,13 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
134
173
|
if (listener == null) {
|
|
135
174
|
console.error(NOT_INITIALIZED_ERROR);
|
|
136
175
|
} else {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
176
|
+
withStackTrace(dispatch, () => {
|
|
177
|
+
listener((navigation) =>
|
|
178
|
+
React.startTransition(() => {
|
|
179
|
+
navigation.dispatch(action);
|
|
180
|
+
})
|
|
181
|
+
);
|
|
182
|
+
});
|
|
142
183
|
}
|
|
143
184
|
}
|
|
144
185
|
);
|
|
@@ -199,29 +240,28 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
199
240
|
|
|
200
241
|
const { addOptionsGetter, getCurrentOptions } = useOptionsGetters({});
|
|
201
242
|
|
|
202
|
-
const
|
|
243
|
+
const container: NavigationContainerRef<ParamList> = React.useMemo(
|
|
203
244
|
() => ({
|
|
204
245
|
...Object.keys(CommonActions).reduce<any>((acc, name) => {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
246
|
+
const helper = (...args: any[]) =>
|
|
247
|
+
withStackTrace(helper, () =>
|
|
248
|
+
// @ts-expect-error: this is ok
|
|
249
|
+
dispatch(CommonActions[name](...args))
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
acc[name] = helper;
|
|
208
253
|
|
|
209
254
|
return acc;
|
|
210
255
|
}, {}),
|
|
211
256
|
...emitter.create('root'),
|
|
212
257
|
dispatch,
|
|
213
258
|
resetRoot,
|
|
214
|
-
isFocused: () => true,
|
|
215
259
|
canGoBack,
|
|
216
|
-
getParent: () => undefined,
|
|
217
260
|
getState,
|
|
218
261
|
getRootState,
|
|
219
262
|
getCurrentRoute,
|
|
220
263
|
getCurrentOptions,
|
|
221
264
|
isReady,
|
|
222
|
-
setOptions: () => {
|
|
223
|
-
throw new Error('Cannot call setOptions outside a screen');
|
|
224
|
-
},
|
|
225
265
|
}),
|
|
226
266
|
[
|
|
227
267
|
canGoBack,
|
|
@@ -233,10 +273,112 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
233
273
|
getState,
|
|
234
274
|
isReady,
|
|
235
275
|
resetRoot,
|
|
276
|
+
withStackTrace,
|
|
236
277
|
]
|
|
237
278
|
);
|
|
238
279
|
|
|
239
|
-
React.
|
|
280
|
+
const navigation: GenericNavigation<ParamListBase> = React.useMemo(() => {
|
|
281
|
+
const events = emitter.create('root');
|
|
282
|
+
|
|
283
|
+
const dispatch = (
|
|
284
|
+
thunk: NavigationAction | ((state: NavigationState) => NavigationAction)
|
|
285
|
+
) => {
|
|
286
|
+
const root = keyedListeners.getNavigation.root?.();
|
|
287
|
+
|
|
288
|
+
if (root == null) {
|
|
289
|
+
console.error(NOT_INITIALIZED_ERROR);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
withStackTrace(dispatch, () => {
|
|
294
|
+
React.startTransition(() => {
|
|
295
|
+
root.dispatch(thunk);
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
const helpers = Object.keys(CommonActions).reduce<any>((acc, name) => {
|
|
301
|
+
const helper = (...args: any) => {
|
|
302
|
+
if (
|
|
303
|
+
name === 'setParams' ||
|
|
304
|
+
name === 'replaceParams' ||
|
|
305
|
+
name === 'pushParams'
|
|
306
|
+
) {
|
|
307
|
+
throw new Error(`Cannot call ${name} outside a screen`);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
withStackTrace(helper, () =>
|
|
311
|
+
// @ts-expect-error name is a valid key, but TypeScript cannot infer it.
|
|
312
|
+
dispatch(CommonActions[name](...args))
|
|
313
|
+
);
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
acc[name] = helper;
|
|
317
|
+
|
|
318
|
+
return acc;
|
|
319
|
+
}, {});
|
|
320
|
+
|
|
321
|
+
const listeners = new WeakMap<
|
|
322
|
+
(...args: never[]) => void,
|
|
323
|
+
EventListenerCallback<NavigationContainerEventMap, 'state'>
|
|
324
|
+
>();
|
|
325
|
+
|
|
326
|
+
return {
|
|
327
|
+
...helpers,
|
|
328
|
+
dispatch,
|
|
329
|
+
addListener: (type, callback) => {
|
|
330
|
+
if (type === 'state') {
|
|
331
|
+
let listener = listeners.get(callback);
|
|
332
|
+
|
|
333
|
+
if (listener === undefined) {
|
|
334
|
+
// Root's state change events can contain stale and undefined state
|
|
335
|
+
// But navigation objects should only receive non-stale state
|
|
336
|
+
// So we add a wrapper to filter out stale events
|
|
337
|
+
listener = (event) => {
|
|
338
|
+
if (event.data.state?.stale === false) {
|
|
339
|
+
// @ts-expect-error TypeScript doesn't narrow the generic event callback with its type.
|
|
340
|
+
callback(event);
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
listeners.set(callback, listener);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return events.addListener('state', listener);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
return () => {};
|
|
351
|
+
},
|
|
352
|
+
removeListener: (type, callback) => {
|
|
353
|
+
if (type === 'state') {
|
|
354
|
+
const listener = listeners.get(callback);
|
|
355
|
+
|
|
356
|
+
if (listener) {
|
|
357
|
+
events.removeListener('state', listener);
|
|
358
|
+
listeners.delete(callback);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
canGoBack: () =>
|
|
363
|
+
keyedListeners.getNavigation.root?.().canGoBack() ?? false,
|
|
364
|
+
getState: () => keyedListeners.getState.root?.(),
|
|
365
|
+
getParent: (routeName?: string) => {
|
|
366
|
+
if (routeName !== undefined) {
|
|
367
|
+
throw new Error(
|
|
368
|
+
`Couldn't find a navigation object for '${routeName}' because it's called outside a screen. Is your component inside a screen?`
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return undefined;
|
|
373
|
+
},
|
|
374
|
+
setOptions: () => {
|
|
375
|
+
throw new Error('Cannot call setOptions outside a screen');
|
|
376
|
+
},
|
|
377
|
+
isFocused: () => true,
|
|
378
|
+
};
|
|
379
|
+
}, [emitter, keyedListeners, withStackTrace]);
|
|
380
|
+
|
|
381
|
+
React.useImperativeHandle(ref, () => container, [container]);
|
|
240
382
|
|
|
241
383
|
const onDispatchAction = useLatestCallback(
|
|
242
384
|
(action: NavigationAction, noop: boolean) => {
|
|
@@ -276,8 +418,6 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
276
418
|
});
|
|
277
419
|
});
|
|
278
420
|
|
|
279
|
-
const stackRef = React.useRef<string | undefined>(undefined);
|
|
280
|
-
|
|
281
421
|
const lastEmittedStateRef = React.useRef<State>(undefined);
|
|
282
422
|
|
|
283
423
|
const getIsStateEmitted = useLatestCallback(
|
|
@@ -294,7 +434,7 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
294
434
|
getIsStateEmitted,
|
|
295
435
|
scheduleUpdate,
|
|
296
436
|
flushUpdates,
|
|
297
|
-
|
|
437
|
+
withStackTrace,
|
|
298
438
|
}),
|
|
299
439
|
[
|
|
300
440
|
addListener,
|
|
@@ -305,6 +445,7 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
305
445
|
getIsStateEmitted,
|
|
306
446
|
scheduleUpdate,
|
|
307
447
|
flushUpdates,
|
|
448
|
+
withStackTrace,
|
|
308
449
|
]
|
|
309
450
|
);
|
|
310
451
|
|
|
@@ -359,59 +500,6 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
359
500
|
|
|
360
501
|
if (process.env.NODE_ENV !== 'production') {
|
|
361
502
|
if (hydratedState !== undefined) {
|
|
362
|
-
const serializableResult = checkSerializable(hydratedState);
|
|
363
|
-
|
|
364
|
-
if (!serializableResult.serializable) {
|
|
365
|
-
const { location, reason } = serializableResult;
|
|
366
|
-
|
|
367
|
-
let path = '';
|
|
368
|
-
let pointer: Record<any, any> = hydratedState;
|
|
369
|
-
let params = false;
|
|
370
|
-
|
|
371
|
-
for (let i = 0; i < location.length; i++) {
|
|
372
|
-
const curr = location[i];
|
|
373
|
-
const prev = location[i - 1];
|
|
374
|
-
|
|
375
|
-
if (curr == null) {
|
|
376
|
-
continue;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
pointer = pointer[curr];
|
|
380
|
-
|
|
381
|
-
if (!params && curr === 'state') {
|
|
382
|
-
continue;
|
|
383
|
-
} else if (!params && curr === 'routes') {
|
|
384
|
-
if (path) {
|
|
385
|
-
path += ' > ';
|
|
386
|
-
}
|
|
387
|
-
} else if (
|
|
388
|
-
!params &&
|
|
389
|
-
typeof curr === 'number' &&
|
|
390
|
-
prev === 'routes'
|
|
391
|
-
) {
|
|
392
|
-
path += pointer?.name;
|
|
393
|
-
} else if (!params) {
|
|
394
|
-
path += ` > ${curr}`;
|
|
395
|
-
params = true;
|
|
396
|
-
} else {
|
|
397
|
-
if (typeof curr === 'number' || /^[0-9]+$/.test(curr)) {
|
|
398
|
-
path += `[${curr}]`;
|
|
399
|
-
} else if (/^[a-z$_]+$/i.test(curr)) {
|
|
400
|
-
path += `.${curr}`;
|
|
401
|
-
} else {
|
|
402
|
-
path += `[${JSON.stringify(curr)}]`;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
const message = `Non-serializable values were found in the navigation state. Check:\n\n${path} (${reason})\n\nThis can break usage such as persisting and restoring state. This might happen if you passed non-serializable values such as function, class instances etc. in params. If you need to use components with callbacks in your options, you can use 'navigation.setOptions' instead. See https://reactnavigation.org/docs/troubleshooting#i-get-the-warning-non-serializable-values-were-found-in-the-navigation-state for more details.`;
|
|
408
|
-
|
|
409
|
-
if (!serializableWarnings.includes(message)) {
|
|
410
|
-
serializableWarnings.push(message);
|
|
411
|
-
console.warn(message);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
503
|
const duplicateRouteNamesResult =
|
|
416
504
|
checkDuplicateRouteNames(hydratedState);
|
|
417
505
|
|
|
@@ -420,10 +508,7 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
420
508
|
(locations) => `\n${locations.join(', ')}`
|
|
421
509
|
)}\n\nThis can cause confusing behavior during navigation. Consider using unique names for each screen instead.`;
|
|
422
510
|
|
|
423
|
-
|
|
424
|
-
duplicateNameWarnings.push(message);
|
|
425
|
-
console.warn(message);
|
|
426
|
-
}
|
|
511
|
+
warnOnce(true, message);
|
|
427
512
|
}
|
|
428
513
|
}
|
|
429
514
|
}
|
|
@@ -485,20 +570,22 @@ export function BaseNavigationContainer<ParamList extends {} = RootParamList>({
|
|
|
485
570
|
|
|
486
571
|
return (
|
|
487
572
|
<NavigationIndependentTreeContext.Provider value={false}>
|
|
488
|
-
<NavigationContainerRefContext.Provider value={
|
|
489
|
-
<
|
|
490
|
-
<
|
|
491
|
-
<
|
|
492
|
-
<
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
<
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
573
|
+
<NavigationContainerRefContext.Provider value={container}>
|
|
574
|
+
<NavigationRootContext.Provider value={navigation}>
|
|
575
|
+
<NavigationBuilderContext.Provider value={builderContext}>
|
|
576
|
+
<NavigationStateContext.Provider value={context}>
|
|
577
|
+
<ConsumedParamsContext.Provider value={consumedParams}>
|
|
578
|
+
<UnhandledActionContext.Provider
|
|
579
|
+
value={onUnhandledAction ?? defaultOnUnhandledAction}
|
|
580
|
+
>
|
|
581
|
+
<EnsureSingleNavigator>
|
|
582
|
+
<ThemeProvider value={theme}>{children}</ThemeProvider>
|
|
583
|
+
</EnsureSingleNavigator>
|
|
584
|
+
</UnhandledActionContext.Provider>
|
|
585
|
+
</ConsumedParamsContext.Provider>
|
|
586
|
+
</NavigationStateContext.Provider>
|
|
587
|
+
</NavigationBuilderContext.Provider>
|
|
588
|
+
</NavigationRootContext.Provider>
|
|
502
589
|
</NavigationContainerRefContext.Provider>
|
|
503
590
|
</NavigationIndependentTreeContext.Provider>
|
|
504
591
|
);
|
package/src/DataLoading.tsx
CHANGED
|
@@ -134,7 +134,10 @@ export function getLoaderForStateChange(
|
|
|
134
134
|
const nested =
|
|
135
135
|
'config' in item
|
|
136
136
|
? item
|
|
137
|
-
: 'screen' in item &&
|
|
137
|
+
: 'screen' in item &&
|
|
138
|
+
// Nested navigators cannot be defined as a getter
|
|
139
|
+
Object.getOwnPropertyDescriptor(item, 'screen')?.get == null &&
|
|
140
|
+
'config' in item.screen
|
|
138
141
|
? item.screen
|
|
139
142
|
: undefined;
|
|
140
143
|
|
|
@@ -15,6 +15,7 @@ export type ListenerMap = {
|
|
|
15
15
|
|
|
16
16
|
export type KeyedListenerMap = {
|
|
17
17
|
getState: GetStateListener;
|
|
18
|
+
getNavigation: GetNavigationListener;
|
|
18
19
|
beforeRemove: ChildBeforeRemoveListener;
|
|
19
20
|
};
|
|
20
21
|
|
|
@@ -47,6 +48,13 @@ export type FocusedNavigationListener = <T>(
|
|
|
47
48
|
|
|
48
49
|
export type GetStateListener = () => NavigationState;
|
|
49
50
|
|
|
51
|
+
export type GetNavigationListener = () => NavigationHelpers<ParamListBase>;
|
|
52
|
+
|
|
53
|
+
export type WithStackTrace = (
|
|
54
|
+
entry: (...args: never[]) => void,
|
|
55
|
+
callback: () => void
|
|
56
|
+
) => void;
|
|
57
|
+
|
|
50
58
|
export type ChildBeforeRemoveListener = (
|
|
51
59
|
action: NavigationAction,
|
|
52
60
|
nextState: NavigationState | PartialState<NavigationState> | undefined
|
|
@@ -73,7 +81,7 @@ export const NavigationBuilderContext = React.createContext<{
|
|
|
73
81
|
getIsStateEmitted: () => boolean;
|
|
74
82
|
scheduleUpdate: (callback: () => void) => void;
|
|
75
83
|
flushUpdates: () => void;
|
|
76
|
-
|
|
84
|
+
withStackTrace: WithStackTrace;
|
|
77
85
|
}>({
|
|
78
86
|
onDispatchAction: () => undefined,
|
|
79
87
|
onEmitEvent: () => undefined,
|
|
@@ -85,4 +93,5 @@ export const NavigationBuilderContext = React.createContext<{
|
|
|
85
93
|
flushUpdates: () => {
|
|
86
94
|
throw new Error("Couldn't find a context for flushing updates.");
|
|
87
95
|
},
|
|
96
|
+
withStackTrace: (_entry, callback) => callback(),
|
|
88
97
|
});
|
|
@@ -3,10 +3,12 @@ import * as React from 'react';
|
|
|
3
3
|
import { NavigationFocusedRouteStateContext } from './NavigationFocusedRouteStateContext';
|
|
4
4
|
import { NavigationIndependentTreeContext } from './NavigationIndependentTreeContext';
|
|
5
5
|
import {
|
|
6
|
+
IsScreenContext,
|
|
6
7
|
NamedRouteContextListContext,
|
|
7
8
|
NavigationContext,
|
|
8
9
|
NavigationRouteContext,
|
|
9
10
|
} from './NavigationProvider';
|
|
11
|
+
import { NavigationRootContext } from './NavigationRootContext';
|
|
10
12
|
import { IsFocusedContext } from './useIsFocused';
|
|
11
13
|
import {
|
|
12
14
|
NamedNavigationStateListenerListContext,
|
|
@@ -28,13 +30,17 @@ export function NavigationIndependentTree({
|
|
|
28
30
|
<NamedRouteContextListContext.Provider value={undefined}>
|
|
29
31
|
<NavigationRouteContext.Provider value={undefined}>
|
|
30
32
|
<NavigationContext.Provider value={undefined}>
|
|
31
|
-
<
|
|
32
|
-
<
|
|
33
|
-
<
|
|
34
|
-
{
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
<NavigationRootContext.Provider value={undefined}>
|
|
34
|
+
<NavigationFocusedRouteStateContext.Provider value={undefined}>
|
|
35
|
+
<IsFocusedContext.Provider value={undefined}>
|
|
36
|
+
<NavigationIndependentTreeContext.Provider value={true}>
|
|
37
|
+
<IsScreenContext.Provider value={false}>
|
|
38
|
+
{children}
|
|
39
|
+
</IsScreenContext.Provider>
|
|
40
|
+
</NavigationIndependentTreeContext.Provider>
|
|
41
|
+
</IsFocusedContext.Provider>
|
|
42
|
+
</NavigationFocusedRouteStateContext.Provider>
|
|
43
|
+
</NavigationRootContext.Provider>
|
|
38
44
|
</NavigationContext.Provider>
|
|
39
45
|
</NavigationRouteContext.Provider>
|
|
40
46
|
</NamedRouteContextListContext.Provider>
|
|
@@ -20,11 +20,10 @@ export const NavigationContext = React.createContext<
|
|
|
20
20
|
NavigationProp<ParamListBase> | undefined
|
|
21
21
|
>(undefined);
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
};
|
|
23
|
+
/**
|
|
24
|
+
* Context which indicates whether the component is inside a screen.
|
|
25
|
+
*/
|
|
26
|
+
export const IsScreenContext = React.createContext(false);
|
|
28
27
|
|
|
29
28
|
/**
|
|
30
29
|
* Component to provide the navigation and route contexts to its children.
|
|
@@ -33,6 +32,12 @@ export const NamedRouteContextListContext = React.createContext<
|
|
|
33
32
|
Record<string, React.Context<Route<string>>> | undefined
|
|
34
33
|
>(undefined);
|
|
35
34
|
|
|
35
|
+
type Props = {
|
|
36
|
+
route: Route<string>;
|
|
37
|
+
navigation: NavigationProp<ParamListBase>;
|
|
38
|
+
children: React.ReactNode;
|
|
39
|
+
};
|
|
40
|
+
|
|
36
41
|
export function NavigationProvider({ route, navigation, children }: Props) {
|
|
37
42
|
const NamedRouteContext = useLazyValue(() => React.createContext(route));
|
|
38
43
|
|
|
@@ -64,7 +69,9 @@ export function NavigationProvider({ route, navigation, children }: Props) {
|
|
|
64
69
|
<NavigationRouteContext.Provider value={route}>
|
|
65
70
|
<NavigationContext.Provider value={navigation}>
|
|
66
71
|
<IsFocusedContext.Provider value={isFocused}>
|
|
67
|
-
{
|
|
72
|
+
<IsScreenContext.Provider value={true}>
|
|
73
|
+
{children}
|
|
74
|
+
</IsScreenContext.Provider>
|
|
68
75
|
</IsFocusedContext.Provider>
|
|
69
76
|
</NavigationContext.Provider>
|
|
70
77
|
</NavigationRouteContext.Provider>
|