react-native-screens 3.32.0 → 3.34.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 +245 -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
|
@@ -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]);
|
|
@@ -19,7 +19,7 @@ import getStatusBarHeight from '../native-stack/utils/getStatusBarHeight';
|
|
|
19
19
|
import ReanimatedHeaderHeightContext from './ReanimatedHeaderHeightContext';
|
|
20
20
|
|
|
21
21
|
const AnimatedScreen = Animated.createAnimatedComponent(
|
|
22
|
-
InnerScreen as unknown as React.ComponentClass
|
|
22
|
+
InnerScreen as unknown as React.ComponentClass,
|
|
23
23
|
);
|
|
24
24
|
|
|
25
25
|
// We use prop added to global by reanimated since it seems safer than the one from RN. See:
|
|
@@ -40,7 +40,7 @@ const ReanimatedNativeStackScreen = React.forwardRef<
|
|
|
40
40
|
const statusBarHeight = getStatusBarHeight(
|
|
41
41
|
topInset,
|
|
42
42
|
dimensions,
|
|
43
|
-
isStatusBarTranslucent
|
|
43
|
+
isStatusBarTranslucent,
|
|
44
44
|
);
|
|
45
45
|
|
|
46
46
|
// Default header height, normally used in `useHeaderHeight` hook.
|
|
@@ -49,7 +49,7 @@ const ReanimatedNativeStackScreen = React.forwardRef<
|
|
|
49
49
|
dimensions,
|
|
50
50
|
statusBarHeight,
|
|
51
51
|
stackPresentation,
|
|
52
|
-
hasLargeHeader
|
|
52
|
+
hasLargeHeader,
|
|
53
53
|
);
|
|
54
54
|
|
|
55
55
|
const cachedHeaderHeight = React.useRef(defaultHeaderHeight);
|
|
@@ -79,7 +79,7 @@ const ReanimatedNativeStackScreen = React.forwardRef<
|
|
|
79
79
|
ENABLE_FABRIC
|
|
80
80
|
? 'onTransitionProgress'
|
|
81
81
|
: 'topTransitionProgress',
|
|
82
|
-
]
|
|
82
|
+
],
|
|
83
83
|
)}
|
|
84
84
|
onHeaderHeightChangeReanimated={useEvent(
|
|
85
85
|
(event: HeaderHeightChangeEventType) => {
|
|
@@ -96,7 +96,7 @@ const ReanimatedNativeStackScreen = React.forwardRef<
|
|
|
96
96
|
: ENABLE_FABRIC
|
|
97
97
|
? 'onHeaderHeightChange'
|
|
98
98
|
: 'topHeaderHeightChange',
|
|
99
|
-
]
|
|
99
|
+
],
|
|
100
100
|
)}
|
|
101
101
|
{...rest}>
|
|
102
102
|
<ReanimatedHeaderHeightContext.Provider value={headerHeight}>
|
|
@@ -5,7 +5,7 @@ import { InnerScreen, ScreenProps } from 'react-native-screens';
|
|
|
5
5
|
import Animated from 'react-native-reanimated';
|
|
6
6
|
|
|
7
7
|
const AnimatedScreen = Animated.createAnimatedComponent(
|
|
8
|
-
InnerScreen as unknown as React.ComponentClass
|
|
8
|
+
InnerScreen as unknown as React.ComponentClass,
|
|
9
9
|
);
|
|
10
10
|
|
|
11
11
|
const ReanimatedScreen = React.forwardRef<typeof AnimatedScreen, ScreenProps>(
|
|
@@ -17,7 +17,7 @@ const ReanimatedScreen = React.forwardRef<typeof AnimatedScreen, ScreenProps>(
|
|
|
17
17
|
{...props}
|
|
18
18
|
/>
|
|
19
19
|
);
|
|
20
|
-
}
|
|
20
|
+
},
|
|
21
21
|
);
|
|
22
22
|
|
|
23
23
|
ReanimatedScreen.displayName = 'ReanimatedScreen';
|
|
@@ -31,7 +31,7 @@ class ReanimatedScreenWrapper extends React.Component<ScreenProps> {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export default function ReanimatedScreenProvider(
|
|
34
|
-
props: PropsWithChildren<unknown
|
|
34
|
+
props: PropsWithChildren<unknown>,
|
|
35
35
|
) {
|
|
36
36
|
return (
|
|
37
37
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -6,7 +6,7 @@ export default function useReanimatedHeaderHeight() {
|
|
|
6
6
|
|
|
7
7
|
if (height === undefined) {
|
|
8
8
|
throw new Error(
|
|
9
|
-
"Couldn't find the header height using Reanimated. Are you inside a screen in a navigator with a header and your NavigationContainer is wrapped in ReanimatedScreenProvider?"
|
|
9
|
+
"Couldn't find the header height using Reanimated. Are you inside a screen in a navigator with a header and your NavigationContainer is wrapped in ReanimatedScreenProvider?",
|
|
10
10
|
);
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -6,7 +6,7 @@ export default function useReanimatedTransitionProgress() {
|
|
|
6
6
|
|
|
7
7
|
if (progress === undefined) {
|
|
8
8
|
throw new Error(
|
|
9
|
-
"Couldn't find values for reanimated transition progress. Are you inside a screen in Native Stack?"
|
|
9
|
+
"Couldn't find values for reanimated transition progress. Are you inside a screen in Native Stack?",
|
|
10
10
|
);
|
|
11
11
|
}
|
|
12
12
|
|
package/src/types.tsx
CHANGED
|
@@ -133,6 +133,16 @@ export interface ScreenProps extends ViewProps {
|
|
|
133
133
|
* @platform ios
|
|
134
134
|
*/
|
|
135
135
|
fullScreenSwipeEnabled?: boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Whether the full screen dismiss gesture has shadow under view during transition. The gesture uses custom transition and thus
|
|
138
|
+
* doesn't have a shadow by default. When enabled, a custom shadow view is added during the transition which tries to mimic the
|
|
139
|
+
* default iOS shadow. Defaults to `false`.
|
|
140
|
+
*
|
|
141
|
+
* This does not affect the behavior of transitions that don't use gestures, enabled by `fullScreenGestureEnabled` prop.
|
|
142
|
+
*
|
|
143
|
+
* @platform ios
|
|
144
|
+
*/
|
|
145
|
+
fullScreenSwipeShadowEnabled?: boolean;
|
|
136
146
|
/**
|
|
137
147
|
* Whether you can use gestures to dismiss this screen. Defaults to `true`.
|
|
138
148
|
*
|
|
@@ -201,7 +211,7 @@ export interface ScreenProps extends ViewProps {
|
|
|
201
211
|
* A callback that gets called when the header height has changed.
|
|
202
212
|
*/
|
|
203
213
|
onHeaderHeightChange?: (
|
|
204
|
-
e: NativeSyntheticEvent<HeaderHeightChangeEventType
|
|
214
|
+
e: NativeSyntheticEvent<HeaderHeightChangeEventType>,
|
|
205
215
|
) => void;
|
|
206
216
|
/**
|
|
207
217
|
* A callback that gets called after swipe back is canceled.
|
|
@@ -219,13 +229,13 @@ export interface ScreenProps extends ViewProps {
|
|
|
219
229
|
* @platform ios
|
|
220
230
|
*/
|
|
221
231
|
onNativeDismissCancelled?: (
|
|
222
|
-
e: NativeSyntheticEvent<{ dismissCount: number }
|
|
232
|
+
e: NativeSyntheticEvent<{ dismissCount: number }>,
|
|
223
233
|
) => void;
|
|
224
234
|
/**
|
|
225
235
|
* An internal callback called every frame during the transition of screens of `native-stack`, used to feed transition context.
|
|
226
236
|
*/
|
|
227
237
|
onTransitionProgress?: (
|
|
228
|
-
e: NativeSyntheticEvent<TransitionProgressEventType
|
|
238
|
+
e: NativeSyntheticEvent<TransitionProgressEventType>,
|
|
229
239
|
) => void;
|
|
230
240
|
/**
|
|
231
241
|
* A callback that gets called when the current screen will appear. This is called as soon as the transition begins.
|
|
@@ -403,7 +413,7 @@ export interface ScreenContainerProps extends ViewProps {
|
|
|
403
413
|
|
|
404
414
|
export interface GestureDetectorBridge {
|
|
405
415
|
stackUseEffectCallback: (
|
|
406
|
-
stackRef: React.MutableRefObject<React.Ref<NativeStackNavigatorProps
|
|
416
|
+
stackRef: React.MutableRefObject<React.Ref<NativeStackNavigatorProps>>,
|
|
407
417
|
) => void;
|
|
408
418
|
}
|
|
409
419
|
|
|
@@ -675,7 +685,7 @@ export interface SearchBarProps {
|
|
|
675
685
|
* A callback that gets called when the search button is pressed. It receives the current text value of the search bar.
|
|
676
686
|
*/
|
|
677
687
|
onSearchButtonPress?: (
|
|
678
|
-
e: NativeSyntheticEvent<TextInputFocusEventData
|
|
688
|
+
e: NativeSyntheticEvent<TextInputFocusEventData>,
|
|
679
689
|
) => void;
|
|
680
690
|
/**
|
|
681
691
|
* Text displayed when search field is empty
|
|
@@ -7,7 +7,7 @@ export default function useTransitionProgress() {
|
|
|
7
7
|
|
|
8
8
|
if (progress === undefined) {
|
|
9
9
|
throw new Error(
|
|
10
|
-
"Couldn't find values for transition progress. Are you inside a screen in Native Stack?"
|
|
10
|
+
"Couldn't find values for transition progress. Are you inside a screen in Native Stack?",
|
|
11
11
|
);
|
|
12
12
|
}
|
|
13
13
|
|
package/windows/README.md
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# react-native-screens Windows Implementation
|
|
2
2
|
|
|
3
3
|
## Module Installation
|
|
4
|
+
|
|
4
5
|
You can either use autolinking on react-native-windows 0.63 and later or manually link the module on earlier releases.
|
|
5
6
|
|
|
6
7
|
## Automatic install with autolinking on RNW >= 0.63
|
|
8
|
+
|
|
7
9
|
RNScreens supports autolinking. Just call: `npm i react-native-screens --save`
|
|
8
10
|
|
|
9
11
|
## Manual installation on RNW >= 0.62
|
|
12
|
+
|
|
10
13
|
1. `npm install react-native-screens --save`
|
|
11
14
|
2. Open your solution in Visual Studio 2019 (eg. `windows\yourapp.sln`)
|
|
12
15
|
3. Right-click Solution icon in Solution Explorer > Add > Existing Project...
|
|
@@ -22,4 +25,4 @@ If you want to contribute to this module Windows implementation, first you must
|
|
|
22
25
|
|
|
23
26
|
You must temporarily install the `react-native-windows` package. Versions of `react-native-windows` and `react-native` must match, e.g. if the module uses `react-native@0.62`, install `npm i react-native-windows@^0.62 --dev`.
|
|
24
27
|
|
|
25
|
-
Now, you will be able to open corresponding `RNScreens...sln` file, e.g. `RNScreens62.sln` for `react-native-windows@0.62`.
|
|
28
|
+
Now, you will be able to open corresponding `RNScreens...sln` file, e.g. `RNScreens62.sln` for `react-native-windows@0.62`.
|