react-native-screens 3.32.0 → 3.33.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/README.md +17 -13
- package/RNScreens.podspec +10 -52
- package/android/CMakeLists.txt +48 -4
- package/android/build.gradle +9 -81
- package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +25 -16
- package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
- package/android/src/main/cpp/NativeProxy.cpp +51 -0
- package/android/src/main/cpp/NativeProxy.h +35 -0
- package/android/src/main/cpp/OnLoad.cpp +8 -0
- package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +5 -2
- package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
- package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +134 -38
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +17 -7
- package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +60 -37
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +85 -58
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +128 -37
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
- package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +173 -78
- package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +59 -24
- package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +30 -8
- package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +101 -50
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
- package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -5
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
- package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
- package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +214 -0
- package/android/src/main/jni/CMakeLists.txt +5 -4
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +3 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +1 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
- package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
- package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
- package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +1 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +140 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +23 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +20 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +23 -1
- package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
- package/cpp/RNSScreenRemovalListener.cpp +25 -0
- package/cpp/RNSScreenRemovalListener.h +20 -0
- package/ios/RNSConvert.h +1 -0
- package/ios/RNSModalScreen.mm +22 -0
- package/ios/RNSModule.mm +1 -1
- package/ios/RNSScreen.h +2 -1
- package/ios/RNSScreen.mm +27 -19
- package/ios/RNSScreenStack.mm +24 -77
- package/ios/RNSScreenStackAnimator.mm +43 -6
- package/ios/RNSScreenStackHeaderConfig.mm +49 -11
- package/ios/RNSScreenStackHeaderSubview.mm +8 -0
- package/ios/utils/UIView+RNSUtility.h +23 -0
- package/ios/utils/UIView+RNSUtility.mm +55 -0
- package/lib/commonjs/components/ScreenStack.js +8 -1
- package/lib/commonjs/components/ScreenStack.js.map +1 -1
- package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/commonjs/native-stack/views/NativeStackView.js +2 -0
- package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/module/components/ScreenStack.js +8 -1
- package/lib/module/components/ScreenStack.js.map +1 -1
- package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/module/native-stack/views/NativeStackView.js +2 -0
- package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +1 -0
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts +1 -0
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
- package/lib/typescript/native-stack/types.d.ts +10 -0
- package/lib/typescript/native-stack/types.d.ts.map +1 -1
- package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +10 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/native-stack/README.md +110 -99
- package/package.json +6 -3
- package/react-native.config.js +17 -15
- package/src/TransitionProgressContext.tsx +1 -1
- package/src/components/Screen.tsx +4 -4
- package/src/components/ScreenStack.tsx +11 -1
- package/src/components/ScreenStackHeaderConfig.tsx +5 -5
- package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
- package/src/components/SearchBar.tsx +4 -4
- package/src/core.ts +1 -1
- package/src/fabric/ModalScreenNativeComponent.ts +1 -0
- package/src/fabric/ScreenNativeComponent.ts +1 -0
- package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
- package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +1 -1
- package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
- package/src/fabric/SearchBarNativeComponent.ts +1 -1
- package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
- package/src/gesture-handler/constraints.ts +5 -5
- package/src/gesture-handler/fabricUtils.ts +1 -1
- package/src/native-stack/contexts/GHContext.tsx +1 -1
- package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
- package/src/native-stack/types.tsx +14 -4
- package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
- package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
- package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
- package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
- package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
- package/src/native-stack/views/FontProcessor.tsx +1 -1
- package/src/native-stack/views/HeaderConfig.tsx +1 -1
- package/src/native-stack/views/NativeStackView.tsx +11 -9
- package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
- package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
- package/src/reanimated/ReanimatedScreen.tsx +2 -2
- package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
- package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
- package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
- package/src/types.tsx +15 -5
- package/src/useTransitionProgress.tsx +1 -1
- package/windows/README.md +4 -1
package/react-native.config.js
CHANGED
|
@@ -11,20 +11,22 @@ try {
|
|
|
11
11
|
module.exports = {
|
|
12
12
|
dependency: {
|
|
13
13
|
platforms: {
|
|
14
|
-
android: supportsCodegenConfig
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
14
|
+
android: supportsCodegenConfig
|
|
15
|
+
? {
|
|
16
|
+
componentDescriptors: [
|
|
17
|
+
'RNSFullWindowOverlayComponentDescriptor',
|
|
18
|
+
'RNSScreenContainerComponentDescriptor',
|
|
19
|
+
'RNSScreenNavigationContainerComponentDescriptor',
|
|
20
|
+
'RNSScreenStackHeaderConfigComponentDescriptor',
|
|
21
|
+
'RNSScreenStackHeaderSubviewComponentDescriptor',
|
|
22
|
+
'RNSScreenStackComponentDescriptor',
|
|
23
|
+
'RNSSearchBarComponentDescriptor',
|
|
24
|
+
'RNSScreenComponentDescriptor',
|
|
25
|
+
'RNSModalScreenComponentDescriptor',
|
|
26
|
+
],
|
|
27
|
+
cmakeListsPath: '../android/src/main/jni/CMakeLists.txt',
|
|
28
|
+
}
|
|
29
|
+
: {},
|
|
28
30
|
},
|
|
29
31
|
},
|
|
30
|
-
}
|
|
32
|
+
};
|
|
@@ -19,7 +19,7 @@ export const NativeScreen: React.ComponentType<ScreenProps> =
|
|
|
19
19
|
ScreenNativeComponent as React.ComponentType<ScreenProps>;
|
|
20
20
|
const AnimatedNativeScreen = Animated.createAnimatedComponent(NativeScreen);
|
|
21
21
|
const AnimatedNativeModalScreen = Animated.createAnimatedComponent(
|
|
22
|
-
ModalScreenNativeComponent as React.ComponentType<ScreenProps
|
|
22
|
+
ModalScreenNativeComponent as React.ComponentType<ScreenProps>,
|
|
23
23
|
);
|
|
24
24
|
|
|
25
25
|
// Incomplete type, all accessible properties available at:
|
|
@@ -98,7 +98,7 @@ export const InnerScreen = React.forwardRef<View, ScreenProps>(
|
|
|
98
98
|
|
|
99
99
|
if (active !== undefined && activityState === undefined) {
|
|
100
100
|
console.warn(
|
|
101
|
-
'It appears that you are using old version of react-navigation library. Please update @react-navigation/bottom-tabs, @react-navigation/stack and @react-navigation/drawer to version 5.10.0 or above to take full advantage of new functionality added to react-native-screens'
|
|
101
|
+
'It appears that you are using old version of react-navigation library. Please update @react-navigation/bottom-tabs, @react-navigation/stack and @react-navigation/drawer to version 5.10.0 or above to take full advantage of new functionality added to react-native-screens',
|
|
102
102
|
);
|
|
103
103
|
activityState = active !== 0 ? 2 : 0; // in the new version, we need one of the screens to have value of 2 after the transition
|
|
104
104
|
}
|
|
@@ -151,7 +151,7 @@ export const InnerScreen = React.forwardRef<View, ScreenProps>(
|
|
|
151
151
|
},
|
|
152
152
|
},
|
|
153
153
|
],
|
|
154
|
-
{ useNativeDriver: true }
|
|
154
|
+
{ useNativeDriver: true },
|
|
155
155
|
)
|
|
156
156
|
}
|
|
157
157
|
onGestureCancel={
|
|
@@ -197,7 +197,7 @@ export const InnerScreen = React.forwardRef<View, ScreenProps>(
|
|
|
197
197
|
/>
|
|
198
198
|
);
|
|
199
199
|
}
|
|
200
|
-
}
|
|
200
|
+
},
|
|
201
201
|
);
|
|
202
202
|
|
|
203
203
|
// context to be used when the user wants to use enhanced implementation
|
|
@@ -7,6 +7,10 @@ import ScreenStackNativeComponent from '../fabric/ScreenStackNativeComponent';
|
|
|
7
7
|
const NativeScreenStack: React.ComponentType<ScreenStackProps> =
|
|
8
8
|
ScreenStackNativeComponent as any;
|
|
9
9
|
|
|
10
|
+
function isFabric() {
|
|
11
|
+
return 'nativeFabricUIManager' in global;
|
|
12
|
+
}
|
|
13
|
+
|
|
10
14
|
function ScreenStack(props: ScreenStackProps) {
|
|
11
15
|
const { children, gestureDetectorBridge, ...rest } = props;
|
|
12
16
|
const ref = React.useRef(null);
|
|
@@ -19,8 +23,14 @@ function ScreenStack(props: ScreenStackProps) {
|
|
|
19
23
|
const isFreezeEnabled =
|
|
20
24
|
descriptor?.options?.freezeOnBlur ?? freezeEnabled();
|
|
21
25
|
|
|
26
|
+
// On Fabric, when screen is frozen, animated and reanimated values are not updated
|
|
27
|
+
// due to component being unmounted. To avoid this, we don't freeze the previous screen there
|
|
28
|
+
const freezePreviousScreen = isFabric()
|
|
29
|
+
? size - index > 2
|
|
30
|
+
: size - index > 1;
|
|
31
|
+
|
|
22
32
|
return (
|
|
23
|
-
<DelayedFreeze freeze={isFreezeEnabled &&
|
|
33
|
+
<DelayedFreeze freeze={isFreezeEnabled && freezePreviousScreen}>
|
|
24
34
|
{child}
|
|
25
35
|
</DelayedFreeze>
|
|
26
36
|
);
|
|
@@ -17,7 +17,7 @@ export const ScreenStackHeaderSubview: React.ComponentType<
|
|
|
17
17
|
> = ScreenStackHeaderSubviewNativeComponent as any;
|
|
18
18
|
|
|
19
19
|
export const ScreenStackHeaderBackButtonImage = (
|
|
20
|
-
props: ImageProps
|
|
20
|
+
props: ImageProps,
|
|
21
21
|
): JSX.Element => (
|
|
22
22
|
<ScreenStackHeaderSubview type="back" style={styles.headerSubview}>
|
|
23
23
|
<Image resizeMode="center" fadeDuration={0} {...props} />
|
|
@@ -25,7 +25,7 @@ export const ScreenStackHeaderBackButtonImage = (
|
|
|
25
25
|
);
|
|
26
26
|
|
|
27
27
|
export const ScreenStackHeaderRightView = (
|
|
28
|
-
props: React.PropsWithChildren<ViewProps
|
|
28
|
+
props: React.PropsWithChildren<ViewProps>,
|
|
29
29
|
): JSX.Element => (
|
|
30
30
|
<ScreenStackHeaderSubview
|
|
31
31
|
{...props}
|
|
@@ -35,7 +35,7 @@ export const ScreenStackHeaderRightView = (
|
|
|
35
35
|
);
|
|
36
36
|
|
|
37
37
|
export const ScreenStackHeaderLeftView = (
|
|
38
|
-
props: React.PropsWithChildren<ViewProps
|
|
38
|
+
props: React.PropsWithChildren<ViewProps>,
|
|
39
39
|
): JSX.Element => (
|
|
40
40
|
<ScreenStackHeaderSubview
|
|
41
41
|
{...props}
|
|
@@ -45,7 +45,7 @@ export const ScreenStackHeaderLeftView = (
|
|
|
45
45
|
);
|
|
46
46
|
|
|
47
47
|
export const ScreenStackHeaderCenterView = (
|
|
48
|
-
props: React.PropsWithChildren<ViewProps
|
|
48
|
+
props: React.PropsWithChildren<ViewProps>,
|
|
49
49
|
): JSX.Element => (
|
|
50
50
|
<ScreenStackHeaderSubview
|
|
51
51
|
{...props}
|
|
@@ -55,7 +55,7 @@ export const ScreenStackHeaderCenterView = (
|
|
|
55
55
|
);
|
|
56
56
|
|
|
57
57
|
export const ScreenStackHeaderSearchBarView = (
|
|
58
|
-
props: React.PropsWithChildren<SearchBarProps
|
|
58
|
+
props: React.PropsWithChildren<SearchBarProps>,
|
|
59
59
|
): JSX.Element => (
|
|
60
60
|
<ScreenStackHeaderSubview
|
|
61
61
|
{...props}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from 'react-native-screens';
|
|
8
8
|
|
|
9
9
|
export const ScreenStackHeaderBackButtonImage = (
|
|
10
|
-
props: ImageProps
|
|
10
|
+
props: ImageProps,
|
|
11
11
|
): JSX.Element => (
|
|
12
12
|
<View>
|
|
13
13
|
<Image resizeMode="center" fadeDuration={0} {...props} />
|
|
@@ -15,23 +15,23 @@ export const ScreenStackHeaderBackButtonImage = (
|
|
|
15
15
|
);
|
|
16
16
|
|
|
17
17
|
export const ScreenStackHeaderRightView = (
|
|
18
|
-
props: React.PropsWithChildren<ViewProps
|
|
18
|
+
props: React.PropsWithChildren<ViewProps>,
|
|
19
19
|
): JSX.Element => <View {...props} />;
|
|
20
20
|
|
|
21
21
|
export const ScreenStackHeaderLeftView = (
|
|
22
|
-
props: React.PropsWithChildren<ViewProps
|
|
22
|
+
props: React.PropsWithChildren<ViewProps>,
|
|
23
23
|
): JSX.Element => <View {...props} />;
|
|
24
24
|
|
|
25
25
|
export const ScreenStackHeaderCenterView = (
|
|
26
|
-
props: React.PropsWithChildren<ViewProps
|
|
26
|
+
props: React.PropsWithChildren<ViewProps>,
|
|
27
27
|
): JSX.Element => <View {...props} />;
|
|
28
28
|
|
|
29
29
|
export const ScreenStackHeaderSearchBarView = (
|
|
30
|
-
props: React.PropsWithChildren<Omit<SearchBarProps, 'ref'
|
|
30
|
+
props: React.PropsWithChildren<Omit<SearchBarProps, 'ref'>>,
|
|
31
31
|
): JSX.Element => <View {...props} />;
|
|
32
32
|
|
|
33
33
|
export const ScreenStackHeaderConfig = (
|
|
34
|
-
props: React.PropsWithChildren<ScreenStackHeaderConfigProps
|
|
34
|
+
props: React.PropsWithChildren<ScreenStackHeaderConfigProps>,
|
|
35
35
|
): JSX.Element => <View {...props} />;
|
|
36
36
|
|
|
37
37
|
export const ScreenStackHeaderSubview: React.ComponentType<
|
|
@@ -48,7 +48,7 @@ function SearchBar(props: SearchBarProps, ref: React.Ref<SearchBarCommands>) {
|
|
|
48
48
|
},
|
|
49
49
|
toggleCancelButton: (flag: boolean) => {
|
|
50
50
|
_callMethodWithRef(ref =>
|
|
51
|
-
NativeSearchBarCommands.toggleCancelButton(ref, flag)
|
|
51
|
+
NativeSearchBarCommands.toggleCancelButton(ref, flag),
|
|
52
52
|
);
|
|
53
53
|
},
|
|
54
54
|
clearText: () => {
|
|
@@ -69,16 +69,16 @@ function SearchBar(props: SearchBarProps, ref: React.Ref<SearchBarCommands>) {
|
|
|
69
69
|
method(ref);
|
|
70
70
|
} else {
|
|
71
71
|
console.warn(
|
|
72
|
-
'Reference to native search bar component has not been updated yet'
|
|
72
|
+
'Reference to native search bar component has not been updated yet',
|
|
73
73
|
);
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
|
-
[searchBarRef]
|
|
76
|
+
[searchBarRef],
|
|
77
77
|
);
|
|
78
78
|
|
|
79
79
|
if (!isSearchBarAvailableForCurrentPlatform) {
|
|
80
80
|
console.warn(
|
|
81
|
-
'Importing SearchBar is only valid on iOS and Android devices.'
|
|
81
|
+
'Importing SearchBar is only valid on iOS and Android devices.',
|
|
82
82
|
);
|
|
83
83
|
return View as unknown as React.ReactNode;
|
|
84
84
|
}
|
package/src/core.ts
CHANGED
|
@@ -19,7 +19,7 @@ export function enableScreens(shouldEnableScreens = true) {
|
|
|
19
19
|
|
|
20
20
|
if (ENABLE_SCREENS && !UIManager.getViewManagerConfig('RNSScreen')) {
|
|
21
21
|
console.error(
|
|
22
|
-
`Screen native module hasn't been linked. Please check the react-native-screens README for more details
|
|
22
|
+
`Screen native module hasn't been linked. Please check the react-native-screens README for more details`,
|
|
23
23
|
);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -77,6 +77,7 @@ export interface NativeProps extends ViewProps {
|
|
|
77
77
|
sheetExpandsWhenScrolledToEdge?: WithDefault<boolean, false>;
|
|
78
78
|
customAnimationOnSwipe?: boolean;
|
|
79
79
|
fullScreenSwipeEnabled?: boolean;
|
|
80
|
+
fullScreenSwipeShadowEnabled?: boolean;
|
|
80
81
|
homeIndicatorHidden?: boolean;
|
|
81
82
|
preventNativeDismiss?: boolean;
|
|
82
83
|
gestureEnabled?: WithDefault<boolean, true>;
|
|
@@ -77,6 +77,7 @@ export interface NativeProps extends ViewProps {
|
|
|
77
77
|
sheetExpandsWhenScrolledToEdge?: WithDefault<boolean, false>;
|
|
78
78
|
customAnimationOnSwipe?: boolean;
|
|
79
79
|
fullScreenSwipeEnabled?: boolean;
|
|
80
|
+
fullScreenSwipeShadowEnabled?: boolean;
|
|
80
81
|
homeIndicatorHidden?: boolean;
|
|
81
82
|
preventNativeDismiss?: boolean;
|
|
82
83
|
gestureEnabled?: WithDefault<boolean, true>;
|
|
@@ -58,7 +58,7 @@ interface NativeCommands {
|
|
|
58
58
|
clearText: (viewRef: React.ElementRef<ComponentType>) => void;
|
|
59
59
|
toggleCancelButton: (
|
|
60
60
|
viewRef: React.ElementRef<ComponentType>,
|
|
61
|
-
flag: boolean
|
|
61
|
+
flag: boolean,
|
|
62
62
|
) => void;
|
|
63
63
|
setText: (viewRef: React.ElementRef<ComponentType>, text: string) => void;
|
|
64
64
|
cancelSearch: (viewRef: React.ElementRef<ComponentType>) => void;
|
|
@@ -40,7 +40,7 @@ const ScreenGestureDetector = ({
|
|
|
40
40
|
const canPerformUpdates = makeMutable(false);
|
|
41
41
|
const transitionAnimation = getAnimationForTransition(
|
|
42
42
|
goBackGesture,
|
|
43
|
-
customTransitionAnimation
|
|
43
|
+
customTransitionAnimation,
|
|
44
44
|
);
|
|
45
45
|
const screenTransitionConfig = makeMutable({
|
|
46
46
|
stackTag: -1,
|
|
@@ -90,7 +90,7 @@ const ScreenGestureDetector = ({
|
|
|
90
90
|
}, [currentRouteKey]);
|
|
91
91
|
|
|
92
92
|
function computeProgress(
|
|
93
|
-
event: GestureUpdateEvent<PanGestureHandlerEventPayload
|
|
93
|
+
event: GestureUpdateEvent<PanGestureHandlerEventPayload>,
|
|
94
94
|
) {
|
|
95
95
|
'worklet';
|
|
96
96
|
let progress = 0;
|
|
@@ -114,10 +114,10 @@ const ScreenGestureDetector = ({
|
|
|
114
114
|
progress = Math.abs(event.translationY / screenDimensions.height / 2);
|
|
115
115
|
} else if (goBackGesture === 'twoDimensionalSwipe') {
|
|
116
116
|
const progressX = Math.abs(
|
|
117
|
-
event.translationX / screenDimensions.width / 2
|
|
117
|
+
event.translationX / screenDimensions.width / 2,
|
|
118
118
|
);
|
|
119
119
|
const progressY = Math.abs(
|
|
120
|
-
event.translationY / screenDimensions.height / 2
|
|
120
|
+
event.translationY / screenDimensions.height / 2,
|
|
121
121
|
);
|
|
122
122
|
progress = Math.max(progressX, progressY);
|
|
123
123
|
}
|
|
@@ -194,7 +194,7 @@ const ScreenGestureDetector = ({
|
|
|
194
194
|
distanceX,
|
|
195
195
|
requiredXDistance,
|
|
196
196
|
distanceY,
|
|
197
|
-
requiredYDistance
|
|
197
|
+
requiredYDistance,
|
|
198
198
|
);
|
|
199
199
|
const stackTag = screenTransitionConfig.value.stackTag;
|
|
200
200
|
screenTransitionConfig.value.onFinishAnimation = () => {
|
|
@@ -19,14 +19,14 @@ const SupportedGestures = [
|
|
|
19
19
|
|
|
20
20
|
export function getAnimationForTransition(
|
|
21
21
|
goBackGesture: GoBackGesture | undefined,
|
|
22
|
-
customTransitionAnimation: AnimatedScreenTransition | undefined
|
|
22
|
+
customTransitionAnimation: AnimatedScreenTransition | undefined,
|
|
23
23
|
) {
|
|
24
24
|
let transitionAnimation = ScreenTransition.SwipeRight;
|
|
25
25
|
if (customTransitionAnimation) {
|
|
26
26
|
transitionAnimation = customTransitionAnimation;
|
|
27
27
|
if (!goBackGesture) {
|
|
28
28
|
throw new Error(
|
|
29
|
-
'[RNScreens] You have to specify `goBackGesture` when using `transitionAnimation`.'
|
|
29
|
+
'[RNScreens] You have to specify `goBackGesture` when using `transitionAnimation`.',
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
32
|
} else {
|
|
@@ -34,7 +34,7 @@ export function getAnimationForTransition(
|
|
|
34
34
|
transitionAnimation = AnimationForGesture[goBackGesture];
|
|
35
35
|
} else if (goBackGesture !== undefined) {
|
|
36
36
|
throw new Error(
|
|
37
|
-
`[RNScreens] Unknown goBackGesture parameter has been specified: ${goBackGesture}
|
|
37
|
+
`[RNScreens] Unknown goBackGesture parameter has been specified: ${goBackGesture}.`,
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -43,7 +43,7 @@ export function getAnimationForTransition(
|
|
|
43
43
|
|
|
44
44
|
export function checkBoundaries(
|
|
45
45
|
goBackGesture: string | undefined,
|
|
46
|
-
event: GestureUpdateEvent<PanGestureHandlerEventPayload
|
|
46
|
+
event: GestureUpdateEvent<PanGestureHandlerEventPayload>,
|
|
47
47
|
) {
|
|
48
48
|
'worklet';
|
|
49
49
|
if (goBackGesture === 'swipeRight' && event.translationX < 0) {
|
|
@@ -62,7 +62,7 @@ export function checkIfTransitionCancelled(
|
|
|
62
62
|
distanceX: number,
|
|
63
63
|
requiredXDistance: number,
|
|
64
64
|
distanceY: number,
|
|
65
|
-
requiredYDistance: number
|
|
65
|
+
requiredYDistance: number,
|
|
66
66
|
) {
|
|
67
67
|
'worklet';
|
|
68
68
|
let isTransitionCanceled = false;
|
|
@@ -29,7 +29,7 @@ if (isFabric()) {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
export function getShadowNodeWrapperAndTagFromRef(
|
|
32
|
-
ref: React.Ref<NativeStackNavigatorProps> | React.Component
|
|
32
|
+
ref: React.Ref<NativeStackNavigatorProps> | React.Component,
|
|
33
33
|
) {
|
|
34
34
|
const hostInstance = findHostInstance(ref as React.Component);
|
|
35
35
|
return {
|
|
@@ -3,5 +3,5 @@ import { GestureProviderProps } from '../types';
|
|
|
3
3
|
|
|
4
4
|
// context to be used when the user wants full screen swipe (see `gesture-handler` folder in repo)
|
|
5
5
|
export const GHContext = React.createContext(
|
|
6
|
-
(props: PropsWithChildren<GestureProviderProps>) => <>{props.children}
|
|
6
|
+
(props: PropsWithChildren<GestureProviderProps>) => <>{props.children}</>,
|
|
7
7
|
);
|
|
@@ -41,7 +41,7 @@ function NativeStackNavigator({
|
|
|
41
41
|
// @ts-ignore navigation.dangerouslyGetParent was removed in v6
|
|
42
42
|
if (navigation?.dangerouslyGetParent === undefined) {
|
|
43
43
|
console.warn(
|
|
44
|
-
'Looks like you are importing `native-stack` from `react-native-screens/native-stack`. Since version 6 of `react-navigation`, it should be imported from `@react-navigation/native-stack`.'
|
|
44
|
+
'Looks like you are importing `native-stack` from `react-native-screens/native-stack`. Since version 6 of `react-navigation`, it should be imported from `@react-navigation/native-stack`.',
|
|
45
45
|
);
|
|
46
46
|
}
|
|
47
47
|
}, [navigation]);
|
|
@@ -70,9 +70,9 @@ function NativeStackNavigator({
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
});
|
|
73
|
-
}
|
|
73
|
+
},
|
|
74
74
|
),
|
|
75
|
-
[navigation, state.index, state.key]
|
|
75
|
+
[navigation, state.index, state.key],
|
|
76
76
|
);
|
|
77
77
|
|
|
78
78
|
return (
|
|
@@ -56,7 +56,7 @@ export type NativeStackNavigationEventMap = {
|
|
|
56
56
|
|
|
57
57
|
export type NativeStackNavigationProp<
|
|
58
58
|
ParamList extends ParamListBase,
|
|
59
|
-
RouteName extends keyof ParamList = string
|
|
59
|
+
RouteName extends keyof ParamList = string,
|
|
60
60
|
> = NavigationProp<
|
|
61
61
|
ParamList,
|
|
62
62
|
RouteName,
|
|
@@ -68,7 +68,7 @@ export type NativeStackNavigationProp<
|
|
|
68
68
|
|
|
69
69
|
export type NativeStackScreenProps<
|
|
70
70
|
ParamList extends ParamListBase,
|
|
71
|
-
RouteName extends keyof ParamList = string
|
|
71
|
+
RouteName extends keyof ParamList = string,
|
|
72
72
|
> = {
|
|
73
73
|
navigation: NativeStackNavigationProp<ParamList, RouteName>;
|
|
74
74
|
route: RouteProp<ParamList, RouteName>;
|
|
@@ -134,6 +134,16 @@ export type NativeStackNavigationOptions = {
|
|
|
134
134
|
* @platform ios
|
|
135
135
|
*/
|
|
136
136
|
fullScreenSwipeEnabled?: boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Whether the full screen dismiss gesture has shadow under view during transition. The gesture uses custom transition and thus
|
|
139
|
+
* doesn't have a shadow by default. When enabled, a custom shadow view is added during the transition which tries to mimic the
|
|
140
|
+
* default iOS shadow. Defaults to `false`.
|
|
141
|
+
*
|
|
142
|
+
* This does not affect the behavior of transitions that don't use gestures, enabled by `fullScreenGestureEnabled` prop.
|
|
143
|
+
*
|
|
144
|
+
* @platform ios
|
|
145
|
+
*/
|
|
146
|
+
fullScreenSwipeShadowEnabled?: boolean;
|
|
137
147
|
/**
|
|
138
148
|
* Whether you can use gestures to dismiss this screen. Defaults to `true`.
|
|
139
149
|
* Only supported on iOS.
|
|
@@ -524,11 +534,11 @@ export interface MeasuredDimensions {
|
|
|
524
534
|
export type AnimatedScreenTransition = {
|
|
525
535
|
topScreenStyle: (
|
|
526
536
|
event: PanGestureHandlerEventPayload,
|
|
527
|
-
screenSize: MeasuredDimensions
|
|
537
|
+
screenSize: MeasuredDimensions,
|
|
528
538
|
) => Record<string, unknown>;
|
|
529
539
|
belowTopScreenStyle: (
|
|
530
540
|
event: PanGestureHandlerEventPayload,
|
|
531
|
-
screenSize: MeasuredDimensions
|
|
541
|
+
screenSize: MeasuredDimensions,
|
|
532
542
|
) => Record<string, unknown>;
|
|
533
543
|
};
|
|
534
544
|
|
|
@@ -8,7 +8,7 @@ export default function getDefaultHeaderHeight(
|
|
|
8
8
|
layout: Layout,
|
|
9
9
|
statusBarHeight: number,
|
|
10
10
|
stackPresentation: StackPresentationTypes,
|
|
11
|
-
isLargeHeader = false
|
|
11
|
+
isLargeHeader = false,
|
|
12
12
|
): number {
|
|
13
13
|
// default header heights
|
|
14
14
|
let headerHeight = Platform.OS === 'android' ? 56 : 64;
|
|
@@ -4,7 +4,7 @@ import { Platform } from 'react-native';
|
|
|
4
4
|
export default function getStatusBarHeight(
|
|
5
5
|
topInset: number,
|
|
6
6
|
dimensions: Rect,
|
|
7
|
-
isStatusBarTranslucent: boolean
|
|
7
|
+
isStatusBarTranslucent: boolean,
|
|
8
8
|
) {
|
|
9
9
|
if (Platform.OS === 'ios') {
|
|
10
10
|
// It looks like some iOS devices don't have strictly set status bar height to 44.
|
|
@@ -7,7 +7,7 @@ export default function useAnimatedHeaderHeight() {
|
|
|
7
7
|
|
|
8
8
|
if (animatedValue === undefined) {
|
|
9
9
|
throw new Error(
|
|
10
|
-
"Couldn't find the header height. Are you inside a screen in a navigator with a header?"
|
|
10
|
+
"Couldn't find the header height. Are you inside a screen in a navigator with a header?",
|
|
11
11
|
);
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -7,7 +7,7 @@ export default function useHeaderHeight() {
|
|
|
7
7
|
|
|
8
8
|
if (height === undefined) {
|
|
9
9
|
throw new Error(
|
|
10
|
-
"Couldn't find the header height. Are you inside a screen in a navigator with a header?"
|
|
10
|
+
"Couldn't find the header height. Are you inside a screen in a navigator with a header?",
|
|
11
11
|
);
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import ReactNativeStyleAttributes from 'react-native/Libraries/Components/View/ReactNativeStyleAttributes';
|
|
4
4
|
|
|
5
5
|
export function processFonts(
|
|
6
|
-
fontFamilies: (string | undefined)[]
|
|
6
|
+
fontFamilies: (string | undefined)[],
|
|
7
7
|
): (string | undefined)[] {
|
|
8
8
|
// @ts-ignore: React Native types are incorrect here and don't consider fontFamily a style value
|
|
9
9
|
const fontFamilyProcessor = ReactNativeStyleAttributes.fontFamily?.process;
|
|
@@ -104,7 +104,7 @@ export default function HeaderConfig({
|
|
|
104
104
|
warnOnce(
|
|
105
105
|
isVisionOS &&
|
|
106
106
|
(headerTitleStyle.color !== undefined || headerTintColor !== undefined),
|
|
107
|
-
'headerTitleStyle.color and headerTintColor are not supported on visionOS.'
|
|
107
|
+
'headerTitleStyle.color and headerTintColor are not supported on visionOS.',
|
|
108
108
|
);
|
|
109
109
|
|
|
110
110
|
return (
|
|
@@ -44,7 +44,7 @@ let Container = View;
|
|
|
44
44
|
|
|
45
45
|
if (__DEV__) {
|
|
46
46
|
const DebugContainer = (
|
|
47
|
-
props: ViewProps & { stackPresentation: StackPresentationTypes }
|
|
47
|
+
props: ViewProps & { stackPresentation: StackPresentationTypes },
|
|
48
48
|
) => {
|
|
49
49
|
const { stackPresentation, ...rest } = props;
|
|
50
50
|
if (Platform.OS === 'ios' && stackPresentation !== 'push') {
|
|
@@ -87,7 +87,7 @@ const MaybeNestedStack = ({
|
|
|
87
87
|
!isAndroid &&
|
|
88
88
|
stackPresentation !== 'push' &&
|
|
89
89
|
headerShownPreviousRef.current !== headerShown,
|
|
90
|
-
`Dynamically changing 'headerShown' in modals will result in remounting the screen and losing all local state. See options for the screen '${route.name}'
|
|
90
|
+
`Dynamically changing 'headerShown' in modals will result in remounting the screen and losing all local state. See options for the screen '${route.name}'.`,
|
|
91
91
|
);
|
|
92
92
|
|
|
93
93
|
headerShownPreviousRef.current = headerShown;
|
|
@@ -119,7 +119,7 @@ const MaybeNestedStack = ({
|
|
|
119
119
|
const statusBarHeight = getStatusBarHeight(
|
|
120
120
|
topInset,
|
|
121
121
|
dimensions,
|
|
122
|
-
isStatusBarTranslucent
|
|
122
|
+
isStatusBarTranslucent,
|
|
123
123
|
);
|
|
124
124
|
|
|
125
125
|
const hasLargeHeader = options.headerLargeTitle ?? false;
|
|
@@ -128,7 +128,7 @@ const MaybeNestedStack = ({
|
|
|
128
128
|
dimensions,
|
|
129
129
|
statusBarHeight,
|
|
130
130
|
stackPresentation,
|
|
131
|
-
hasLargeHeader
|
|
131
|
+
hasLargeHeader,
|
|
132
132
|
);
|
|
133
133
|
|
|
134
134
|
if (isHeaderInModal) {
|
|
@@ -152,7 +152,7 @@ const MaybeNestedStack = ({
|
|
|
152
152
|
|
|
153
153
|
type NavigationRoute<
|
|
154
154
|
ParamList extends ParamListBase,
|
|
155
|
-
RouteName extends keyof ParamList
|
|
155
|
+
RouteName extends keyof ParamList,
|
|
156
156
|
> = Route<Extract<RouteName, string>, ParamList[RouteName]> & {
|
|
157
157
|
state?: NavigationState | PartialState<NavigationState>;
|
|
158
158
|
};
|
|
@@ -174,6 +174,7 @@ const RouteView = ({
|
|
|
174
174
|
}) => {
|
|
175
175
|
const { options, render: renderScene } = descriptors[route.key];
|
|
176
176
|
const {
|
|
177
|
+
fullScreenSwipeShadowEnabled = false,
|
|
177
178
|
gestureEnabled,
|
|
178
179
|
headerShown,
|
|
179
180
|
hideKeyboardOnSwipe,
|
|
@@ -236,7 +237,7 @@ const RouteView = ({
|
|
|
236
237
|
const statusBarHeight = getStatusBarHeight(
|
|
237
238
|
topInset,
|
|
238
239
|
dimensions,
|
|
239
|
-
isStatusBarTranslucent
|
|
240
|
+
isStatusBarTranslucent,
|
|
240
241
|
);
|
|
241
242
|
|
|
242
243
|
const hasLargeHeader = options.headerLargeTitle ?? false;
|
|
@@ -245,7 +246,7 @@ const RouteView = ({
|
|
|
245
246
|
dimensions,
|
|
246
247
|
statusBarHeight,
|
|
247
248
|
stackPresentation,
|
|
248
|
-
hasLargeHeader
|
|
249
|
+
hasLargeHeader,
|
|
249
250
|
);
|
|
250
251
|
|
|
251
252
|
const parentHeaderHeight = React.useContext(HeaderHeightContext);
|
|
@@ -263,7 +264,7 @@ const RouteView = ({
|
|
|
263
264
|
const animatedHeaderHeight = React.useRef(
|
|
264
265
|
new Animated.Value(staticHeaderHeight, {
|
|
265
266
|
useNativeDriver: true,
|
|
266
|
-
})
|
|
267
|
+
}),
|
|
267
268
|
).current;
|
|
268
269
|
|
|
269
270
|
const Screen = React.useContext(ScreenContext);
|
|
@@ -294,6 +295,7 @@ const RouteView = ({
|
|
|
294
295
|
customAnimationOnSwipe={customAnimationOnSwipe}
|
|
295
296
|
freezeOnBlur={freezeOnBlur}
|
|
296
297
|
fullScreenSwipeEnabled={fullScreenSwipeEnabled}
|
|
298
|
+
fullScreenSwipeShadowEnabled={fullScreenSwipeShadowEnabled}
|
|
297
299
|
hideKeyboardOnSwipe={hideKeyboardOnSwipe}
|
|
298
300
|
homeIndicatorHidden={homeIndicatorHidden}
|
|
299
301
|
gestureEnabled={isAndroid ? false : gestureEnabled}
|
|
@@ -441,7 +443,7 @@ function NativeStackViewInner({
|
|
|
441
443
|
goBackGesture !== undefined
|
|
442
444
|
) {
|
|
443
445
|
console.warn(
|
|
444
|
-
'Cannot detect GestureDetectorProvider in a screen that uses `goBackGesture`. Make sure your navigator is wrapped in GestureDetectorProvider.'
|
|
446
|
+
'Cannot detect GestureDetectorProvider in a screen that uses `goBackGesture`. Make sure your navigator is wrapped in GestureDetectorProvider.',
|
|
445
447
|
);
|
|
446
448
|
}
|
|
447
449
|
}, [ScreenGestureDetector.name, goBackGesture]);
|