Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ function WorkspaceStackView(props: ViewProps) {
const routes = [baseRoute, ...overlays.map((group) => group[0]!)];
return (
<NativeStackView
presentationEnvelope
{...props}
state={{ ...props.state, routes, index: routes.length - 1, preloadedRoutes: [] }}
descriptors={{
Expand Down
1 change: 1 addition & 0 deletions apps/mobile/src/native/createV5StackNavigator.ios.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ export function V5StackView(props: V5StackViewProps) {
);
return (
<NativeStackView
presentationEnvelope
{...props}
descriptors={descriptors}
state={{ ...props.state, routes, index: routes.length - 1, preloadedRoutes: [] }}
Expand Down
150 changes: 148 additions & 2 deletions patches/@react-navigation%2Fnative-stack@7.17.6.patch
Original file line number Diff line number Diff line change
@@ -1,8 +1,39 @@
diff --git a/lib/module/views/NativeStackView.native.js b/lib/module/views/NativeStackView.native.js
index c342e90bffde9ad5044b6167bdde2e19be219270..5d3e4407aa1bb68b873cf164adf5a9f0b487bb0b 100644
index c342e90bffde9ad5044b6167bdde2e19be219270..4a045490f0650b4a0c821b3e799cf3d18531417f 100644
--- a/lib/module/views/NativeStackView.native.js
+++ b/lib/module/views/NativeStackView.native.js
@@ -370,6 +370,17 @@ export function NativeStackView({
@@ -17,8 +17,12 @@ const ANDROID_DEFAULT_HEADER_HEIGHT = 56;
function isFabric() {
return 'nativeFabricUIManager' in global;
}
+function SceneNavigationProvider({ presentationEnvelope, ...props }) {
+ return presentationEnvelope ? props.children : /*#__PURE__*/_jsx(NavigationProvider, props);
+}
const useNativeDriver = Platform.OS !== 'web';
const SceneView = ({
+ presentationEnvelope,
index,
focused,
shouldFreeze,
@@ -231,7 +235,8 @@ const SceneView = ({
}
}
});
- return /*#__PURE__*/_jsx(NavigationProvider, {
+ return /*#__PURE__*/_jsx(SceneNavigationProvider, {
+ presentationEnvelope,
route: route,
navigation: navigation,
children: /*#__PURE__*/_jsx(ScreenStackItem, {
@@ -353,6 +358,7 @@ const SceneView = ({
});
};
export function NativeStackView({
+ presentationEnvelope,
state,
navigation,
descriptors,
@@ -370,6 +376,17 @@ export function NativeStackView({
return /*#__PURE__*/_jsx(SafeAreaProviderCompat, {
children: /*#__PURE__*/_jsx(ScreenStack, {
style: styles.container,
Expand All @@ -20,6 +51,14 @@ index c342e90bffde9ad5044b6167bdde2e19be219270..5d3e4407aa1bb68b873cf164adf5a9f0
children: state.routes.concat(state.preloadedRoutes).map((route, index) => {
const descriptor = descriptors[route.key] ?? preloadedDescriptors[route.key];
const isFocused = state.index === index;
@@ -386,6 +403,7 @@ export function NativeStackView({
// due to component being unmounted. To avoid this, we don't freeze the previous screen there
const shouldFreeze = isFabric() ? !isPreloaded && !isFocused && !isBelowFocused && !isModalOnIos : !isPreloaded && !isFocused && !isModalOnIos;
return /*#__PURE__*/_jsx(SceneView, {
+ presentationEnvelope,
index: index,
focused: isFocused,
shouldFreeze: shouldFreeze,
diff --git a/lib/module/views/useHeaderConfigProps.js b/lib/module/views/useHeaderConfigProps.js
index 9c21aa48cb580704aa17e59d9cdadcc612a1e4ff..a1b3a38368c5ef2257570f382e87df5d6f55b11e 100644
--- a/lib/module/views/useHeaderConfigProps.js
Expand Down Expand Up @@ -189,3 +228,110 @@ index 3f3fff405048b3c2250afbe99dd7f35cecb9a6d5..bb062b898cfa77f8c02f951dc9d81b51
>
{item.element}
</ScreenStackHeaderRightView>
diff --git a/lib/typescript/src/views/NativeStackView.native.d.ts b/lib/typescript/src/views/NativeStackView.native.d.ts
index c0d37db3b4a2a4e9340c76333821f44a87cd624b..eb3db8f511799b335a17edea31a2acd17627f909 100644
--- a/lib/typescript/src/views/NativeStackView.native.d.ts
+++ b/lib/typescript/src/views/NativeStackView.native.d.ts
@@ -1,11 +1,12 @@
import { type ParamListBase, type RouteProp, type StackNavigationState } from '@react-navigation/native';
import type { NativeStackDescriptor, NativeStackDescriptorMap, NativeStackNavigationHelpers } from '../types.js';
type Props = {
+ presentationEnvelope?: boolean;
state: StackNavigationState<ParamListBase>;
navigation: NativeStackNavigationHelpers;
descriptors: NativeStackDescriptorMap;
describe: (route: RouteProp<ParamListBase>, placeholder: boolean) => NativeStackDescriptor;
};
-export declare function NativeStackView({ state, navigation, descriptors, describe, }: Props): import("react/jsx-runtime").JSX.Element;
+export declare function NativeStackView({ presentationEnvelope, state, navigation, descriptors, describe, }: Props): import("react/jsx-runtime").JSX.Element;
export {};
//# sourceMappingURL=NativeStackView.native.d.ts.map
\ No newline at end of file
diff --git a/src/views/NativeStackView.native.tsx b/src/views/NativeStackView.native.tsx
index 416cd90057cea362371a4308dd9985b086c5ccaa..7188a3daf0af2004303b21f89d3c0c7073517ef8 100644
--- a/src/views/NativeStackView.native.tsx
+++ b/src/views/NativeStackView.native.tsx
@@ -51,7 +51,14 @@ function isFabric() {
return 'nativeFabricUIManager' in global;
}

+// A presentation envelope contains descriptors from its owning navigator.
+// Its synthetic route must not override those descriptors' focus state.
+function SceneNavigationProvider({ presentationEnvelope, ...props }: React.ComponentProps<typeof NavigationProvider> & { presentationEnvelope?: boolean }) {
+ return presentationEnvelope ? props.children : <NavigationProvider {...props} />;
+}
+
type SceneViewProps = {
+ presentationEnvelope?: boolean;
index: number;
focused: boolean;
shouldFreeze: boolean;
@@ -74,6 +81,7 @@ type SceneViewProps = {
const useNativeDriver = Platform.OS !== 'web';

const SceneView = ({
+ presentationEnvelope,
index,
focused,
shouldFreeze,
@@ -356,7 +364,7 @@ const SceneView = ({
);

return (
- <NavigationProvider route={route} navigation={navigation}>
+ <SceneNavigationProvider presentationEnvelope={presentationEnvelope} route={route} navigation={navigation}>
<ScreenStackItem
screenId={route.key}
activityState={isPreloaded ? 0 : 2}
@@ -493,11 +501,12 @@ const SceneView = ({
</HeaderHeightContext.Provider>
</AnimatedHeaderHeightContext.Provider>
</ScreenStackItem>
- </NavigationProvider>
+ </SceneNavigationProvider>
);
};

type Props = {
+ presentationEnvelope?: boolean;
state: StackNavigationState<ParamListBase>;
navigation: NativeStackNavigationHelpers;
descriptors: NativeStackDescriptorMap;
@@ -508,6 +517,7 @@ type Props = {
};

export function NativeStackView({
+ presentationEnvelope,
state,
navigation,
descriptors,
@@ -555,6 +565,7 @@ export function NativeStackView({

return (
<SceneView
+ presentationEnvelope={presentationEnvelope}
key={route.key}
index={index}
focused={isFocused}
diff --git a/lib/typescript/src/views/NativeStackView.d.ts b/lib/typescript/src/views/NativeStackView.d.ts
--- a/lib/typescript/src/views/NativeStackView.d.ts
+++ b/lib/typescript/src/views/NativeStackView.d.ts
@@ -1,6 +1,7 @@
import { type ParamListBase, type RouteProp, type StackNavigationState } from '@react-navigation/native';
import type { NativeStackDescriptor, NativeStackDescriptorMap, NativeStackNavigationHelpers } from '../types.js';
type Props = {
+ presentationEnvelope?: boolean;
state: StackNavigationState<ParamListBase>;
navigation: NativeStackNavigationHelpers;
descriptors: NativeStackDescriptorMap;
diff --git a/src/views/NativeStackView.tsx b/src/views/NativeStackView.tsx
--- a/src/views/NativeStackView.tsx
+++ b/src/views/NativeStackView.tsx
@@ -24,6 +24,7 @@
import { AnimatedHeaderHeightContext } from '../utils/useAnimatedHeaderHeight';

type Props = {
+ presentationEnvelope?: boolean;
state: StackNavigationState<ParamListBase>;
// This is used for the native implementation of the stack.
navigation: NativeStackNavigationHelpers;
6 changes: 3 additions & 3 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading