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.
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 +214 -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
@@ -11,20 +11,22 @@ try {
11
11
  module.exports = {
12
12
  dependency: {
13
13
  platforms: {
14
- android: supportsCodegenConfig ? {
15
- componentDescriptors: [
16
- "RNSFullWindowOverlayComponentDescriptor",
17
- "RNSScreenContainerComponentDescriptor",
18
- "RNSScreenNavigationContainerComponentDescriptor",
19
- "RNSScreenStackHeaderConfigComponentDescriptor",
20
- "RNSScreenStackHeaderSubviewComponentDescriptor",
21
- "RNSScreenStackComponentDescriptor",
22
- "RNSSearchBarComponentDescriptor",
23
- 'RNSScreenComponentDescriptor',
24
- 'RNSModalScreenComponentDescriptor'
25
- ],
26
- cmakeListsPath: "../android/src/main/jni/CMakeLists.txt"
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
+ };
@@ -8,5 +8,5 @@ type TransitionProgressContextBody = {
8
8
  };
9
9
 
10
10
  export default React.createContext<TransitionProgressContextBody | undefined>(
11
- undefined
11
+ undefined,
12
12
  );
@@ -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 && size - index > 1}>
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>;
@@ -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
  );