@react-navigation/native 7.1.26 → 8.0.0-alpha.0
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/Link.js.map +1 -1
- package/lib/module/NavigationContainer.js +73 -63
- package/lib/module/NavigationContainer.js.map +1 -1
- package/lib/module/__stubs__/createStackNavigator.js.map +1 -1
- package/lib/module/extractPathFromURL.js +12 -7
- package/lib/module/extractPathFromURL.js.map +1 -1
- package/lib/module/getStateFromHref.js +30 -0
- package/lib/module/getStateFromHref.js.map +1 -0
- package/lib/module/index.js +0 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/theming/DarkTheme.js.map +1 -1
- package/lib/module/theming/DefaultTheme.js +1 -1
- package/lib/module/theming/DefaultTheme.js.map +1 -1
- package/lib/module/theming/fonts.js.map +1 -1
- package/lib/module/useLinkBuilder.js +5 -8
- package/lib/module/useLinkBuilder.js.map +1 -1
- package/lib/module/useLinkProps.js +20 -0
- package/lib/module/useLinkProps.js.map +1 -1
- package/lib/module/useLinking.js +23 -24
- package/lib/module/useLinking.js.map +1 -1
- package/lib/module/useLinking.native.js +21 -36
- package/lib/module/useLinking.native.js.map +1 -1
- package/lib/module/useScrollToTop.js +1 -0
- package/lib/module/useScrollToTop.js.map +1 -1
- package/lib/module/useThenable.js +9 -6
- package/lib/module/useThenable.js.map +1 -1
- package/lib/typescript/src/Link.d.ts +3 -2
- package/lib/typescript/src/Link.d.ts.map +1 -1
- package/lib/typescript/src/NavigationContainer.d.ts +35 -7
- package/lib/typescript/src/NavigationContainer.d.ts.map +1 -1
- package/lib/typescript/src/__stubs__/createStackNavigator.d.ts +1 -2
- package/lib/typescript/src/__stubs__/createStackNavigator.d.ts.map +1 -1
- package/lib/typescript/src/extractPathFromURL.d.ts +2 -1
- package/lib/typescript/src/extractPathFromURL.d.ts.map +1 -1
- package/lib/typescript/src/getStateFromHref.d.ts +4 -0
- package/lib/typescript/src/getStateFromHref.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +0 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/theming/DarkTheme.d.ts +63 -2
- package/lib/typescript/src/theming/DarkTheme.d.ts.map +1 -1
- package/lib/typescript/src/theming/DefaultTheme.d.ts +63 -2
- package/lib/typescript/src/theming/DefaultTheme.d.ts.map +1 -1
- package/lib/typescript/src/theming/fonts.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +49 -23
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/useLinkBuilder.d.ts +14 -6
- package/lib/typescript/src/useLinkBuilder.d.ts.map +1 -1
- package/lib/typescript/src/useLinkProps.d.ts +3 -3
- package/lib/typescript/src/useLinkProps.d.ts.map +1 -1
- package/lib/typescript/src/useLinking.d.ts +48 -4
- package/lib/typescript/src/useLinking.d.ts.map +1 -1
- package/lib/typescript/src/useLinking.native.d.ts +69 -4
- package/lib/typescript/src/useLinking.native.d.ts.map +1 -1
- package/lib/typescript/src/useScrollToTop.d.ts.map +1 -1
- package/lib/typescript/src/useThenable.d.ts +4 -1
- package/lib/typescript/src/useThenable.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/Link.tsx +18 -15
- package/src/NavigationContainer.tsx +141 -84
- package/src/__stubs__/createStackNavigator.tsx +0 -2
- package/src/extractPathFromURL.tsx +28 -18
- package/src/getStateFromHref.tsx +46 -0
- package/src/index.tsx +0 -1
- package/src/theming/DarkTheme.tsx +4 -3
- package/src/theming/DefaultTheme.tsx +5 -4
- package/src/theming/fonts.tsx +1 -2
- package/src/types.tsx +60 -22
- package/src/useLinkBuilder.tsx +6 -9
- package/src/useLinkProps.tsx +36 -7
- package/src/useLinking.native.tsx +25 -48
- package/src/useLinking.tsx +32 -38
- package/src/useScrollToTop.tsx +3 -1
- package/src/useThenable.tsx +14 -6
- package/lib/module/UnhandledLinkingContext.js +0 -14
- package/lib/module/UnhandledLinkingContext.js.map +0 -1
- package/lib/typescript/src/UnhandledLinkingContext.d.ts +0 -6
- package/lib/typescript/src/UnhandledLinkingContext.d.ts.map +0 -1
- package/src/UnhandledLinkingContext.tsx +0 -18
package/lib/module/Link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useTheme","React","Platform","Text","useLinkProps","Link","screen","params","action","href","style","rest","colors","fonts","props","onPress","e","defaultPrevented","createElement","select","web","onClick","default","color","primary","regular"],"sourceRoot":"../../src","sources":["Link.tsx"],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"names":["useTheme","React","Platform","Text","useLinkProps","Link","screen","params","action","href","style","rest","colors","fonts","props","onPress","e","defaultPrevented","createElement","select","web","onClick","default","color","primary","regular"],"sourceRoot":"../../src","sources":["Link.tsx"],"mappings":";;AAAA,SAA6BA,QAAQ,QAAQ,wBAAwB;AACrE,OAAO,KAAKC,KAAK,MAAM,OAAO;AAC9B,SAEEC,QAAQ,EACRC,IAAI,QAEC,cAAc;AAErB,SAAyBC,YAAY,QAAQ,mBAAgB;AAe7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,IAAIA,CAGlB;EACAC,MAAM;EACNC,MAAM;EACNC,MAAM;EACNC,IAAI;EACJC,KAAK;EACL,GAAGC;AACwB,CAAC,EAAE;EAC9B,MAAM;IAAEC,MAAM;IAAEC;EAAM,CAAC,GAAGb,QAAQ,CAAC,CAAC;EACpC;EACA,MAAMc,KAAK,GAAGV,YAAY,CAAY;IAAEE,MAAM;IAAEC,MAAM;IAAEC,MAAM;IAAEC;EAAK,CAAC,CAAC;EAEvE,MAAMM,OAAO,GACXC,CAA0E,IACvE;IACH,IAAI,SAAS,IAAIL,IAAI,EAAE;MACrBA,IAAI,CAACI,OAAO,GAAGC,CAAC,CAAC;IACnB;;IAEA;IACA,IAAI,CAACA,CAAC,CAACC,gBAAgB,EAAE;MACvBH,KAAK,CAACC,OAAO,CAACC,CAAC,CAAC;IAClB;EACF,CAAC;EAED,oBAAOf,KAAK,CAACiB,aAAa,CAACf,IAAI,EAAE;IAC/B,GAAGW,KAAK;IACR,GAAGH,IAAI;IACP,GAAGT,QAAQ,CAACiB,MAAM,CAAC;MACjBC,GAAG,EAAE;QAAEC,OAAO,EAAEN;MAAQ,CAAQ;MAChCO,OAAO,EAAE;QAAEP;MAAQ;IACrB,CAAC,CAAC;IACFL,KAAK,EAAE,CAAC;MAAEa,KAAK,EAAEX,MAAM,CAACY;IAAQ,CAAC,EAAEX,KAAK,CAACY,OAAO,EAAEf,KAAK;EACzD,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -2,97 +2,107 @@
|
|
|
2
2
|
|
|
3
3
|
import { BaseNavigationContainer, getActionFromState, getPathFromState, getStateFromPath, ThemeProvider, validatePathConfig } from '@react-navigation/core';
|
|
4
4
|
import * as React from 'react';
|
|
5
|
-
import { I18nManager } from 'react-native';
|
|
6
|
-
import useLatestCallback from 'use-latest-callback';
|
|
5
|
+
import { I18nManager, Platform } from 'react-native';
|
|
7
6
|
import { LinkingContext } from "./LinkingContext.js";
|
|
8
7
|
import { LocaleDirContext } from "./LocaleDirContext.js";
|
|
9
8
|
import { DefaultTheme } from "./theming/DefaultTheme.js";
|
|
10
|
-
import { UnhandledLinkingContext } from "./UnhandledLinkingContext.js";
|
|
11
9
|
import { useBackButton } from './useBackButton';
|
|
12
10
|
import { useDocumentTitle } from './useDocumentTitle';
|
|
13
11
|
import { useLinking } from './useLinking';
|
|
14
12
|
import { useThenable } from "./useThenable.js";
|
|
15
13
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
14
|
globalThis.REACT_NAVIGATION_DEVTOOLS = new WeakMap();
|
|
15
|
+
const RESTORE_STATE_ERROR = 'Failed to restore navigation state. The state will be initialized based on the navigation tree.';
|
|
17
16
|
function NavigationContainerInner({
|
|
18
17
|
direction = I18nManager.getConstants().isRTL ? 'rtl' : 'ltr',
|
|
19
18
|
theme = DefaultTheme,
|
|
20
19
|
linking,
|
|
20
|
+
persistor,
|
|
21
21
|
fallback = null,
|
|
22
22
|
documentTitle,
|
|
23
|
-
onReady,
|
|
24
23
|
onStateChange,
|
|
25
24
|
...rest
|
|
26
25
|
}, ref) {
|
|
27
|
-
const isLinkingEnabled = linking ? linking.enabled !== false : false;
|
|
28
26
|
if (linking?.config) {
|
|
29
27
|
validatePathConfig(linking.config);
|
|
30
28
|
}
|
|
31
29
|
const refContainer = React.useRef(null);
|
|
32
30
|
useBackButton(refContainer);
|
|
33
31
|
useDocumentTitle(refContainer, documentTitle);
|
|
34
|
-
const
|
|
32
|
+
const linkingConfig = React.useMemo(() => {
|
|
33
|
+
if (linking == null) {
|
|
34
|
+
return {
|
|
35
|
+
options: {
|
|
36
|
+
enabled: false
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
options: {
|
|
42
|
+
...linking,
|
|
43
|
+
enabled: linking.enabled !== false,
|
|
44
|
+
prefixes: linking.prefixes ?? ['*'],
|
|
45
|
+
getStateFromPath: linking?.getStateFromPath ?? getStateFromPath,
|
|
46
|
+
getPathFromState: linking?.getPathFromState ?? getPathFromState,
|
|
47
|
+
getActionFromState: linking?.getActionFromState ?? getActionFromState
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}, [linking]);
|
|
35
51
|
const {
|
|
36
52
|
getInitialState
|
|
37
|
-
} = useLinking(refContainer,
|
|
38
|
-
|
|
39
|
-
prefixes: [],
|
|
40
|
-
...linking
|
|
41
|
-
}, setLastUnhandledLink);
|
|
42
|
-
const linkingContext = React.useMemo(() => ({
|
|
43
|
-
options: linking
|
|
44
|
-
}), [linking]);
|
|
45
|
-
const unhandledLinkingContext = React.useMemo(() => ({
|
|
46
|
-
lastUnhandledLink,
|
|
47
|
-
setLastUnhandledLink
|
|
48
|
-
}), [lastUnhandledLink, setLastUnhandledLink]);
|
|
49
|
-
const onReadyForLinkingHandling = useLatestCallback(() => {
|
|
50
|
-
// If the screen path matches lastUnhandledLink, we do not track it
|
|
51
|
-
const path = refContainer.current?.getCurrentRoute()?.path;
|
|
52
|
-
setLastUnhandledLink(previousLastUnhandledLink => {
|
|
53
|
-
if (previousLastUnhandledLink === path) {
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
return previousLastUnhandledLink;
|
|
57
|
-
});
|
|
58
|
-
onReady?.();
|
|
59
|
-
});
|
|
60
|
-
const onStateChangeForLinkingHandling = useLatestCallback(state => {
|
|
61
|
-
// If the screen path matches lastUnhandledLink, we do not track it
|
|
62
|
-
const path = refContainer.current?.getCurrentRoute()?.path;
|
|
63
|
-
setLastUnhandledLink(previousLastUnhandledLink => {
|
|
64
|
-
if (previousLastUnhandledLink === path) {
|
|
65
|
-
return undefined;
|
|
66
|
-
}
|
|
67
|
-
return previousLastUnhandledLink;
|
|
68
|
-
});
|
|
69
|
-
onStateChange?.(state);
|
|
70
|
-
});
|
|
53
|
+
} = useLinking(refContainer, linkingConfig.options);
|
|
54
|
+
|
|
71
55
|
// Add additional linking related info to the ref
|
|
72
56
|
// This will be used by the devtools
|
|
73
57
|
React.useEffect(() => {
|
|
74
58
|
if (refContainer.current) {
|
|
75
59
|
REACT_NAVIGATION_DEVTOOLS.set(refContainer.current, {
|
|
76
60
|
get linking() {
|
|
77
|
-
return
|
|
78
|
-
...linking,
|
|
79
|
-
enabled: isLinkingEnabled,
|
|
80
|
-
prefixes: linking?.prefixes ?? [],
|
|
81
|
-
getStateFromPath: linking?.getStateFromPath ?? getStateFromPath,
|
|
82
|
-
getPathFromState: linking?.getPathFromState ?? getPathFromState,
|
|
83
|
-
getActionFromState: linking?.getActionFromState ?? getActionFromState
|
|
84
|
-
};
|
|
61
|
+
return linkingConfig.options;
|
|
85
62
|
}
|
|
86
63
|
});
|
|
87
64
|
}
|
|
88
65
|
});
|
|
89
|
-
const [
|
|
66
|
+
const [isLinkStateResolved, initialStateFromLink] = useThenable(() => {
|
|
67
|
+
if (rest.initialState != null || !linkingConfig.options.enabled) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
return getInitialState();
|
|
71
|
+
});
|
|
72
|
+
const isPersistenceSupported = Platform.OS === 'web' ? !linkingConfig.options.enabled : true;
|
|
73
|
+
const [isPersistedStateResolved, initialStateFromPersisted] = useThenable(() => {
|
|
74
|
+
if (isPersistenceSupported === false || rest.initialState != null || persistor == null) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
let restoredState;
|
|
78
|
+
try {
|
|
79
|
+
restoredState = persistor.restore();
|
|
80
|
+
} catch (e) {
|
|
81
|
+
console.error(RESTORE_STATE_ERROR, e);
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
if (restoredState == null) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
if ('then' in restoredState) {
|
|
88
|
+
return restoredState.then(state => state, error => {
|
|
89
|
+
console.error(RESTORE_STATE_ERROR, error);
|
|
90
|
+
return undefined;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const thenable = {
|
|
94
|
+
then(onfulfilled) {
|
|
95
|
+
return Promise.resolve(onfulfilled ? onfulfilled(restoredState) : restoredState);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
return thenable;
|
|
99
|
+
});
|
|
90
100
|
|
|
91
101
|
// FIXME
|
|
92
102
|
// @ts-expect-error not sure why this is not working
|
|
93
103
|
React.useImperativeHandle(ref, () => refContainer.current);
|
|
94
|
-
const
|
|
95
|
-
if (!
|
|
104
|
+
const isStateReady = rest.initialState != null || isLinkStateResolved && isPersistedStateResolved;
|
|
105
|
+
if (!isStateReady) {
|
|
96
106
|
return /*#__PURE__*/_jsx(LocaleDirContext.Provider, {
|
|
97
107
|
value: direction,
|
|
98
108
|
children: /*#__PURE__*/_jsx(ThemeProvider, {
|
|
@@ -103,18 +113,17 @@ function NavigationContainerInner({
|
|
|
103
113
|
}
|
|
104
114
|
return /*#__PURE__*/_jsx(LocaleDirContext.Provider, {
|
|
105
115
|
value: direction,
|
|
106
|
-
children: /*#__PURE__*/_jsx(
|
|
107
|
-
value:
|
|
108
|
-
children: /*#__PURE__*/_jsx(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
})
|
|
116
|
+
children: /*#__PURE__*/_jsx(LinkingContext.Provider, {
|
|
117
|
+
value: linkingConfig,
|
|
118
|
+
children: /*#__PURE__*/_jsx(BaseNavigationContainer, {
|
|
119
|
+
...rest,
|
|
120
|
+
theme: theme,
|
|
121
|
+
initialState: rest.initialState ?? initialStateFromLink ?? initialStateFromPersisted,
|
|
122
|
+
onStateChange: state => {
|
|
123
|
+
onStateChange?.(state);
|
|
124
|
+
persistor?.persist(state);
|
|
125
|
+
},
|
|
126
|
+
ref: refContainer
|
|
118
127
|
})
|
|
119
128
|
})
|
|
120
129
|
});
|
|
@@ -122,6 +131,7 @@ function NavigationContainerInner({
|
|
|
122
131
|
|
|
123
132
|
/**
|
|
124
133
|
* Container component that manages the navigation state.
|
|
134
|
+
*
|
|
125
135
|
* This should be rendered at the root wrapping the whole app.
|
|
126
136
|
*/
|
|
127
137
|
export const NavigationContainer = /*#__PURE__*/React.forwardRef(NavigationContainerInner);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseNavigationContainer","getActionFromState","getPathFromState","getStateFromPath","ThemeProvider","validatePathConfig","React","I18nManager","
|
|
1
|
+
{"version":3,"names":["BaseNavigationContainer","getActionFromState","getPathFromState","getStateFromPath","ThemeProvider","validatePathConfig","React","I18nManager","Platform","LinkingContext","LocaleDirContext","DefaultTheme","useBackButton","useDocumentTitle","useLinking","useThenable","jsx","_jsx","globalThis","REACT_NAVIGATION_DEVTOOLS","WeakMap","RESTORE_STATE_ERROR","NavigationContainerInner","direction","getConstants","isRTL","theme","linking","persistor","fallback","documentTitle","onStateChange","rest","ref","config","refContainer","useRef","linkingConfig","useMemo","options","enabled","prefixes","getInitialState","useEffect","current","set","isLinkStateResolved","initialStateFromLink","initialState","undefined","isPersistenceSupported","OS","isPersistedStateResolved","initialStateFromPersisted","restoredState","restore","e","console","error","then","state","thenable","onfulfilled","Promise","resolve","useImperativeHandle","isStateReady","Provider","value","children","persist","NavigationContainer","forwardRef"],"sourceRoot":"../../src","sources":["NavigationContainer.tsx"],"mappings":";;AAAA,SACEA,uBAAuB,EACvBC,kBAAkB,EAClBC,gBAAgB,EAChBC,gBAAgB,EAMhBC,aAAa,EACbC,kBAAkB,QACb,wBAAwB;AAC/B,OAAO,KAAKC,KAAK,MAAM,OAAO;AAC9B,SAASC,WAAW,EAAEC,QAAQ,QAAQ,cAAc;AAEpD,SAASC,cAAc,QAAQ,qBAAkB;AACjD,SAASC,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,YAAY,QAAQ,2BAAwB;AAOrD,SAASC,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,gBAAgB,QAAQ,oBAAoB;AACrD,SAASC,UAAU,QAAQ,cAAc;AACzC,SAAwBC,WAAW,QAAQ,kBAAe;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAS3DC,UAAU,CAACC,yBAAyB,GAAG,IAAIC,OAAO,CAAC,CAAC;AA8DpD,MAAMC,mBAAmB,GACvB,iGAAiG;AAEnG,SAASC,wBAAwBA,CAC/B;EACEC,SAAS,GAAGhB,WAAW,CAACiB,YAAY,CAAC,CAAC,CAACC,KAAK,GAAG,KAAK,GAAG,KAAK;EAC5DC,KAAK,GAAGf,YAAY;EACpBgB,OAAO;EACPC,SAAS;EACTC,QAAQ,GAAG,IAAI;EACfC,aAAa;EACbC,aAAa;EACb,GAAGC;AACiB,CAAC,EACvBC,GAA6D,EAC7D;EACA,IAAIN,OAAO,EAAEO,MAAM,EAAE;IACnB7B,kBAAkB,CAACsB,OAAO,CAACO,MAAM,CAAC;EACpC;EAEA,MAAMC,YAAY,GAChB7B,KAAK,CAAC8B,MAAM,CAAwC,IAAI,CAAC;EAE3DxB,aAAa,CAACuB,YAAY,CAAC;EAC3BtB,gBAAgB,CAACsB,YAAY,EAAEL,aAAa,CAAC;EAE7C,MAAMO,aAAa,GAAG/B,KAAK,CAACgC,OAAO,CAAC,MAAM;IACxC,IAAIX,OAAO,IAAI,IAAI,EAAE;MACnB,OAAO;QACLY,OAAO,EAAE;UACPC,OAAO,EAAE;QACX;MACF,CAAC;IACH;IAEA,OAAO;MACLD,OAAO,EAAE;QACP,GAAGZ,OAAO;QACVa,OAAO,EAAEb,OAAO,CAACa,OAAO,KAAK,KAAK;QAClCC,QAAQ,EAAEd,OAAO,CAACc,QAAQ,IAAI,CAAC,GAAG,CAAC;QACnCtC,gBAAgB,EAAEwB,OAAO,EAAExB,gBAAgB,IAAIA,gBAAgB;QAC/DD,gBAAgB,EAAEyB,OAAO,EAAEzB,gBAAgB,IAAIA,gBAAgB;QAC/DD,kBAAkB,EAAE0B,OAAO,EAAE1B,kBAAkB,IAAIA;MACrD;IACF,CAAC;EACH,CAAC,EAAE,CAAC0B,OAAO,CAAC,CAAC;EAEb,MAAM;IAAEe;EAAgB,CAAC,GAAG5B,UAAU,CAACqB,YAAY,EAAEE,aAAa,CAACE,OAAO,CAAC;;EAE3E;EACA;EACAjC,KAAK,CAACqC,SAAS,CAAC,MAAM;IACpB,IAAIR,YAAY,CAACS,OAAO,EAAE;MACxBzB,yBAAyB,CAAC0B,GAAG,CAACV,YAAY,CAACS,OAAO,EAAE;QAClD,IAAIjB,OAAOA,CAAA,EAAG;UACZ,OAAOU,aAAa,CAACE,OAAO;QAC9B;MACF,CAAC,CAAC;IACJ;EACF,CAAC,CAAC;EAEF,MAAM,CAACO,mBAAmB,EAAEC,oBAAoB,CAAC,GAAGhC,WAAW,CAAC,MAAM;IACpE,IAAIiB,IAAI,CAACgB,YAAY,IAAI,IAAI,IAAI,CAACX,aAAa,CAACE,OAAO,CAACC,OAAO,EAAE;MAC/D,OAAOS,SAAS;IAClB;IAEA,OAAOP,eAAe,CAAC,CAAC;EAC1B,CAAC,CAAC;EAEF,MAAMQ,sBAAsB,GAC1B1C,QAAQ,CAAC2C,EAAE,KAAK,KAAK,GAAG,CAACd,aAAa,CAACE,OAAO,CAACC,OAAO,GAAG,IAAI;EAE/D,MAAM,CAACY,wBAAwB,EAAEC,yBAAyB,CAAC,GAAGtC,WAAW,CACvE,MAAM;IACJ,IACEmC,sBAAsB,KAAK,KAAK,IAChClB,IAAI,CAACgB,YAAY,IAAI,IAAI,IACzBpB,SAAS,IAAI,IAAI,EACjB;MACA,OAAOqB,SAAS;IAClB;IAEA,IAAIK,aAAa;IAEjB,IAAI;MACFA,aAAa,GAAG1B,SAAS,CAAC2B,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,OAAOC,CAAC,EAAE;MACVC,OAAO,CAACC,KAAK,CAACrC,mBAAmB,EAAEmC,CAAC,CAAC;MAErC,OAAOP,SAAS;IAClB;IAEA,IAAIK,aAAa,IAAI,IAAI,EAAE;MACzB,OAAOL,SAAS;IAClB;IAEA,IAAI,MAAM,IAAIK,aAAa,EAAE;MAC3B,OAAOA,aAAa,CAACK,IAAI,CACtBC,KAAK,IAAKA,KAAK,EACfF,KAAK,IAAK;QACTD,OAAO,CAACC,KAAK,CAACrC,mBAAmB,EAAEqC,KAAK,CAAC;QAEzC,OAAOT,SAAS;MAClB,CACF,CAAC;IACH;IAEA,MAAMY,QAA4C,GAAG;MACnDF,IAAIA,CAACG,WAAW,EAAE;QAChB,OAAOC,OAAO,CAACC,OAAO,CACpBF,WAAW,GAAGA,WAAW,CAACR,aAAa,CAAC,GAAGA,aAC7C,CAAC;MACH;IACF,CAAC;IAED,OAAOO,QAAQ;EACjB,CACF,CAAC;;EAED;EACA;EACAvD,KAAK,CAAC2D,mBAAmB,CAAChC,GAAG,EAAE,MAAME,YAAY,CAACS,OAAO,CAAC;EAE1D,MAAMsB,YAAY,GAChBlC,IAAI,CAACgB,YAAY,IAAI,IAAI,IACxBF,mBAAmB,IAAIM,wBAAyB;EAEnD,IAAI,CAACc,YAAY,EAAE;IACjB,oBACEjD,IAAA,CAACP,gBAAgB,CAACyD,QAAQ;MAACC,KAAK,EAAE7C,SAAU;MAAA8C,QAAA,eAC1CpD,IAAA,CAACb,aAAa;QAACgE,KAAK,EAAE1C,KAAM;QAAA2C,QAAA,EAAExC;MAAQ,CAAgB;IAAC,CAC9B,CAAC;EAEhC;EAEA,oBACEZ,IAAA,CAACP,gBAAgB,CAACyD,QAAQ;IAACC,KAAK,EAAE7C,SAAU;IAAA8C,QAAA,eAC1CpD,IAAA,CAACR,cAAc,CAAC0D,QAAQ;MAACC,KAAK,EAAE/B,aAAc;MAAAgC,QAAA,eAC5CpD,IAAA,CAACjB,uBAAuB;QAAA,GAClBgC,IAAI;QACRN,KAAK,EAAEA,KAAM;QACbsB,YAAY,EACVhB,IAAI,CAACgB,YAAY,IACjBD,oBAAoB,IACpBM,yBACD;QACDtB,aAAa,EAAG6B,KAAK,IAAK;UACxB7B,aAAa,GAAG6B,KAAK,CAAC;UACtBhC,SAAS,EAAE0C,OAAO,CAACV,KAAK,CAAC;QAC3B,CAAE;QACF3B,GAAG,EAAEE;MAAa,CACnB;IAAC,CACqB;EAAC,CACD,CAAC;AAEhC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMoC,mBAAmB,gBAAGjE,KAAK,CAACkE,UAAU,CACjDlD,wBACF,CAIuB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createNavigatorFactory","StackRouter","useNavigationBuilder","jsx","_jsx","StackNavigator","props","state","descriptors","NavigationContent","children","routes","index","key","render","createStackNavigator"],"sourceRoot":"../../../src","sources":["__stubs__/createStackNavigator.tsx"],"mappings":";;AAAA,SACEA,sBAAsB,EAKtBC,WAAW,EAEXC,oBAAoB,QACf,wBAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEhC,MAAMC,cAAc,GAClBC,
|
|
1
|
+
{"version":3,"names":["createNavigatorFactory","StackRouter","useNavigationBuilder","jsx","_jsx","StackNavigator","props","state","descriptors","NavigationContent","children","routes","index","key","render","createStackNavigator"],"sourceRoot":"../../../src","sources":["__stubs__/createStackNavigator.tsx"],"mappings":";;AAAA,SACEA,sBAAsB,EAKtBC,WAAW,EAEXC,oBAAoB,QACf,wBAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEhC,MAAMC,cAAc,GAClBC,KAMC,IACE;EACH,MAAM;IAAEC,KAAK;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGP,oBAAoB,CACpED,WAAW,EACXK,KACF,CAAC;EAED,oBACEF,IAAA,CAACK,iBAAiB;IAAAC,QAAA,EACfF,WAAW,CAACD,KAAK,CAACI,MAAM,CAACJ,KAAK,CAACK,KAAK,CAAC,CAACC,GAAG,CAAC,CAACC,MAAM,CAAC;EAAC,CACnC,CAAC;AAExB,CAAC;AAED,OAAO,SAASC,oBAAoBA,CAAA,EASjC;EACD,OAAOf,sBAAsB,CAACK,cAAc,CAAC,CAAC,CAAC;AACjD","ignoreList":[]}
|
|
@@ -3,15 +3,20 @@
|
|
|
3
3
|
import escapeStringRegexp from 'escape-string-regexp';
|
|
4
4
|
export function extractPathFromURL(prefixes, url) {
|
|
5
5
|
for (const prefix of prefixes) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
let prefixRegex;
|
|
7
|
+
if (prefix === '*') {
|
|
8
|
+
prefixRegex = /^(((https?:\/\/)[^/]+)|([^/]+:(\/\/)?))/;
|
|
9
|
+
} else {
|
|
10
|
+
const protocol = prefix.match(/^[^:]+:/)?.[0] ?? '';
|
|
11
|
+
const host = prefix.replace(new RegExp(`^${escapeStringRegexp(protocol)}`), '').replace(/\/+/g, '/') // Replace multiple slash (//) with single ones
|
|
12
|
+
.replace(/^\//, ''); // Remove extra leading slash
|
|
9
13
|
|
|
10
|
-
|
|
14
|
+
prefixRegex = new RegExp(`^${escapeStringRegexp(protocol)}(/)*${host.split('.').map(it => it === '*' ? '[^/]+' : escapeStringRegexp(it)).join('\\.')}`);
|
|
15
|
+
}
|
|
11
16
|
const [originAndPath, ...searchParams] = url.split('?');
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return
|
|
17
|
+
if (prefixRegex.test(originAndPath)) {
|
|
18
|
+
const result = originAndPath.replace(prefixRegex, '').replace(/\/+/g, '/').concat(searchParams.length ? `?${searchParams.join('?')}` : '');
|
|
19
|
+
return result.startsWith('/') ? result : `/${result}`;
|
|
15
20
|
}
|
|
16
21
|
}
|
|
17
22
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["escapeStringRegexp","extractPathFromURL","prefixes","url","prefix","protocol","match","host","replace","RegExp","
|
|
1
|
+
{"version":3,"names":["escapeStringRegexp","extractPathFromURL","prefixes","url","prefix","prefixRegex","protocol","match","host","replace","RegExp","split","map","it","join","originAndPath","searchParams","test","result","concat","length","startsWith","undefined"],"sourceRoot":"../../src","sources":["extractPathFromURL.tsx"],"mappings":";;AAAA,OAAOA,kBAAkB,MAAM,sBAAsB;AAIrD,OAAO,SAASC,kBAAkBA,CAACC,QAAyB,EAAEC,GAAW,EAAE;EACzE,KAAK,MAAMC,MAAM,IAAIF,QAAQ,EAAE;IAC7B,IAAIG,WAAW;IAEf,IAAID,MAAM,KAAK,GAAG,EAAE;MAClBC,WAAW,GAAG,yCAAyC;IACzD,CAAC,MAAM;MACL,MAAMC,QAAQ,GAAGF,MAAM,CAACG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;MACnD,MAAMC,IAAI,GAAGJ,MAAM,CAChBK,OAAO,CAAC,IAAIC,MAAM,CAAC,IAAIV,kBAAkB,CAACM,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC3DG,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;MAAA,CACrBA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;;MAEvBJ,WAAW,GAAG,IAAIK,MAAM,CACtB,IAAIV,kBAAkB,CAACM,QAAQ,CAAC,OAAOE,IAAI,CACxCG,KAAK,CAAC,GAAG,CAAC,CACVC,GAAG,CAAEC,EAAE,IAAMA,EAAE,KAAK,GAAG,GAAG,OAAO,GAAGb,kBAAkB,CAACa,EAAE,CAAE,CAAC,CAC5DC,IAAI,CAAC,KAAK,CAAC,EAChB,CAAC;IACH;IAEA,MAAM,CAACC,aAAa,EAAE,GAAGC,YAAY,CAAC,GAAGb,GAAG,CAACQ,KAAK,CAAC,GAAG,CAAC;IAEvD,IAAIN,WAAW,CAACY,IAAI,CAACF,aAAa,CAAC,EAAE;MACnC,MAAMG,MAAM,GAAGH,aAAa,CACzBN,OAAO,CAACJ,WAAW,EAAE,EAAE,CAAC,CACxBI,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CACpBU,MAAM,CAACH,YAAY,CAACI,MAAM,GAAG,IAAIJ,YAAY,CAACF,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;MAElE,OAAOI,MAAM,CAACG,UAAU,CAAC,GAAG,CAAC,GAAGH,MAAM,GAAG,IAAIA,MAAM,EAAE;IACvD;EACF;EAEA,OAAOI,SAAS;AAClB","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { getStateFromPath } from '@react-navigation/core';
|
|
4
|
+
import { extractPathFromURL } from "./extractPathFromURL.js";
|
|
5
|
+
export function getStateFromHref(href, options) {
|
|
6
|
+
const {
|
|
7
|
+
prefixes,
|
|
8
|
+
filter,
|
|
9
|
+
config,
|
|
10
|
+
getStateFromPath: getStateFromPathHelper = getStateFromPath
|
|
11
|
+
} = options || {};
|
|
12
|
+
let path;
|
|
13
|
+
if (href.startsWith('/')) {
|
|
14
|
+
path = href;
|
|
15
|
+
} else if (href) {
|
|
16
|
+
if (filter && !filter(href)) {
|
|
17
|
+
throw new Error(`Failed to parse href '${href}'. It doesn't match the filter specified in linking config.`);
|
|
18
|
+
}
|
|
19
|
+
if (prefixes == null || prefixes.length === 0) {
|
|
20
|
+
throw new Error(`Failed to parse href '${href}'. It doesn't start with '/' and no prefixes are defined in linking config.`);
|
|
21
|
+
}
|
|
22
|
+
path = extractPathFromURL(prefixes, href);
|
|
23
|
+
}
|
|
24
|
+
if (path == null) {
|
|
25
|
+
throw new Error(`Got invalid href '${href}'. It must start with '/' or match one of the prefixes: ${options?.prefixes?.map(prefix => `'${prefix}'`).join(', ')}.`);
|
|
26
|
+
}
|
|
27
|
+
const state = getStateFromPathHelper(path, config);
|
|
28
|
+
return state;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=getStateFromHref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getStateFromPath","extractPathFromURL","getStateFromHref","href","options","prefixes","filter","config","getStateFromPathHelper","path","startsWith","Error","length","map","prefix","join","state"],"sourceRoot":"../../src","sources":["getStateFromHref.tsx"],"mappings":";;AAAA,SAASA,gBAAgB,QAA4B,wBAAwB;AAE7E,SAASC,kBAAkB,QAAQ,yBAAsB;AAGzD,OAAO,SAASC,gBAAgBA,CAC9BC,IAAY,EACZC,OAAkD,EACb;EACrC,MAAM;IACJC,QAAQ;IACRC,MAAM;IACNC,MAAM;IACNP,gBAAgB,EAAEQ,sBAAsB,GAAGR;EAC7C,CAAC,GAAGI,OAAO,IAAI,CAAC,CAAC;EAEjB,IAAIK,IAAI;EAER,IAAIN,IAAI,CAACO,UAAU,CAAC,GAAG,CAAC,EAAE;IACxBD,IAAI,GAAGN,IAAI;EACb,CAAC,MAAM,IAAIA,IAAI,EAAE;IACf,IAAIG,MAAM,IAAI,CAACA,MAAM,CAACH,IAAI,CAAC,EAAE;MAC3B,MAAM,IAAIQ,KAAK,CACb,yBAAyBR,IAAI,6DAC/B,CAAC;IACH;IAEA,IAAIE,QAAQ,IAAI,IAAI,IAAIA,QAAQ,CAACO,MAAM,KAAK,CAAC,EAAE;MAC7C,MAAM,IAAID,KAAK,CACb,yBAAyBR,IAAI,6EAC/B,CAAC;IACH;IAEAM,IAAI,GAAGR,kBAAkB,CAACI,QAAQ,EAAEF,IAAI,CAAC;EAC3C;EAEA,IAAIM,IAAI,IAAI,IAAI,EAAE;IAChB,MAAM,IAAIE,KAAK,CACb,qBAAqBR,IAAI,2DAA2DC,OAAO,EAAEC,QAAQ,EAAEQ,GAAG,CAAEC,MAAM,IAAK,IAAIA,MAAM,GAAG,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC,GAClJ,CAAC;EACH;EAEA,MAAMC,KAAK,GAAGR,sBAAsB,CAACC,IAAI,EAAEF,MAAM,CAAC;EAElD,OAAOS,KAAK;AACd","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -9,7 +9,6 @@ export { ServerContainer } from "./ServerContainer.js";
|
|
|
9
9
|
export { DarkTheme } from "./theming/DarkTheme.js";
|
|
10
10
|
export { DefaultTheme } from "./theming/DefaultTheme.js";
|
|
11
11
|
export * from "./types.js";
|
|
12
|
-
export { UnhandledLinkingContext as UNSTABLE_UnhandledLinkingContext } from "./UnhandledLinkingContext.js";
|
|
13
12
|
export { useLinkBuilder } from "./useLinkBuilder.js";
|
|
14
13
|
export { useLinkProps } from "./useLinkProps.js";
|
|
15
14
|
export { useLinkTo } from "./useLinkTo.js";
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createStaticNavigation","Link","LinkingContext","LocaleDirContext","NavigationContainer","ServerContainer","DarkTheme","DefaultTheme","
|
|
1
|
+
{"version":3,"names":["createStaticNavigation","Link","LinkingContext","LocaleDirContext","NavigationContainer","ServerContainer","DarkTheme","DefaultTheme","useLinkBuilder","useLinkProps","useLinkTo","useLocale","useRoutePath","useScrollToTop"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,sBAAsB,QAAQ,6BAA0B;AACjE,SAASC,IAAI,QAAQ,WAAQ;AAC7B,SAASC,cAAc,QAAQ,qBAAkB;AACjD,SAASC,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,mBAAmB,QAAQ,0BAAuB;AAC3D,SAASC,eAAe,QAAQ,sBAAmB;AACnD,SAASC,SAAS,QAAQ,wBAAqB;AAC/C,SAASC,YAAY,QAAQ,2BAAwB;AACrD,cAAc,YAAS;AACvB,SAASC,cAAc,QAAQ,qBAAkB;AACjD,SAAyBC,YAAY,QAAQ,mBAAgB;AAC7D,SAASC,SAAS,QAAQ,gBAAa;AACvC,SAASC,SAAS,QAAQ,gBAAa;AACvC,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SAASC,cAAc,QAAQ,qBAAkB;AACjD,cAAc,wBAAwB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["fonts","DarkTheme","dark","colors","primary","background","card","text","border","notification"],"sourceRoot":"../../../src","sources":["theming/DarkTheme.tsx"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["fonts","DarkTheme","dark","colors","primary","background","card","text","border","notification"],"sourceRoot":"../../../src","sources":["theming/DarkTheme.tsx"],"mappings":";;AAEA,SAASA,KAAK,QAAQ,YAAS;AAE/B,OAAO,MAAMC,SAAS,GAAG;EACvBC,IAAI,EAAE,IAAI;EACVC,MAAM,EAAE;IACNC,OAAO,EAAE,mBAAmB;IAC5BC,UAAU,EAAE,cAAc;IAC1BC,IAAI,EAAE,iBAAiB;IACvBC,IAAI,EAAE,oBAAoB;IAC1BC,MAAM,EAAE,iBAAiB;IACzBC,YAAY,EAAE;EAChB,CAAC;EACDT;AACF,CAA0B","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["fonts","DefaultTheme","dark","colors","primary","background","card","text","border","notification"],"sourceRoot":"../../../src","sources":["theming/DefaultTheme.tsx"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["fonts","DefaultTheme","dark","colors","primary","background","card","text","border","notification"],"sourceRoot":"../../../src","sources":["theming/DefaultTheme.tsx"],"mappings":";;AAEA,SAASA,KAAK,QAAQ,YAAS;AAE/B,OAAO,MAAMC,YAAY,GAAG;EAC1BC,IAAI,EAAE,KAAK;EACXC,MAAM,EAAE;IACNC,OAAO,EAAE,kBAAkB;IAC3BC,UAAU,EAAE,oBAAoB;IAChCC,IAAI,EAAE,oBAAoB;IAC1BC,IAAI,EAAE,iBAAiB;IACvBC,MAAM,EAAE,oBAAoB;IAC5BC,YAAY,EAAE;EAChB,CAAC;EACDT;AACF,CAA0B","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","WEB_FONT_STACK","fonts","select","web","regular","fontFamily","fontWeight","medium","bold","heavy","ios","default"],"sourceRoot":"../../../src","sources":["theming/fonts.tsx"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["Platform","WEB_FONT_STACK","fonts","select","web","regular","fontFamily","fontWeight","medium","bold","heavy","ios","default"],"sourceRoot":"../../../src","sources":["theming/fonts.tsx"],"mappings":";;AACA,SAASA,QAAQ,QAAQ,cAAc;AAEvC,MAAMC,cAAc,GAClB,uHAAuH;AAEzH,OAAO,MAAMC,KAAK,GAAGF,QAAQ,CAACG,MAAM,CAAC;EACnCC,GAAG,EAAE;IACHC,OAAO,EAAE;MACPC,UAAU,EAAEL,cAAc;MAC1BM,UAAU,EAAE;IACd,CAAC;IACDC,MAAM,EAAE;MACNF,UAAU,EAAEL,cAAc;MAC1BM,UAAU,EAAE;IACd,CAAC;IACDE,IAAI,EAAE;MACJH,UAAU,EAAEL,cAAc;MAC1BM,UAAU,EAAE;IACd,CAAC;IACDG,KAAK,EAAE;MACLJ,UAAU,EAAEL,cAAc;MAC1BM,UAAU,EAAE;IACd;EACF,CAAC;EACDI,GAAG,EAAE;IACHN,OAAO,EAAE;MACPC,UAAU,EAAE,QAAQ;MACpBC,UAAU,EAAE;IACd,CAAC;IACDC,MAAM,EAAE;MACNF,UAAU,EAAE,QAAQ;MACpBC,UAAU,EAAE;IACd,CAAC;IACDE,IAAI,EAAE;MACJH,UAAU,EAAE,QAAQ;MACpBC,UAAU,EAAE;IACd,CAAC;IACDG,KAAK,EAAE;MACLJ,UAAU,EAAE,QAAQ;MACpBC,UAAU,EAAE;IACd;EACF,CAAC;EACDK,OAAO,EAAE;IACPP,OAAO,EAAE;MACPC,UAAU,EAAE,YAAY;MACxBC,UAAU,EAAE;IACd,CAAC;IACDC,MAAM,EAAE;MACNF,UAAU,EAAE,mBAAmB;MAC/BC,UAAU,EAAE;IACd,CAAC;IACDE,IAAI,EAAE;MACJH,UAAU,EAAE,YAAY;MACxBC,UAAU,EAAE;IACd,CAAC;IACDG,KAAK,EAAE;MACLJ,UAAU,EAAE,YAAY;MACxBC,UAAU,EAAE;IACd;EACF;AACF,CAAmD,CAAC","ignoreList":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { CommonActions, findFocusedRoute, getActionFromState, getPathFromState,
|
|
3
|
+
import { CommonActions, findFocusedRoute, getActionFromState, getPathFromState, NavigationHelpersContext, NavigationRouteContext, useStateForPath } from '@react-navigation/core';
|
|
4
4
|
import * as React from 'react';
|
|
5
|
+
import { getStateFromHref } from "./getStateFromHref.js";
|
|
5
6
|
import { LinkingContext } from "./LinkingContext.js";
|
|
6
7
|
/**
|
|
7
8
|
* Helpers to build href or action based on the linking options.
|
|
@@ -16,7 +17,6 @@ export function useLinkBuilder() {
|
|
|
16
17
|
} = React.useContext(LinkingContext);
|
|
17
18
|
const focusedRouteState = useStateForPath();
|
|
18
19
|
const getPathFromStateHelper = options?.getPathFromState ?? getPathFromState;
|
|
19
|
-
const getStateFromPathHelper = options?.getStateFromPath ?? getStateFromPath;
|
|
20
20
|
const getActionFromStateHelper = options?.getActionFromState ?? getActionFromState;
|
|
21
21
|
const buildHref = React.useCallback((name, params) => {
|
|
22
22
|
if (options?.enabled === false) {
|
|
@@ -66,17 +66,14 @@ export function useLinkBuilder() {
|
|
|
66
66
|
return path;
|
|
67
67
|
}, [options?.enabled, options?.config, route?.key, navigation, focusedRouteState, getPathFromStateHelper]);
|
|
68
68
|
const buildAction = React.useCallback(href => {
|
|
69
|
-
|
|
70
|
-
throw new Error(`The href must start with '/' (${href}).`);
|
|
71
|
-
}
|
|
72
|
-
const state = getStateFromPathHelper(href, options?.config);
|
|
69
|
+
const state = getStateFromHref(href, options);
|
|
73
70
|
if (state) {
|
|
74
71
|
const action = getActionFromStateHelper(state, options?.config);
|
|
75
72
|
return action ?? CommonActions.reset(state);
|
|
76
73
|
} else {
|
|
77
|
-
throw new Error(
|
|
74
|
+
throw new Error(`Failed to parse href '${href}' to a navigation state.`);
|
|
78
75
|
}
|
|
79
|
-
}, [options
|
|
76
|
+
}, [options, getActionFromStateHelper]);
|
|
80
77
|
return {
|
|
81
78
|
buildHref,
|
|
82
79
|
buildAction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CommonActions","findFocusedRoute","getActionFromState","getPathFromState","
|
|
1
|
+
{"version":3,"names":["CommonActions","findFocusedRoute","getActionFromState","getPathFromState","NavigationHelpersContext","NavigationRouteContext","useStateForPath","React","getStateFromHref","LinkingContext","useLinkBuilder","navigation","useContext","route","options","focusedRouteState","getPathFromStateHelper","getActionFromStateHelper","buildHref","useCallback","name","params","enabled","undefined","isScreen","key","getState","routes","some","r","stateForRoute","constructState","state","path","config","buildAction","href","action","reset","Error"],"sourceRoot":"../../src","sources":["useLinkBuilder.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -75,6 +75,26 @@ export function useLinkProps({
|
|
|
75
75
|
}
|
|
76
76
|
};
|
|
77
77
|
const getPathFromStateHelper = options?.getPathFromState ?? getPathFromState;
|
|
78
|
+
if (Platform.OS === 'web') {
|
|
79
|
+
if (screen == null && action != null && options?.config != null) {
|
|
80
|
+
switch (action.type) {
|
|
81
|
+
case 'NAVIGATE':
|
|
82
|
+
case 'PUSH':
|
|
83
|
+
case 'REPLACE':
|
|
84
|
+
case 'POP_TO':
|
|
85
|
+
case 'JUMP_TO':
|
|
86
|
+
{
|
|
87
|
+
if (action.payload != null && 'name' in action.payload && typeof action.payload.name === 'string' && action.payload.name in options.config.screens) {
|
|
88
|
+
screen = action.payload.name;
|
|
89
|
+
if ('params' in action.payload && typeof action.payload.params === 'object' && action.payload.params != null) {
|
|
90
|
+
// @ts-expect-error this is fine 🔥
|
|
91
|
+
params = action.payload.params;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
78
98
|
return {
|
|
79
99
|
href: href ?? (Platform.OS === 'web' && screen != null ? getPathFromStateHelper({
|
|
80
100
|
routes: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getPathFromState","NavigationContainerRefContext","NavigationHelpersContext","React","Platform","LinkingContext","getStateFromParams","params","state","screen","routes","name","undefined","useLinkProps","href","action","root","useContext","navigation","options","onPress","e","shouldHandle","OS","preventDefault","hasModifierKey","metaKey","altKey","ctrlKey","shiftKey","isLeftClick","button","isSelfTarget","currentTarget","includes","target","dispatch","Error","navigate","getPathFromStateHelper","config","role"],"sourceRoot":"../../src","sources":["useLinkProps.tsx"],"mappings":";;AAAA,SACEA,gBAAgB,EAEhBC,6BAA6B,EAC7BC,wBAAwB,
|
|
1
|
+
{"version":3,"names":["getPathFromState","NavigationContainerRefContext","NavigationHelpersContext","React","Platform","LinkingContext","getStateFromParams","params","state","screen","routes","name","undefined","useLinkProps","href","action","root","useContext","navigation","options","onPress","e","shouldHandle","OS","preventDefault","hasModifierKey","metaKey","altKey","ctrlKey","shiftKey","isLeftClick","button","isSelfTarget","currentTarget","includes","target","dispatch","Error","navigate","getPathFromStateHelper","config","type","payload","screens","role"],"sourceRoot":"../../src","sources":["useLinkProps.tsx"],"mappings":"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","ignoreList":[]}
|
package/lib/module/useLinking.js
CHANGED
|
@@ -5,6 +5,17 @@ import isEqual from 'fast-deep-equal';
|
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
import { createMemoryHistory } from "./createMemoryHistory.js";
|
|
7
7
|
import { ServerContext } from "./ServerContext.js";
|
|
8
|
+
/**
|
|
9
|
+
* Calculate total history length including both navigator history and route history
|
|
10
|
+
*/
|
|
11
|
+
const getTotalHistoryLength = state => {
|
|
12
|
+
const baseHistoryLength = state.history ? state.history.length : state.routes.length;
|
|
13
|
+
const routeHistoryLength = state.routes.reduce((acc, r) => {
|
|
14
|
+
return acc + (r.history ? r.history.length : 0);
|
|
15
|
+
}, 0);
|
|
16
|
+
return baseHistoryLength + routeHistoryLength;
|
|
17
|
+
};
|
|
18
|
+
|
|
8
19
|
/**
|
|
9
20
|
* Find the matching navigation state that changed between 2 navigation states
|
|
10
21
|
* e.g.: a -> b -> c -> d and a -> b -> c -> e -> f, if history in b changed, b is the matching state
|
|
@@ -13,21 +24,20 @@ const findMatchingState = (a, b) => {
|
|
|
13
24
|
if (a === undefined || b === undefined || a.key !== b.key) {
|
|
14
25
|
return [undefined, undefined];
|
|
15
26
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const aHistoryLength = a.history ? a.history.length : a.routes.length;
|
|
19
|
-
const bHistoryLength = b.history ? b.history.length : b.routes.length;
|
|
27
|
+
const aHistoryLength = getTotalHistoryLength(a);
|
|
28
|
+
const bHistoryLength = getTotalHistoryLength(b);
|
|
20
29
|
const aRoute = a.routes[a.index];
|
|
21
30
|
const bRoute = b.routes[b.index];
|
|
22
31
|
const aChildState = aRoute.state;
|
|
23
32
|
const bChildState = bRoute.state;
|
|
24
33
|
|
|
25
34
|
// Stop here if this is the state object that changed:
|
|
26
|
-
// - history length is different
|
|
35
|
+
// - total history length is different (including route.history)
|
|
27
36
|
// - focused routes are different
|
|
37
|
+
// - route.history length is different
|
|
28
38
|
// - one of them doesn't have child state
|
|
29
39
|
// - child state keys are different
|
|
30
|
-
if (aHistoryLength !== bHistoryLength || aRoute.key !== bRoute.key || aChildState === undefined || bChildState === undefined || aChildState.key !== bChildState.key) {
|
|
40
|
+
if (aHistoryLength !== bHistoryLength || aRoute.key !== bRoute.key || (aRoute.history?.length || 0) !== (bRoute.history?.length || 0) || aChildState === undefined || bChildState === undefined || aChildState.key !== bChildState.key) {
|
|
31
41
|
return [a, b];
|
|
32
42
|
}
|
|
33
43
|
return findMatchingState(aChildState, bChildState);
|
|
@@ -44,14 +54,14 @@ export const series = cb => {
|
|
|
44
54
|
};
|
|
45
55
|
return callback;
|
|
46
56
|
};
|
|
47
|
-
const linkingHandlers =
|
|
57
|
+
const linkingHandlers = new Set();
|
|
48
58
|
export function useLinking(ref, {
|
|
49
59
|
enabled = true,
|
|
50
60
|
config,
|
|
51
61
|
getStateFromPath = getStateFromPathDefault,
|
|
52
62
|
getPathFromState = getPathFromStateDefault,
|
|
53
63
|
getActionFromState = getActionFromStateDefault
|
|
54
|
-
}
|
|
64
|
+
}) {
|
|
55
65
|
const independent = useNavigationIndependentTree();
|
|
56
66
|
React.useEffect(() => {
|
|
57
67
|
if (process.env.NODE_ENV === 'production') {
|
|
@@ -60,18 +70,15 @@ export function useLinking(ref, {
|
|
|
60
70
|
if (independent) {
|
|
61
71
|
return undefined;
|
|
62
72
|
}
|
|
63
|
-
if (enabled !== false && linkingHandlers.
|
|
73
|
+
if (enabled !== false && linkingHandlers.size) {
|
|
64
74
|
console.error(['Looks like you have configured linking in multiple places. This is likely an error since deep links should only be handled in one place to avoid conflicts. Make sure that:', "- You don't have multiple NavigationContainers in the app each with 'linking' enabled", '- Only a single instance of the root component is rendered'].join('\n').trim());
|
|
65
75
|
}
|
|
66
76
|
const handler = Symbol();
|
|
67
77
|
if (enabled !== false) {
|
|
68
|
-
linkingHandlers.
|
|
78
|
+
linkingHandlers.add(handler);
|
|
69
79
|
}
|
|
70
80
|
return () => {
|
|
71
|
-
|
|
72
|
-
if (index > -1) {
|
|
73
|
-
linkingHandlers.splice(index, 1);
|
|
74
|
-
}
|
|
81
|
+
linkingHandlers.delete(handler);
|
|
75
82
|
};
|
|
76
83
|
}, [enabled, independent]);
|
|
77
84
|
const [history] = React.useState(createMemoryHistory);
|
|
@@ -107,16 +114,10 @@ export function useLinking(ref, {
|
|
|
107
114
|
if (path) {
|
|
108
115
|
value = getStateFromPathRef.current(path, configRef.current);
|
|
109
116
|
}
|
|
110
|
-
|
|
111
|
-
// If the link were handled, it gets cleared in NavigationContainer
|
|
112
|
-
onUnhandledLinking(path);
|
|
113
117
|
}
|
|
114
118
|
const thenable = {
|
|
115
119
|
then(onfulfilled) {
|
|
116
120
|
return Promise.resolve(onfulfilled ? onfulfilled(value) : value);
|
|
117
|
-
},
|
|
118
|
-
catch() {
|
|
119
|
-
return thenable;
|
|
120
121
|
}
|
|
121
122
|
};
|
|
122
123
|
return thenable;
|
|
@@ -154,8 +155,6 @@ export function useLinking(ref, {
|
|
|
154
155
|
// We should only dispatch an action when going forward
|
|
155
156
|
// Otherwise the action will likely add items to history, which would mess things up
|
|
156
157
|
if (state) {
|
|
157
|
-
// If the link were handled, it gets cleared in NavigationContainer
|
|
158
|
-
onUnhandledLinking(path);
|
|
159
158
|
// Make sure that the routes in the state exist in the root navigator
|
|
160
159
|
// Otherwise there's an error in the linking configuration
|
|
161
160
|
if (validateRoutesNotExistInRootState(state)) {
|
|
@@ -182,7 +181,7 @@ export function useLinking(ref, {
|
|
|
182
181
|
navigation.resetRoot(state);
|
|
183
182
|
}
|
|
184
183
|
});
|
|
185
|
-
}, [enabled, history,
|
|
184
|
+
}, [enabled, history, ref, validateRoutesNotExistInRootState]);
|
|
186
185
|
React.useEffect(() => {
|
|
187
186
|
if (!enabled) {
|
|
188
187
|
return;
|
|
@@ -255,7 +254,7 @@ export function useLinking(ref, {
|
|
|
255
254
|
// We should only handle push/pop if path changed from what was in last `popstate`
|
|
256
255
|
// Otherwise it's likely a change triggered by `popstate`
|
|
257
256
|
path !== pendingPath) {
|
|
258
|
-
const historyDelta = (focusedState
|
|
257
|
+
const historyDelta = getTotalHistoryLength(focusedState) - getTotalHistoryLength(previousFocusedState);
|
|
259
258
|
if (historyDelta > 0) {
|
|
260
259
|
// If history length is increased, we should pushState
|
|
261
260
|
// Note that path might not actually change here, for example, drawer open should pushState
|