@react-navigation/native 7.1.1 → 7.1.3
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/commonjs/useLinkBuilder.js +37 -10
- package/lib/commonjs/useLinkBuilder.js.map +1 -1
- package/lib/commonjs/useRoutePath.js +4 -1
- package/lib/commonjs/useRoutePath.js.map +1 -1
- package/lib/module/useLinkBuilder.js +38 -11
- package/lib/module/useLinkBuilder.js.map +1 -1
- package/lib/module/useRoutePath.js +4 -1
- package/lib/module/useRoutePath.js.map +1 -1
- package/lib/typescript/commonjs/src/useLinkBuilder.d.ts +1 -1
- package/lib/typescript/commonjs/src/useLinkBuilder.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/useRoutePath.d.ts +1 -1
- package/lib/typescript/commonjs/src/useRoutePath.d.ts.map +1 -1
- package/lib/typescript/module/src/useLinkBuilder.d.ts +1 -1
- package/lib/typescript/module/src/useLinkBuilder.d.ts.map +1 -1
- package/lib/typescript/module/src/useRoutePath.d.ts +1 -1
- package/lib/typescript/module/src/useRoutePath.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/useLinkBuilder.tsx +49 -7
- package/src/useRoutePath.tsx +5 -1
|
@@ -15,6 +15,8 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
|
|
|
15
15
|
* @returns `buildHref` to build an `href` for screen and `buildAction` to build an action from an `href`.
|
|
16
16
|
*/
|
|
17
17
|
function useLinkBuilder() {
|
|
18
|
+
const navigation = React.useContext(_core.NavigationHelpersContext);
|
|
19
|
+
const route = React.useContext(_core.NavigationRouteContext);
|
|
18
20
|
const {
|
|
19
21
|
options
|
|
20
22
|
} = React.useContext(_LinkingContext.LinkingContext);
|
|
@@ -23,27 +25,52 @@ function useLinkBuilder() {
|
|
|
23
25
|
const getStateFromPathHelper = options?.getStateFromPath ?? _core.getStateFromPath;
|
|
24
26
|
const getActionFromStateHelper = options?.getActionFromState ?? _core.getActionFromState;
|
|
25
27
|
const buildHref = React.useCallback((name, params) => {
|
|
26
|
-
|
|
28
|
+
if (options?.enabled === false) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Check that we're inside:
|
|
33
|
+
// - navigator's context
|
|
34
|
+
// - route context of the navigator (could be a screen, tab, etc.)
|
|
35
|
+
// - route matches the state for path (from the screen's context)
|
|
36
|
+
// This ensures that we're inside a screen
|
|
37
|
+
const isScreen = navigation && route?.key && focusedRouteState ? route.key === (0, _core.findFocusedRoute)(focusedRouteState)?.key && navigation.getState().routes.some(r => r.key === route.key) : false;
|
|
38
|
+
const stateForRoute = {
|
|
39
|
+
routes: [{
|
|
40
|
+
name,
|
|
41
|
+
params
|
|
42
|
+
}]
|
|
43
|
+
};
|
|
44
|
+
const constructState = state => {
|
|
27
45
|
if (state) {
|
|
28
46
|
const route = state.routes[0];
|
|
47
|
+
|
|
48
|
+
// If we're inside a screen and at the innermost route
|
|
49
|
+
// We need to replace the state with the provided one
|
|
50
|
+
// This assumes that we're navigating to a sibling route
|
|
51
|
+
if (isScreen && !route.state) {
|
|
52
|
+
return stateForRoute;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Otherwise, dive into the nested state of the route
|
|
29
56
|
return {
|
|
30
57
|
routes: [{
|
|
31
58
|
...route,
|
|
32
|
-
state:
|
|
59
|
+
state: constructState(route.state)
|
|
33
60
|
}]
|
|
34
61
|
};
|
|
35
62
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
63
|
+
|
|
64
|
+
// Once there is no more nested state, we're at the innermost route
|
|
65
|
+
// We can add a state based on provided parameters
|
|
66
|
+
// This assumes that we're navigating to a child of this route
|
|
67
|
+
// In this case, the helper is used in a navigator for its routes
|
|
68
|
+
return stateForRoute;
|
|
42
69
|
};
|
|
43
|
-
const state =
|
|
70
|
+
const state = constructState(focusedRouteState);
|
|
44
71
|
const path = getPathFromStateHelper(state, options?.config);
|
|
45
72
|
return path;
|
|
46
|
-
}, [options?.config,
|
|
73
|
+
}, [options?.enabled, options?.config, route?.key, navigation, focusedRouteState, getPathFromStateHelper]);
|
|
47
74
|
const buildAction = React.useCallback(href => {
|
|
48
75
|
if (!href.startsWith('/')) {
|
|
49
76
|
throw new Error(`The href must start with '/' (${href}).`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_core","require","React","_interopRequireWildcard","_LinkingContext","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useLinkBuilder","
|
|
1
|
+
{"version":3,"names":["_core","require","React","_interopRequireWildcard","_LinkingContext","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useLinkBuilder","navigation","useContext","NavigationHelpersContext","route","NavigationRouteContext","options","LinkingContext","focusedRouteState","useStateForPath","getPathFromStateHelper","getPathFromState","getStateFromPathHelper","getStateFromPath","getActionFromStateHelper","getActionFromState","buildHref","useCallback","name","params","enabled","undefined","isScreen","key","findFocusedRoute","getState","routes","some","stateForRoute","constructState","state","path","config","buildAction","href","startsWith","Error","action","CommonActions","reset"],"sourceRoot":"../../src","sources":["useLinkBuilder.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,9 +24,12 @@ function useRoutePath() {
|
|
|
24
24
|
}
|
|
25
25
|
const getPathFromStateHelper = options?.getPathFromState ?? _core.getPathFromState;
|
|
26
26
|
const path = React.useMemo(() => {
|
|
27
|
+
if (options?.enabled === false) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
27
30
|
const path = getPathFromStateHelper(state, options?.config);
|
|
28
31
|
return path;
|
|
29
|
-
}, [
|
|
32
|
+
}, [options?.enabled, options?.config, state, getPathFromStateHelper]);
|
|
30
33
|
return path;
|
|
31
34
|
}
|
|
32
35
|
//# sourceMappingURL=useRoutePath.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_core","require","React","_interopRequireWildcard","_LinkingContext","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useRoutePath","options","useContext","LinkingContext","state","useStateForPath","undefined","Error","getPathFromStateHelper","getPathFromState","path","useMemo","config"],"sourceRoot":"../../src","sources":["useRoutePath.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAC,uBAAA,CAAAF,OAAA;AAEA,IAAAG,eAAA,GAAAH,OAAA;AAAkD,SAAAI,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAH,wBAAAG,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAElD;AACA;AACA;AACA;AACA;AACO,SAASW,YAAYA,CAAA,EAAG;EAC7B,MAAM;IAAEC;EAAQ,CAAC,GAAGxB,KAAK,CAACyB,UAAU,CAACC,8BAAc,CAAC;EACpD,MAAMC,KAAK,GAAG,IAAAC,qBAAe,EAAC,CAAC;EAE/B,IAAID,KAAK,KAAKE,SAAS,EAAE;IACvB,MAAM,IAAIC,KAAK,CACb,+FACF,CAAC;EACH;EAEA,MAAMC,sBAAsB,GAAGP,OAAO,EAAEQ,gBAAgB,IAAIA,sBAAgB;EAE5E,MAAMC,IAAI,GAAGjC,KAAK,CAACkC,OAAO,CAAC,MAAM;IAC/B,
|
|
1
|
+
{"version":3,"names":["_core","require","React","_interopRequireWildcard","_LinkingContext","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useRoutePath","options","useContext","LinkingContext","state","useStateForPath","undefined","Error","getPathFromStateHelper","getPathFromState","path","useMemo","enabled","config"],"sourceRoot":"../../src","sources":["useRoutePath.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAC,uBAAA,CAAAF,OAAA;AAEA,IAAAG,eAAA,GAAAH,OAAA;AAAkD,SAAAI,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAH,wBAAAG,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAElD;AACA;AACA;AACA;AACA;AACO,SAASW,YAAYA,CAAA,EAAG;EAC7B,MAAM;IAAEC;EAAQ,CAAC,GAAGxB,KAAK,CAACyB,UAAU,CAACC,8BAAc,CAAC;EACpD,MAAMC,KAAK,GAAG,IAAAC,qBAAe,EAAC,CAAC;EAE/B,IAAID,KAAK,KAAKE,SAAS,EAAE;IACvB,MAAM,IAAIC,KAAK,CACb,+FACF,CAAC;EACH;EAEA,MAAMC,sBAAsB,GAAGP,OAAO,EAAEQ,gBAAgB,IAAIA,sBAAgB;EAE5E,MAAMC,IAAI,GAAGjC,KAAK,CAACkC,OAAO,CAAC,MAAM;IAC/B,IAAIV,OAAO,EAAEW,OAAO,KAAK,KAAK,EAAE;MAC9B,OAAON,SAAS;IAClB;IAEA,MAAMI,IAAI,GAAGF,sBAAsB,CAACJ,KAAK,EAAEH,OAAO,EAAEY,MAAM,CAAC;IAE3D,OAAOH,IAAI;EACb,CAAC,EAAE,CAACT,OAAO,EAAEW,OAAO,EAAEX,OAAO,EAAEY,MAAM,EAAET,KAAK,EAAEI,sBAAsB,CAAC,CAAC;EAEtE,OAAOE,IAAI;AACb","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { CommonActions, getActionFromState, getPathFromState, getStateFromPath, useStateForPath } from '@react-navigation/core';
|
|
3
|
+
import { CommonActions, findFocusedRoute, getActionFromState, getPathFromState, getStateFromPath, NavigationHelpersContext, NavigationRouteContext, useStateForPath } from '@react-navigation/core';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { LinkingContext } from "./LinkingContext.js";
|
|
6
6
|
/**
|
|
@@ -9,6 +9,8 @@ import { LinkingContext } from "./LinkingContext.js";
|
|
|
9
9
|
* @returns `buildHref` to build an `href` for screen and `buildAction` to build an action from an `href`.
|
|
10
10
|
*/
|
|
11
11
|
export function useLinkBuilder() {
|
|
12
|
+
const navigation = React.useContext(NavigationHelpersContext);
|
|
13
|
+
const route = React.useContext(NavigationRouteContext);
|
|
12
14
|
const {
|
|
13
15
|
options
|
|
14
16
|
} = React.useContext(LinkingContext);
|
|
@@ -17,27 +19,52 @@ export function useLinkBuilder() {
|
|
|
17
19
|
const getStateFromPathHelper = options?.getStateFromPath ?? getStateFromPath;
|
|
18
20
|
const getActionFromStateHelper = options?.getActionFromState ?? getActionFromState;
|
|
19
21
|
const buildHref = React.useCallback((name, params) => {
|
|
20
|
-
|
|
22
|
+
if (options?.enabled === false) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Check that we're inside:
|
|
27
|
+
// - navigator's context
|
|
28
|
+
// - route context of the navigator (could be a screen, tab, etc.)
|
|
29
|
+
// - route matches the state for path (from the screen's context)
|
|
30
|
+
// This ensures that we're inside a screen
|
|
31
|
+
const isScreen = navigation && route?.key && focusedRouteState ? route.key === findFocusedRoute(focusedRouteState)?.key && navigation.getState().routes.some(r => r.key === route.key) : false;
|
|
32
|
+
const stateForRoute = {
|
|
33
|
+
routes: [{
|
|
34
|
+
name,
|
|
35
|
+
params
|
|
36
|
+
}]
|
|
37
|
+
};
|
|
38
|
+
const constructState = state => {
|
|
21
39
|
if (state) {
|
|
22
40
|
const route = state.routes[0];
|
|
41
|
+
|
|
42
|
+
// If we're inside a screen and at the innermost route
|
|
43
|
+
// We need to replace the state with the provided one
|
|
44
|
+
// This assumes that we're navigating to a sibling route
|
|
45
|
+
if (isScreen && !route.state) {
|
|
46
|
+
return stateForRoute;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Otherwise, dive into the nested state of the route
|
|
23
50
|
return {
|
|
24
51
|
routes: [{
|
|
25
52
|
...route,
|
|
26
|
-
state:
|
|
53
|
+
state: constructState(route.state)
|
|
27
54
|
}]
|
|
28
55
|
};
|
|
29
56
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
57
|
+
|
|
58
|
+
// Once there is no more nested state, we're at the innermost route
|
|
59
|
+
// We can add a state based on provided parameters
|
|
60
|
+
// This assumes that we're navigating to a child of this route
|
|
61
|
+
// In this case, the helper is used in a navigator for its routes
|
|
62
|
+
return stateForRoute;
|
|
36
63
|
};
|
|
37
|
-
const state =
|
|
64
|
+
const state = constructState(focusedRouteState);
|
|
38
65
|
const path = getPathFromStateHelper(state, options?.config);
|
|
39
66
|
return path;
|
|
40
|
-
}, [options?.config,
|
|
67
|
+
}, [options?.enabled, options?.config, route?.key, navigation, focusedRouteState, getPathFromStateHelper]);
|
|
41
68
|
const buildAction = React.useCallback(href => {
|
|
42
69
|
if (!href.startsWith('/')) {
|
|
43
70
|
throw new Error(`The href must start with '/' (${href}).`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CommonActions","getActionFromState","getPathFromState","getStateFromPath","useStateForPath","React","LinkingContext","useLinkBuilder","
|
|
1
|
+
{"version":3,"names":["CommonActions","findFocusedRoute","getActionFromState","getPathFromState","getStateFromPath","NavigationHelpersContext","NavigationRouteContext","useStateForPath","React","LinkingContext","useLinkBuilder","navigation","useContext","route","options","focusedRouteState","getPathFromStateHelper","getStateFromPathHelper","getActionFromStateHelper","buildHref","useCallback","name","params","enabled","undefined","isScreen","key","getState","routes","some","r","stateForRoute","constructState","state","path","config","buildAction","href","startsWith","Error","action","reset"],"sourceRoot":"../../src","sources":["useLinkBuilder.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -19,9 +19,12 @@ export function useRoutePath() {
|
|
|
19
19
|
}
|
|
20
20
|
const getPathFromStateHelper = options?.getPathFromState ?? getPathFromState;
|
|
21
21
|
const path = React.useMemo(() => {
|
|
22
|
+
if (options?.enabled === false) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
22
25
|
const path = getPathFromStateHelper(state, options?.config);
|
|
23
26
|
return path;
|
|
24
|
-
}, [
|
|
27
|
+
}, [options?.enabled, options?.config, state, getPathFromStateHelper]);
|
|
25
28
|
return path;
|
|
26
29
|
}
|
|
27
30
|
//# sourceMappingURL=useRoutePath.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getPathFromState","useStateForPath","React","LinkingContext","useRoutePath","options","useContext","state","undefined","Error","getPathFromStateHelper","path","useMemo","config"],"sourceRoot":"../../src","sources":["useRoutePath.tsx"],"mappings":";;AAAA,SAASA,gBAAgB,EAAEC,eAAe,QAAQ,wBAAwB;AAC1E,OAAO,KAAKC,KAAK,MAAM,OAAO;AAE9B,SAASC,cAAc,QAAQ,qBAAkB;;AAEjD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAG;EAC7B,MAAM;IAAEC;EAAQ,CAAC,GAAGH,KAAK,CAACI,UAAU,CAACH,cAAc,CAAC;EACpD,MAAMI,KAAK,GAAGN,eAAe,CAAC,CAAC;EAE/B,IAAIM,KAAK,KAAKC,SAAS,EAAE;IACvB,MAAM,IAAIC,KAAK,CACb,+FACF,CAAC;EACH;EAEA,MAAMC,sBAAsB,GAAGL,OAAO,EAAEL,gBAAgB,IAAIA,gBAAgB;EAE5E,MAAMW,IAAI,GAAGT,KAAK,CAACU,OAAO,CAAC,MAAM;IAC/B,
|
|
1
|
+
{"version":3,"names":["getPathFromState","useStateForPath","React","LinkingContext","useRoutePath","options","useContext","state","undefined","Error","getPathFromStateHelper","path","useMemo","enabled","config"],"sourceRoot":"../../src","sources":["useRoutePath.tsx"],"mappings":";;AAAA,SAASA,gBAAgB,EAAEC,eAAe,QAAQ,wBAAwB;AAC1E,OAAO,KAAKC,KAAK,MAAM,OAAO;AAE9B,SAASC,cAAc,QAAQ,qBAAkB;;AAEjD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAG;EAC7B,MAAM;IAAEC;EAAQ,CAAC,GAAGH,KAAK,CAACI,UAAU,CAACH,cAAc,CAAC;EACpD,MAAMI,KAAK,GAAGN,eAAe,CAAC,CAAC;EAE/B,IAAIM,KAAK,KAAKC,SAAS,EAAE;IACvB,MAAM,IAAIC,KAAK,CACb,+FACF,CAAC;EACH;EAEA,MAAMC,sBAAsB,GAAGL,OAAO,EAAEL,gBAAgB,IAAIA,gBAAgB;EAE5E,MAAMW,IAAI,GAAGT,KAAK,CAACU,OAAO,CAAC,MAAM;IAC/B,IAAIP,OAAO,EAAEQ,OAAO,KAAK,KAAK,EAAE;MAC9B,OAAOL,SAAS;IAClB;IAEA,MAAMG,IAAI,GAAGD,sBAAsB,CAACH,KAAK,EAAEF,OAAO,EAAES,MAAM,CAAC;IAE3D,OAAOH,IAAI;EACb,CAAC,EAAE,CAACN,OAAO,EAAEQ,OAAO,EAAER,OAAO,EAAES,MAAM,EAAEP,KAAK,EAAEG,sBAAsB,CAAC,CAAC;EAEtE,OAAOC,IAAI;AACb","ignoreList":[]}
|
|
@@ -5,7 +5,7 @@ import { CommonActions } from '@react-navigation/core';
|
|
|
5
5
|
* @returns `buildHref` to build an `href` for screen and `buildAction` to build an action from an `href`.
|
|
6
6
|
*/
|
|
7
7
|
export declare function useLinkBuilder(): {
|
|
8
|
-
buildHref: (name: string, params?: object) => string;
|
|
8
|
+
buildHref: (name: string, params?: object) => string | undefined;
|
|
9
9
|
buildAction: (href: string) => {
|
|
10
10
|
type: "NAVIGATE";
|
|
11
11
|
payload: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLinkBuilder.d.ts","sourceRoot":"","sources":["../../../../src/useLinkBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"useLinkBuilder.d.ts","sourceRoot":"","sources":["../../../../src/useLinkBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAQd,MAAM,wBAAwB,CAAC;AAShC;;;;GAIG;AACH,wBAAgB,cAAc;sBAcnB,MAAM,WAAW,MAAM;wBAmEvB,MAAM;;;;;;;;;;;;;;;;EAsBhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRoutePath.d.ts","sourceRoot":"","sources":["../../../../src/useRoutePath.tsx"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,YAAY,
|
|
1
|
+
{"version":3,"file":"useRoutePath.d.ts","sourceRoot":"","sources":["../../../../src/useRoutePath.tsx"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,YAAY,uBAuB3B"}
|
|
@@ -5,7 +5,7 @@ import { CommonActions } from '@react-navigation/core';
|
|
|
5
5
|
* @returns `buildHref` to build an `href` for screen and `buildAction` to build an action from an `href`.
|
|
6
6
|
*/
|
|
7
7
|
export declare function useLinkBuilder(): {
|
|
8
|
-
buildHref: (name: string, params?: object) => string;
|
|
8
|
+
buildHref: (name: string, params?: object) => string | undefined;
|
|
9
9
|
buildAction: (href: string) => {
|
|
10
10
|
type: "NAVIGATE";
|
|
11
11
|
payload: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLinkBuilder.d.ts","sourceRoot":"","sources":["../../../../src/useLinkBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"useLinkBuilder.d.ts","sourceRoot":"","sources":["../../../../src/useLinkBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAQd,MAAM,wBAAwB,CAAC;AAShC;;;;GAIG;AACH,wBAAgB,cAAc;sBAcnB,MAAM,WAAW,MAAM;wBAmEvB,MAAM;;;;;;;;;;;;;;;;EAsBhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRoutePath.d.ts","sourceRoot":"","sources":["../../../../src/useRoutePath.tsx"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,YAAY,
|
|
1
|
+
{"version":3,"file":"useRoutePath.d.ts","sourceRoot":"","sources":["../../../../src/useRoutePath.tsx"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,YAAY,uBAuB3B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-navigation/native",
|
|
3
3
|
"description": "React Native integration for React Navigation",
|
|
4
|
-
"version": "7.1.
|
|
4
|
+
"version": "7.1.3",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react-native",
|
|
7
7
|
"react-navigation",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"clean": "del lib"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@react-navigation/core": "^7.8.
|
|
51
|
+
"@react-navigation/core": "^7.8.2",
|
|
52
52
|
"escape-string-regexp": "^4.0.0",
|
|
53
53
|
"fast-deep-equal": "^3.1.3",
|
|
54
54
|
"nanoid": "3.3.8",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"react": "18.3.1",
|
|
64
64
|
"react-dom": "18.3.1",
|
|
65
65
|
"react-native": "0.76.2",
|
|
66
|
-
"react-native-builder-bob": "^0.39.
|
|
66
|
+
"react-native-builder-bob": "^0.39.1",
|
|
67
67
|
"typescript": "^5.5.2"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
@@ -95,5 +95,5 @@
|
|
|
95
95
|
]
|
|
96
96
|
]
|
|
97
97
|
},
|
|
98
|
-
"gitHead": "
|
|
98
|
+
"gitHead": "1ee608f918e50195907c6bd74c193be7d0a2a8c8"
|
|
99
99
|
}
|
package/src/useLinkBuilder.tsx
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CommonActions,
|
|
3
|
+
findFocusedRoute,
|
|
3
4
|
getActionFromState,
|
|
4
5
|
getPathFromState,
|
|
5
6
|
getStateFromPath,
|
|
7
|
+
NavigationHelpersContext,
|
|
8
|
+
NavigationRouteContext,
|
|
6
9
|
useStateForPath,
|
|
7
10
|
} from '@react-navigation/core';
|
|
8
11
|
import * as React from 'react';
|
|
@@ -19,6 +22,9 @@ type MinimalState = {
|
|
|
19
22
|
* @returns `buildHref` to build an `href` for screen and `buildAction` to build an action from an `href`.
|
|
20
23
|
*/
|
|
21
24
|
export function useLinkBuilder() {
|
|
25
|
+
const navigation = React.useContext(NavigationHelpersContext);
|
|
26
|
+
const route = React.useContext(NavigationRouteContext);
|
|
27
|
+
|
|
22
28
|
const { options } = React.useContext(LinkingContext);
|
|
23
29
|
|
|
24
30
|
const focusedRouteState = useStateForPath();
|
|
@@ -30,33 +36,69 @@ export function useLinkBuilder() {
|
|
|
30
36
|
|
|
31
37
|
const buildHref = React.useCallback(
|
|
32
38
|
(name: string, params?: object) => {
|
|
33
|
-
|
|
39
|
+
if (options?.enabled === false) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Check that we're inside:
|
|
44
|
+
// - navigator's context
|
|
45
|
+
// - route context of the navigator (could be a screen, tab, etc.)
|
|
46
|
+
// - route matches the state for path (from the screen's context)
|
|
47
|
+
// This ensures that we're inside a screen
|
|
48
|
+
const isScreen =
|
|
49
|
+
navigation && route?.key && focusedRouteState
|
|
50
|
+
? route.key === findFocusedRoute(focusedRouteState)?.key &&
|
|
51
|
+
navigation.getState().routes.some((r) => r.key === route.key)
|
|
52
|
+
: false;
|
|
53
|
+
|
|
54
|
+
const stateForRoute: MinimalState = {
|
|
55
|
+
routes: [{ name, params }],
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const constructState = (
|
|
34
59
|
state: MinimalState | undefined
|
|
35
60
|
): MinimalState => {
|
|
36
61
|
if (state) {
|
|
37
62
|
const route = state.routes[0];
|
|
38
63
|
|
|
64
|
+
// If we're inside a screen and at the innermost route
|
|
65
|
+
// We need to replace the state with the provided one
|
|
66
|
+
// This assumes that we're navigating to a sibling route
|
|
67
|
+
if (isScreen && !route.state) {
|
|
68
|
+
return stateForRoute;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Otherwise, dive into the nested state of the route
|
|
39
72
|
return {
|
|
40
73
|
routes: [
|
|
41
74
|
{
|
|
42
75
|
...route,
|
|
43
|
-
state:
|
|
76
|
+
state: constructState(route.state),
|
|
44
77
|
},
|
|
45
78
|
],
|
|
46
79
|
};
|
|
47
80
|
}
|
|
48
81
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
82
|
+
// Once there is no more nested state, we're at the innermost route
|
|
83
|
+
// We can add a state based on provided parameters
|
|
84
|
+
// This assumes that we're navigating to a child of this route
|
|
85
|
+
// In this case, the helper is used in a navigator for its routes
|
|
86
|
+
return stateForRoute;
|
|
52
87
|
};
|
|
53
88
|
|
|
54
|
-
const state =
|
|
89
|
+
const state = constructState(focusedRouteState);
|
|
55
90
|
const path = getPathFromStateHelper(state, options?.config);
|
|
56
91
|
|
|
57
92
|
return path;
|
|
58
93
|
},
|
|
59
|
-
[
|
|
94
|
+
[
|
|
95
|
+
options?.enabled,
|
|
96
|
+
options?.config,
|
|
97
|
+
route?.key,
|
|
98
|
+
navigation,
|
|
99
|
+
focusedRouteState,
|
|
100
|
+
getPathFromStateHelper,
|
|
101
|
+
]
|
|
60
102
|
);
|
|
61
103
|
|
|
62
104
|
const buildAction = React.useCallback(
|
package/src/useRoutePath.tsx
CHANGED
|
@@ -21,10 +21,14 @@ export function useRoutePath() {
|
|
|
21
21
|
const getPathFromStateHelper = options?.getPathFromState ?? getPathFromState;
|
|
22
22
|
|
|
23
23
|
const path = React.useMemo(() => {
|
|
24
|
+
if (options?.enabled === false) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
24
28
|
const path = getPathFromStateHelper(state, options?.config);
|
|
25
29
|
|
|
26
30
|
return path;
|
|
27
|
-
}, [
|
|
31
|
+
}, [options?.enabled, options?.config, state, getPathFromStateHelper]);
|
|
28
32
|
|
|
29
33
|
return path;
|
|
30
34
|
}
|