@react-navigation/native-stack 7.9.0 → 7.10.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/navigators/createNativeStackNavigator.js +25 -17
- package/lib/module/navigators/createNativeStackNavigator.js.map +1 -1
- package/lib/typescript/src/navigators/createNativeStackNavigator.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/navigators/createNativeStackNavigator.tsx +31 -24
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { createNavigatorFactory, StackActions, StackRouter, useNavigationBuilder } from '@react-navigation/native';
|
|
3
|
+
import { createNavigatorFactory, NavigationMetaContext, StackActions, StackRouter, useNavigationBuilder } from '@react-navigation/native';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { NativeStackView } from '../views/NativeStackView';
|
|
6
6
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
@@ -33,24 +33,32 @@ function NativeStackNavigator({
|
|
|
33
33
|
screenLayout,
|
|
34
34
|
UNSTABLE_router
|
|
35
35
|
});
|
|
36
|
-
React.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
const meta = React.useContext(NavigationMetaContext);
|
|
37
|
+
React.useEffect(() => {
|
|
38
|
+
if (meta && 'type' in meta && meta.type === 'native-tabs') {
|
|
39
|
+
// If we're inside native tabs, we don't need to handle popToTop
|
|
40
|
+
// It's handled natively by native tabs
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
40
43
|
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
// @ts-expect-error: there may not be a tab navigator in parent
|
|
45
|
+
return navigation?.addListener?.('tabPress', e => {
|
|
46
|
+
const isFocused = navigation.isFocused();
|
|
47
|
+
|
|
48
|
+
// Run the operation in the next frame so we're sure all listeners have been run
|
|
49
|
+
// This is necessary to know if preventDefault() has been called
|
|
50
|
+
requestAnimationFrame(() => {
|
|
51
|
+
if (state.index > 0 && isFocused && !e.defaultPrevented) {
|
|
52
|
+
// When user taps on already focused tab and we're inside the tab,
|
|
53
|
+
// reset the stack to replicate native behaviour
|
|
54
|
+
navigation.dispatch({
|
|
55
|
+
...StackActions.popToTop(),
|
|
56
|
+
target: state.key
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
});
|
|
52
60
|
});
|
|
53
|
-
}
|
|
61
|
+
}, [meta, navigation, state.index, state.key]);
|
|
54
62
|
return /*#__PURE__*/_jsx(NavigationContent, {
|
|
55
63
|
children: /*#__PURE__*/_jsx(NativeStackView, {
|
|
56
64
|
...rest,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createNavigatorFactory","StackActions","StackRouter","useNavigationBuilder","React","NativeStackView","jsx","_jsx","NativeStackNavigator","id","initialRouteName","UNSTABLE_routeNamesChangeBehavior","children","layout","screenListeners","screenOptions","screenLayout","UNSTABLE_router","rest","state","describe","descriptors","navigation","NavigationContent","useEffect","addListener","e","isFocused","requestAnimationFrame","index","defaultPrevented","dispatch","popToTop","target","key","createNativeStackNavigator","config"],"sourceRoot":"../../../src","sources":["navigators/createNativeStackNavigator.tsx"],"mappings":";;AAAA,SACEA,sBAAsB,
|
|
1
|
+
{"version":3,"names":["createNavigatorFactory","NavigationMetaContext","StackActions","StackRouter","useNavigationBuilder","React","NativeStackView","jsx","_jsx","NativeStackNavigator","id","initialRouteName","UNSTABLE_routeNamesChangeBehavior","children","layout","screenListeners","screenOptions","screenLayout","UNSTABLE_router","rest","state","describe","descriptors","navigation","NavigationContent","meta","useContext","useEffect","type","addListener","e","isFocused","requestAnimationFrame","index","defaultPrevented","dispatch","popToTop","target","key","createNativeStackNavigator","config"],"sourceRoot":"../../../src","sources":["navigators/createNativeStackNavigator.tsx"],"mappings":";;AAAA,SACEA,sBAAsB,EAEtBC,qBAAqB,EAIrBC,YAAY,EAEZC,WAAW,EAIXC,oBAAoB,QACf,0BAA0B;AACjC,OAAO,KAAKC,KAAK,MAAM,OAAO;AAQ9B,SAASC,eAAe,QAAQ,0BAA0B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE3D,SAASC,oBAAoBA,CAAC;EAC5BC,EAAE;EACFC,gBAAgB;EAChBC,iCAAiC;EACjCC,QAAQ;EACRC,MAAM;EACNC,eAAe;EACfC,aAAa;EACbC,YAAY;EACZC,eAAe;EACf,GAAGC;AACsB,CAAC,EAAE;EAC5B,MAAM;IAAEC,KAAK;IAAEC,QAAQ;IAAEC,WAAW;IAAEC,UAAU;IAAEC;EAAkB,CAAC,GACnEpB,oBAAoB,CAMlBD,WAAW,EAAE;IACbO,EAAE;IACFC,gBAAgB;IAChBC,iCAAiC;IACjCC,QAAQ;IACRC,MAAM;IACNC,eAAe;IACfC,aAAa;IACbC,YAAY;IACZC;EACF,CAAC,CAAC;EAEJ,MAAMO,IAAI,GAAGpB,KAAK,CAACqB,UAAU,CAACzB,qBAAqB,CAAC;EAEpDI,KAAK,CAACsB,SAAS,CAAC,MAAM;IACpB,IAAIF,IAAI,IAAI,MAAM,IAAIA,IAAI,IAAIA,IAAI,CAACG,IAAI,KAAK,aAAa,EAAE;MACzD;MACA;MACA;IACF;;IAEA;IACA,OAAOL,UAAU,EAAEM,WAAW,GAAG,UAAU,EAAGC,CAAM,IAAK;MACvD,MAAMC,SAAS,GAAGR,UAAU,CAACQ,SAAS,CAAC,CAAC;;MAExC;MACA;MACAC,qBAAqB,CAAC,MAAM;QAC1B,IACEZ,KAAK,CAACa,KAAK,GAAG,CAAC,IACfF,SAAS,IACT,CAAED,CAAC,CAAgCI,gBAAgB,EACnD;UACA;UACA;UACAX,UAAU,CAACY,QAAQ,CAAC;YAClB,GAAGjC,YAAY,CAACkC,QAAQ,CAAC,CAAC;YAC1BC,MAAM,EAAEjB,KAAK,CAACkB;UAChB,CAAC,CAAC;QACJ;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC,EAAE,CAACb,IAAI,EAAEF,UAAU,EAAEH,KAAK,CAACa,KAAK,EAAEb,KAAK,CAACkB,GAAG,CAAC,CAAC;EAE9C,oBACE9B,IAAA,CAACgB,iBAAiB;IAAAX,QAAA,eAChBL,IAAA,CAACF,eAAe;MAAA,GACVa,IAAI;MACRC,KAAK,EAAEA,KAAM;MACbG,UAAU,EAAEA,UAAW;MACvBD,WAAW,EAAEA,WAAY;MACzBD,QAAQ,EAAEA;IAAS,CACpB;EAAC,CACe,CAAC;AAExB;AAEA,OAAO,SAASkB,0BAA0BA,CAmBxCC,MAAe,EAAmC;EAClD,OAAOxC,sBAAsB,CAACS,oBAAoB,CAAC,CAAC+B,MAAM,CAAC;AAC7D","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createNativeStackNavigator.d.ts","sourceRoot":"","sources":["../../../../src/navigators/createNativeStackNavigator.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"createNativeStackNavigator.d.ts","sourceRoot":"","sources":["../../../../src/navigators/createNativeStackNavigator.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAGlB,KAAK,oBAAoB,EAGzB,KAAK,YAAY,EACjB,KAAK,cAAc,EAEpB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAGlB,iBAAS,oBAAoB,CAAC,EAC5B,EAAE,EACF,gBAAgB,EAChB,iCAAiC,EACjC,QAAQ,EACR,MAAM,EACN,eAAe,EACf,aAAa,EACb,YAAY,EACZ,eAAe,EACf,GAAG,IAAI,EACR,EAAE,yBAAyB,2CA+D3B;AAED,wBAAgB,0BAA0B,CACxC,KAAK,CAAC,SAAS,SAAS,aAAa,EACrC,KAAK,CAAC,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACjE,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG;IAC3C,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACvC,aAAa,EAAE,4BAA4B,CAAC;IAC5C,QAAQ,EAAE,6BAA6B,CAAC;IACxC,cAAc,EAAE;SACb,SAAS,IAAI,MAAM,SAAS,GAAG,yBAAyB,CACvD,SAAS,EACT,SAAS,EACT,WAAW,CACZ;KACF,CAAC;IACF,SAAS,EAAE,OAAO,oBAAoB,CAAC;CACxC,EACD,KAAK,CAAC,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAClE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAElD"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-navigation/native-stack",
|
|
3
3
|
"description": "Native stack navigator using react-native-screens",
|
|
4
|
-
"version": "7.
|
|
4
|
+
"version": "7.10.0",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react-native-component",
|
|
7
7
|
"react-component",
|
|
@@ -46,14 +46,14 @@
|
|
|
46
46
|
"clean": "del lib"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@react-navigation/elements": "^2.9.
|
|
49
|
+
"@react-navigation/elements": "^2.9.5",
|
|
50
50
|
"color": "^4.2.3",
|
|
51
51
|
"sf-symbols-typescript": "^2.1.0",
|
|
52
52
|
"warn-once": "^0.1.1"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@jest/globals": "^30.0.0",
|
|
56
|
-
"@react-navigation/native": "^7.1.
|
|
56
|
+
"@react-navigation/native": "^7.1.28",
|
|
57
57
|
"@testing-library/react-native": "^13.2.1",
|
|
58
58
|
"@types/react": "~19.0.10",
|
|
59
59
|
"del-cli": "^6.0.0",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"typescript": "^5.9.2"
|
|
66
66
|
},
|
|
67
67
|
"peerDependencies": {
|
|
68
|
-
"@react-navigation/native": "^7.1.
|
|
68
|
+
"@react-navigation/native": "^7.1.28",
|
|
69
69
|
"react": ">= 18.2.0",
|
|
70
70
|
"react-native": "*",
|
|
71
71
|
"react-native-safe-area-context": ">= 4.0.0",
|
|
@@ -89,5 +89,5 @@
|
|
|
89
89
|
]
|
|
90
90
|
]
|
|
91
91
|
},
|
|
92
|
-
"gitHead": "
|
|
92
|
+
"gitHead": "e2e5f1e55afe7b135811832487f596c6060def74"
|
|
93
93
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createNavigatorFactory,
|
|
3
3
|
type EventArg,
|
|
4
|
+
NavigationMetaContext,
|
|
4
5
|
type NavigatorTypeBagBase,
|
|
5
6
|
type ParamListBase,
|
|
6
7
|
type StackActionHelpers,
|
|
@@ -53,31 +54,37 @@ function NativeStackNavigator({
|
|
|
53
54
|
UNSTABLE_router,
|
|
54
55
|
});
|
|
55
56
|
|
|
56
|
-
React.
|
|
57
|
-
() =>
|
|
58
|
-
// @ts-expect-error: there may not be a tab navigator in parent
|
|
59
|
-
navigation?.addListener?.('tabPress', (e: any) => {
|
|
60
|
-
const isFocused = navigation.isFocused();
|
|
57
|
+
const meta = React.useContext(NavigationMetaContext);
|
|
61
58
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
59
|
+
React.useEffect(() => {
|
|
60
|
+
if (meta && 'type' in meta && meta.type === 'native-tabs') {
|
|
61
|
+
// If we're inside native tabs, we don't need to handle popToTop
|
|
62
|
+
// It's handled natively by native tabs
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// @ts-expect-error: there may not be a tab navigator in parent
|
|
67
|
+
return navigation?.addListener?.('tabPress', (e: any) => {
|
|
68
|
+
const isFocused = navigation.isFocused();
|
|
69
|
+
|
|
70
|
+
// Run the operation in the next frame so we're sure all listeners have been run
|
|
71
|
+
// This is necessary to know if preventDefault() has been called
|
|
72
|
+
requestAnimationFrame(() => {
|
|
73
|
+
if (
|
|
74
|
+
state.index > 0 &&
|
|
75
|
+
isFocused &&
|
|
76
|
+
!(e as EventArg<'tabPress', true>).defaultPrevented
|
|
77
|
+
) {
|
|
78
|
+
// When user taps on already focused tab and we're inside the tab,
|
|
79
|
+
// reset the stack to replicate native behaviour
|
|
80
|
+
navigation.dispatch({
|
|
81
|
+
...StackActions.popToTop(),
|
|
82
|
+
target: state.key,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}, [meta, navigation, state.index, state.key]);
|
|
81
88
|
|
|
82
89
|
return (
|
|
83
90
|
<NavigationContent>
|