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.
Files changed (142) hide show
  1. package/README.md +17 -13
  2. package/RNScreens.podspec +10 -52
  3. package/android/CMakeLists.txt +48 -4
  4. package/android/build.gradle +9 -81
  5. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +25 -16
  6. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
  7. package/android/src/main/cpp/NativeProxy.cpp +51 -0
  8. package/android/src/main/cpp/NativeProxy.h +35 -0
  9. package/android/src/main/cpp/OnLoad.cpp +8 -0
  10. package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +5 -2
  11. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +4 -1
  12. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
  13. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
  14. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +134 -38
  15. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +17 -7
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
  18. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +60 -37
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +85 -58
  24. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +128 -37
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +173 -78
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +59 -24
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +30 -8
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +101 -50
  33. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
  34. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
  35. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
  36. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
  37. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
  38. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -5
  39. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
  40. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
  42. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
  43. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
  44. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +4 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
  47. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +4 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
  50. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
  51. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
  52. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
  53. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +245 -0
  54. package/android/src/main/jni/CMakeLists.txt +5 -4
  55. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +3 -0
  56. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +1 -0
  57. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
  58. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
  59. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
  60. package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
  61. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
  62. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +1 -1
  63. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +140 -1
  64. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
  65. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +23 -1
  66. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +20 -0
  67. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +23 -1
  68. package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
  69. package/cpp/RNSScreenRemovalListener.cpp +25 -0
  70. package/cpp/RNSScreenRemovalListener.h +20 -0
  71. package/ios/RNSConvert.h +1 -0
  72. package/ios/RNSModalScreen.mm +22 -0
  73. package/ios/RNSModule.mm +1 -1
  74. package/ios/RNSScreen.h +2 -1
  75. package/ios/RNSScreen.mm +27 -19
  76. package/ios/RNSScreenStack.mm +24 -77
  77. package/ios/RNSScreenStackAnimator.mm +43 -6
  78. package/ios/RNSScreenStackHeaderConfig.mm +49 -11
  79. package/ios/RNSScreenStackHeaderSubview.mm +8 -0
  80. package/ios/utils/UIView+RNSUtility.h +23 -0
  81. package/ios/utils/UIView+RNSUtility.mm +55 -0
  82. package/lib/commonjs/components/ScreenStack.js +8 -1
  83. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  84. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  85. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  86. package/lib/commonjs/native-stack/views/NativeStackView.js +2 -0
  87. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  88. package/lib/module/components/ScreenStack.js +8 -1
  89. package/lib/module/components/ScreenStack.js.map +1 -1
  90. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  91. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  92. package/lib/module/native-stack/views/NativeStackView.js +2 -0
  93. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  94. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  95. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +1 -0
  96. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  97. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +1 -0
  98. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  99. package/lib/typescript/native-stack/types.d.ts +10 -0
  100. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  101. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  102. package/lib/typescript/types.d.ts +10 -0
  103. package/lib/typescript/types.d.ts.map +1 -1
  104. package/native-stack/README.md +110 -99
  105. package/package.json +6 -3
  106. package/react-native.config.js +17 -15
  107. package/src/TransitionProgressContext.tsx +1 -1
  108. package/src/components/Screen.tsx +4 -4
  109. package/src/components/ScreenStack.tsx +11 -1
  110. package/src/components/ScreenStackHeaderConfig.tsx +5 -5
  111. package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
  112. package/src/components/SearchBar.tsx +4 -4
  113. package/src/core.ts +1 -1
  114. package/src/fabric/ModalScreenNativeComponent.ts +1 -0
  115. package/src/fabric/ScreenNativeComponent.ts +1 -0
  116. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
  117. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +1 -1
  118. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
  119. package/src/fabric/SearchBarNativeComponent.ts +1 -1
  120. package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
  121. package/src/gesture-handler/constraints.ts +5 -5
  122. package/src/gesture-handler/fabricUtils.ts +1 -1
  123. package/src/native-stack/contexts/GHContext.tsx +1 -1
  124. package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
  125. package/src/native-stack/types.tsx +14 -4
  126. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
  127. package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
  128. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
  129. package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
  130. package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
  131. package/src/native-stack/views/FontProcessor.tsx +1 -1
  132. package/src/native-stack/views/HeaderConfig.tsx +1 -1
  133. package/src/native-stack/views/NativeStackView.tsx +11 -9
  134. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
  135. package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
  136. package/src/reanimated/ReanimatedScreen.tsx +2 -2
  137. package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
  138. package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
  139. package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
  140. package/src/types.tsx +15 -5
  141. package/src/useTransitionProgress.tsx +1 -1
  142. 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>;
@@ -5,5 +5,5 @@ interface NativeProps extends ViewProps {}
5
5
 
6
6
  export default codegenNativeComponent<NativeProps>(
7
7
  'RNSScreenNavigationContainer',
8
- {}
8
+ {},
9
9
  );
@@ -50,5 +50,5 @@ export interface NativeProps extends ViewProps {
50
50
 
51
51
  export default codegenNativeComponent<NativeProps>(
52
52
  'RNSScreenStackHeaderConfig',
53
- {}
53
+ {},
54
54
  );
@@ -16,5 +16,5 @@ export interface NativeProps extends ViewProps {
16
16
 
17
17
  export default codegenNativeComponent<NativeProps>(
18
18
  'RNSScreenStackHeaderSubview',
19
- {}
19
+ {},
20
20
  );
@@ -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
 
@@ -35,7 +35,7 @@ export function useBackPressSubscription({
35
35
  subscription.current?.remove();
36
36
  subscription.current = BackHandler.addEventListener(
37
37
  'hardwareBackPress',
38
- onBackPress
38
+ onBackPress,
39
39
  );
40
40
  setIsActive(true);
41
41
  }
@@ -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]);
@@ -3,5 +3,5 @@ import * as React from 'react';
3
3
  import Animated from 'react-native-reanimated';
4
4
 
5
5
  export default React.createContext<Animated.SharedValue<number> | undefined>(
6
- undefined
6
+ undefined,
7
7
  );
@@ -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`.