@amazon-devices/react-native-screens 2.0.1759135970 → 3.0.9000000000

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 (672) hide show
  1. package/README.md +57 -18
  2. package/RNScreens.podspec +12 -30
  3. package/SystemBundles/31d5b6b69618249f6233b73a1de7c4d890c86be7ccb031ce7cf2dcc41783f9f7.bundle +45301 -0
  4. package/SystemBundles/31d5b6b69618249f6233b73a1de7c4d890c86be7ccb031ce7cf2dcc41783f9f7.map +13711 -0
  5. package/SystemModules/amzn__react-native-screens-3.modules.txt +158 -0
  6. package/SystemModules/amzn__react-native-screens-3.private.modules.txt +377 -0
  7. package/SystemModules/keplerscript-system-bundle-config.json +4 -4
  8. package/android/CMakeLists.txt +80 -0
  9. package/android/build.gradle +96 -17
  10. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +61 -0
  11. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +38 -25
  12. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
  13. package/android/src/main/cpp/NativeProxy.cpp +51 -0
  14. package/android/src/main/cpp/NativeProxy.h +35 -0
  15. package/android/src/main/cpp/OnLoad.cpp +8 -0
  16. package/android/src/main/cpp/jni-adapter.cpp +106 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +20 -10
  18. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +69 -1
  19. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +8 -8
  20. package/android/src/main/java/com/swmansion/rnscreens/InsetsObserverProxy.kt +104 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/ModalScreenViewManager.kt +12 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/NativeDismissalObserver.kt +12 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +65 -7
  24. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +327 -84
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +122 -72
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +27 -4
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapper.kt +38 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapperManager.kt +25 -0
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooter.kt +299 -0
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooterManager.kt +25 -0
  32. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +91 -67
  33. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +12 -1
  34. package/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +281 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +184 -81
  36. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +467 -80
  37. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +8 -1
  38. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +156 -124
  39. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigShadowNode.kt +25 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +159 -39
  41. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +24 -9
  42. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +19 -13
  43. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +31 -28
  44. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +276 -71
  45. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +124 -64
  46. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +127 -0
  47. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +4 -2
  48. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +160 -53
  49. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +57 -32
  50. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +15 -10
  51. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetBehaviorExt.kt +42 -0
  52. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogRootView.kt +104 -0
  53. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogScreen.kt +26 -0
  54. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingFragment.kt +493 -0
  55. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +66 -0
  56. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt +24 -0
  57. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/SheetUtils.kt +135 -0
  58. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +7 -8
  59. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +8 -9
  60. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +7 -8
  61. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +9 -10
  62. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
  63. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
  64. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
  65. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +13 -16
  66. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
  67. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
  68. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +8 -9
  69. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +8 -11
  70. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +7 -8
  71. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +8 -9
  72. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +7 -8
  73. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +12 -11
  74. package/android/src/main/java/com/swmansion/rnscreens/events/SheetDetentChangedEvent.kt +27 -0
  75. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
  76. package/android/src/main/java/com/swmansion/rnscreens/ext/NumericExt.kt +12 -0
  77. package/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +32 -0
  78. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
  79. package/android/src/main/java/com/swmansion/rnscreens/utils/PaddingBundle.kt +8 -0
  80. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +282 -0
  81. package/android/src/main/jni/CMakeLists.txt +35 -23
  82. package/android/src/main/jni/rnscreens.h +3 -0
  83. package/android/src/main/res/base/anim/rns_ios_from_left_background_close.xml +5 -0
  84. package/android/src/main/res/base/anim/rns_ios_from_left_background_open.xml +5 -0
  85. package/android/src/main/res/base/anim/rns_ios_from_left_foreground_close.xml +6 -0
  86. package/android/src/main/res/base/anim/rns_ios_from_left_foreground_open.xml +6 -0
  87. package/android/src/main/res/base/anim/rns_ios_from_right_background_close.xml +5 -0
  88. package/android/src/main/res/base/anim/rns_ios_from_right_background_open.xml +5 -0
  89. package/android/src/main/res/base/anim/rns_ios_from_right_foreground_close.xml +6 -0
  90. package/android/src/main/res/base/anim/rns_ios_from_right_foreground_open.xml +6 -0
  91. package/android/src/main/res/base/drawable/rns_rounder_top_corners_shape.xml +8 -0
  92. package/android/src/main/res/v33/anim-v33/rns_default_enter_in.xml +0 -1
  93. package/android/src/main/res/v33/anim-v33/rns_default_enter_out.xml +2 -2
  94. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +25 -0
  95. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +16 -0
  96. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +25 -0
  97. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +16 -0
  98. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +25 -0
  99. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +16 -0
  100. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +16 -3
  101. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +7 -2
  102. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +6 -0
  103. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +2 -0
  104. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +99 -0
  105. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +37 -0
  106. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +39 -0
  107. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +11 -2
  108. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
  109. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +36 -0
  110. package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
  111. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h +40 -0
  112. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +16 -0
  113. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +32 -0
  114. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +55 -12
  115. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +157 -0
  116. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +31 -11
  117. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h +49 -0
  118. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.cpp +22 -0
  119. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.h +40 -0
  120. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.cpp +34 -0
  121. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.h +57 -0
  122. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h +27 -0
  123. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.cpp +8 -0
  124. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.h +31 -0
  125. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.cpp +15 -0
  126. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.h +39 -0
  127. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +23 -2
  128. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +33 -8
  129. package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
  130. package/cpp/RNSScreenRemovalListener.cpp +25 -0
  131. package/cpp/RNSScreenRemovalListener.h +20 -0
  132. package/cpp/RNScreensTurboModule.cpp +115 -0
  133. package/cpp/RNScreensTurboModule.h +40 -0
  134. package/gesture-handler/package.json +6 -0
  135. package/ios/RNSConvert.h +24 -4
  136. package/ios/RNSConvert.mm +180 -55
  137. package/ios/RNSEnums.h +48 -0
  138. package/ios/RNSFullWindowOverlay.mm +12 -2
  139. package/ios/RNSModalScreen.h +8 -0
  140. package/ios/RNSModalScreen.mm +65 -0
  141. package/ios/RNSModule.h +19 -0
  142. package/ios/RNSModule.mm +173 -0
  143. package/ios/RNSPercentDrivenInteractiveTransition.h +12 -0
  144. package/ios/RNSPercentDrivenInteractiveTransition.mm +69 -0
  145. package/ios/RNSScreen.h +24 -5
  146. package/ios/RNSScreen.mm +652 -173
  147. package/ios/RNSScreenContainer.mm +12 -1
  148. package/ios/RNSScreenContentWrapper.h +44 -0
  149. package/ios/RNSScreenContentWrapper.mm +67 -0
  150. package/ios/RNSScreenFooter.h +30 -0
  151. package/ios/RNSScreenFooter.mm +142 -0
  152. package/ios/RNSScreenNavigationContainer.mm +7 -0
  153. package/ios/RNSScreenStack.h +6 -0
  154. package/ios/RNSScreenStack.mm +333 -109
  155. package/ios/RNSScreenStackAnimator.h +15 -1
  156. package/ios/RNSScreenStackAnimator.mm +380 -115
  157. package/ios/RNSScreenStackHeaderConfig.h +74 -6
  158. package/ios/RNSScreenStackHeaderConfig.mm +338 -69
  159. package/ios/RNSScreenStackHeaderSubview.h +0 -7
  160. package/ios/RNSScreenStackHeaderSubview.mm +61 -24
  161. package/ios/RNSScreenWindowTraits.h +1 -1
  162. package/ios/RNSScreenWindowTraits.mm +24 -50
  163. package/ios/RNSSearchBar.h +5 -5
  164. package/ios/RNSSearchBar.mm +42 -11
  165. package/ios/events/RNSHeaderHeightChangeEvent.h +0 -1
  166. package/ios/events/RNSHeaderHeightChangeEvent.mm +15 -0
  167. package/ios/events/RNSScreenViewEvent.h +0 -1
  168. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.h +15 -0
  169. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm +14 -0
  170. package/ios/utils/RCTTouchHandler+RNSUtility.h +15 -0
  171. package/ios/utils/RCTTouchHandler+RNSUtility.mm +15 -0
  172. package/ios/utils/RNSDefines.h +7 -0
  173. package/ios/utils/RNSUIBarButtonItem.h +2 -0
  174. package/ios/utils/UINavigationBar+RNSUtility.h +37 -0
  175. package/ios/utils/UINavigationBar+RNSUtility.mm +44 -0
  176. package/ios/utils/UIView+RNSUtility.h +23 -0
  177. package/ios/utils/UIView+RNSUtility.mm +54 -0
  178. package/kepler-compatibility.json +2 -2
  179. package/lib/commonjs/TransitionProgressContext.js +1 -0
  180. package/lib/commonjs/TransitionProgressContext.js.map +1 -1
  181. package/lib/commonjs/components/DebugContainer.js +39 -0
  182. package/lib/commonjs/components/DebugContainer.js.map +1 -0
  183. package/lib/commonjs/components/DebugContainer.web.js +15 -0
  184. package/lib/commonjs/components/DebugContainer.web.js.map +1 -0
  185. package/lib/commonjs/components/FullWindowOverlay.js +31 -0
  186. package/lib/commonjs/components/FullWindowOverlay.js.map +1 -0
  187. package/lib/commonjs/components/FullWindowOverlay.web.js +9 -0
  188. package/lib/commonjs/components/FullWindowOverlay.web.js.map +1 -0
  189. package/lib/commonjs/components/Screen.js +286 -0
  190. package/lib/commonjs/components/Screen.js.map +1 -0
  191. package/lib/commonjs/components/Screen.web.js +47 -0
  192. package/lib/commonjs/components/Screen.web.js.map +1 -0
  193. package/lib/commonjs/components/ScreenContainer.js +32 -0
  194. package/lib/commonjs/components/ScreenContainer.js.map +1 -0
  195. package/lib/commonjs/components/ScreenContainer.web.js +10 -0
  196. package/lib/commonjs/components/ScreenContainer.web.js.map +1 -0
  197. package/lib/commonjs/components/ScreenContentWrapper.js +17 -0
  198. package/lib/commonjs/components/ScreenContentWrapper.js.map +1 -0
  199. package/lib/commonjs/components/ScreenContentWrapper.web.js +10 -0
  200. package/lib/commonjs/components/ScreenContentWrapper.web.js.map +1 -0
  201. package/lib/commonjs/components/ScreenFooter.js +25 -0
  202. package/lib/commonjs/components/ScreenFooter.js.map +1 -0
  203. package/lib/commonjs/components/ScreenFooter.web.js +11 -0
  204. package/lib/commonjs/components/ScreenFooter.web.js.map +1 -0
  205. package/lib/commonjs/components/ScreenStack.js +67 -0
  206. package/lib/commonjs/components/ScreenStack.js.map +1 -0
  207. package/lib/commonjs/components/ScreenStack.web.js +10 -0
  208. package/lib/commonjs/components/ScreenStack.web.js.map +1 -0
  209. package/lib/commonjs/components/ScreenStackHeaderConfig.js +90 -0
  210. package/lib/commonjs/components/ScreenStackHeaderConfig.js.map +1 -0
  211. package/lib/commonjs/components/ScreenStackHeaderConfig.web.js +27 -0
  212. package/lib/commonjs/components/ScreenStackHeaderConfig.web.js.map +1 -0
  213. package/lib/commonjs/components/ScreenStackItem.js +107 -0
  214. package/lib/commonjs/components/ScreenStackItem.js.map +1 -0
  215. package/lib/commonjs/components/SearchBar.js +63 -0
  216. package/lib/commonjs/components/SearchBar.js.map +1 -0
  217. package/lib/commonjs/components/SearchBar.web.js +10 -0
  218. package/lib/commonjs/components/SearchBar.web.js.map +1 -0
  219. package/lib/commonjs/components/helpers/DelayedFreeze.js +31 -0
  220. package/lib/commonjs/components/helpers/DelayedFreeze.js.map +1 -0
  221. package/lib/commonjs/components/helpers/usePrevious.js +15 -0
  222. package/lib/commonjs/components/helpers/usePrevious.js.map +1 -0
  223. package/lib/commonjs/contexts.js +11 -0
  224. package/lib/commonjs/contexts.js.map +1 -0
  225. package/lib/commonjs/core.js +40 -0
  226. package/lib/commonjs/core.js.map +1 -0
  227. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +16 -1
  228. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
  229. package/lib/commonjs/fabric/ModalScreenNativeComponent.js +14 -0
  230. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -0
  231. package/lib/commonjs/fabric/NativeScreensModule.js +10 -0
  232. package/lib/commonjs/fabric/NativeScreensModule.js.map +1 -0
  233. package/lib/commonjs/fabric/NativeScreensModule.web.js +8 -0
  234. package/lib/commonjs/fabric/NativeScreensModule.web.js.map +1 -0
  235. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js +8 -11
  236. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js.map +1 -1
  237. package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js +18 -0
  238. package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
  239. package/lib/commonjs/fabric/ScreenFooterNativeComponent.js +10 -0
  240. package/lib/commonjs/fabric/ScreenFooterNativeComponent.js.map +1 -0
  241. package/lib/commonjs/fabric/ScreenNativeComponent.js +13 -15
  242. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  243. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js +2 -1
  244. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -1
  245. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +10 -9
  246. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  247. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +5 -2
  248. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  249. package/lib/commonjs/fabric/ScreenStackNativeComponent.js +8 -11
  250. package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -1
  251. package/lib/commonjs/fabric/SearchBarNativeComponent.js +4 -5
  252. package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -1
  253. package/lib/commonjs/gesture-handler/GestureDetectorProvider.js +19 -0
  254. package/lib/commonjs/gesture-handler/GestureDetectorProvider.js.map +1 -0
  255. package/lib/commonjs/gesture-handler/RNScreensTurboModule.js +8 -0
  256. package/lib/commonjs/gesture-handler/RNScreensTurboModule.js.map +1 -0
  257. package/lib/commonjs/gesture-handler/ScreenGestureDetector.js +201 -0
  258. package/lib/commonjs/gesture-handler/ScreenGestureDetector.js.map +1 -0
  259. package/lib/commonjs/gesture-handler/constraints.js +64 -0
  260. package/lib/commonjs/gesture-handler/constraints.js.map +1 -0
  261. package/lib/commonjs/gesture-handler/defaults.js +45 -0
  262. package/lib/commonjs/gesture-handler/defaults.js.map +1 -0
  263. package/lib/commonjs/gesture-handler/fabricUtils.js +66 -0
  264. package/lib/commonjs/gesture-handler/fabricUtils.js.map +1 -0
  265. package/lib/commonjs/gesture-handler/fabricUtils.web.js +17 -0
  266. package/lib/commonjs/gesture-handler/fabricUtils.web.js.map +1 -0
  267. package/lib/commonjs/gesture-handler/index.js +14 -0
  268. package/lib/commonjs/gesture-handler/index.js.map +1 -0
  269. package/lib/commonjs/index.js +157 -94
  270. package/lib/commonjs/index.js.map +1 -1
  271. package/lib/commonjs/native-stack/contexts/GHContext.js +12 -0
  272. package/lib/commonjs/native-stack/contexts/GHContext.js.map +1 -0
  273. package/lib/commonjs/native-stack/index.js.map +1 -1
  274. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +21 -20
  275. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  276. package/lib/commonjs/native-stack/types.js.map +1 -1
  277. package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -1
  278. package/lib/commonjs/native-stack/utils/HeaderHeightContext.js.map +1 -1
  279. package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js.map +1 -1
  280. package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js.map +1 -1
  281. package/lib/commonjs/native-stack/utils/getStatusBarHeight.js +22 -0
  282. package/lib/commonjs/native-stack/utils/getStatusBarHeight.js.map +1 -0
  283. package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -1
  284. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js +2 -4
  285. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js.map +1 -1
  286. package/lib/commonjs/native-stack/utils/useHeaderHeight.js.map +1 -1
  287. package/lib/commonjs/native-stack/views/FontProcessor.js +1 -3
  288. package/lib/commonjs/native-stack/views/FontProcessor.js.map +1 -1
  289. package/lib/commonjs/native-stack/views/FooterComponent.js +17 -0
  290. package/lib/commonjs/native-stack/views/FooterComponent.js.map +1 -0
  291. package/lib/commonjs/native-stack/views/HeaderConfig.js +21 -13
  292. package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
  293. package/lib/commonjs/native-stack/views/NativeStackView.js +118 -52
  294. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  295. package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js.map +1 -1
  296. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +15 -21
  297. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
  298. package/lib/commonjs/reanimated/ReanimatedScreen.js +2 -2
  299. package/lib/commonjs/reanimated/ReanimatedScreen.js.map +1 -1
  300. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js +8 -16
  301. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js.map +1 -1
  302. package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js.map +1 -1
  303. package/lib/commonjs/reanimated/index.js.map +1 -1
  304. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js +2 -2
  305. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js.map +1 -1
  306. package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js.map +1 -1
  307. package/lib/commonjs/types.js.map +1 -1
  308. package/lib/commonjs/useTransitionProgress.js.map +1 -1
  309. package/lib/commonjs/utils.js +28 -6
  310. package/lib/commonjs/utils.js.map +1 -1
  311. package/lib/module/TransitionProgressContext.js +2 -0
  312. package/lib/module/TransitionProgressContext.js.map +1 -1
  313. package/lib/module/components/DebugContainer.js +30 -0
  314. package/lib/module/components/DebugContainer.js.map +1 -0
  315. package/lib/module/components/DebugContainer.web.js +6 -0
  316. package/lib/module/components/DebugContainer.web.js.map +1 -0
  317. package/lib/module/components/FullWindowOverlay.js +24 -0
  318. package/lib/module/components/FullWindowOverlay.js.map +1 -0
  319. package/lib/module/components/FullWindowOverlay.web.js +3 -0
  320. package/lib/module/components/FullWindowOverlay.web.js.map +1 -0
  321. package/lib/module/components/Screen.js +282 -0
  322. package/lib/module/components/Screen.js.map +1 -0
  323. package/lib/module/components/Screen.web.js +40 -0
  324. package/lib/module/components/Screen.web.js.map +1 -0
  325. package/lib/module/components/ScreenContainer.js +26 -0
  326. package/lib/module/components/ScreenContainer.js.map +1 -0
  327. package/lib/module/components/ScreenContainer.web.js +4 -0
  328. package/lib/module/components/ScreenContainer.web.js.map +1 -0
  329. package/lib/module/components/ScreenContentWrapper.js +10 -0
  330. package/lib/module/components/ScreenContentWrapper.js.map +1 -0
  331. package/lib/module/components/ScreenContentWrapper.web.js +4 -0
  332. package/lib/module/components/ScreenContentWrapper.web.js.map +1 -0
  333. package/lib/module/components/ScreenFooter.js +18 -0
  334. package/lib/module/components/ScreenFooter.js.map +1 -0
  335. package/lib/module/components/ScreenFooter.web.js +6 -0
  336. package/lib/module/components/ScreenFooter.web.js.map +1 -0
  337. package/lib/module/components/ScreenStack.js +63 -0
  338. package/lib/module/components/ScreenStack.js.map +1 -0
  339. package/lib/module/components/ScreenStack.web.js +4 -0
  340. package/lib/module/components/ScreenStack.web.js.map +1 -0
  341. package/lib/module/components/ScreenStackHeaderConfig.js +81 -0
  342. package/lib/module/components/ScreenStackHeaderConfig.js.map +1 -0
  343. package/lib/module/components/ScreenStackHeaderConfig.web.js +14 -0
  344. package/lib/module/components/ScreenStackHeaderConfig.web.js.map +1 -0
  345. package/lib/module/components/ScreenStackItem.js +98 -0
  346. package/lib/module/components/ScreenStackItem.js.map +1 -0
  347. package/lib/module/components/SearchBar.js +57 -0
  348. package/lib/module/components/SearchBar.js.map +1 -0
  349. package/lib/module/components/SearchBar.web.js +4 -0
  350. package/lib/module/components/SearchBar.web.js.map +1 -0
  351. package/lib/module/components/helpers/DelayedFreeze.js +24 -0
  352. package/lib/module/components/helpers/DelayedFreeze.js.map +1 -0
  353. package/lib/module/components/helpers/usePrevious.js +9 -0
  354. package/lib/module/components/helpers/usePrevious.js.map +1 -0
  355. package/lib/module/contexts.js +4 -0
  356. package/lib/module/contexts.js.map +1 -0
  357. package/lib/module/core.js +31 -0
  358. package/lib/module/core.js.map +1 -0
  359. package/lib/module/fabric/FullWindowOverlayNativeComponent.js +16 -0
  360. package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
  361. package/lib/module/fabric/ModalScreenNativeComponent.js +10 -0
  362. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -0
  363. package/lib/module/fabric/NativeScreensModule.js +5 -0
  364. package/lib/module/fabric/NativeScreensModule.js.map +1 -0
  365. package/lib/module/fabric/NativeScreensModule.web.js +2 -0
  366. package/lib/module/fabric/NativeScreensModule.web.js.map +1 -0
  367. package/lib/module/fabric/ScreenContainerNativeComponent.js +3 -4
  368. package/lib/module/fabric/ScreenContainerNativeComponent.js.map +1 -1
  369. package/lib/module/fabric/ScreenContentWrapperNativeComponent.js +10 -0
  370. package/lib/module/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
  371. package/lib/module/fabric/ScreenFooterNativeComponent.js +3 -0
  372. package/lib/module/fabric/ScreenFooterNativeComponent.js.map +1 -0
  373. package/lib/module/fabric/ScreenNativeComponent.js +8 -7
  374. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  375. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js +2 -0
  376. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -1
  377. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +8 -2
  378. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  379. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +5 -1
  380. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  381. package/lib/module/fabric/ScreenStackNativeComponent.js +3 -3
  382. package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -1
  383. package/lib/module/fabric/SearchBarNativeComponent.js +3 -1
  384. package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -1
  385. package/lib/module/gesture-handler/GestureDetectorProvider.js +12 -0
  386. package/lib/module/gesture-handler/GestureDetectorProvider.js.map +1 -0
  387. package/lib/module/gesture-handler/RNScreensTurboModule.js +2 -0
  388. package/lib/module/gesture-handler/RNScreensTurboModule.js.map +1 -0
  389. package/lib/module/gesture-handler/ScreenGestureDetector.js +193 -0
  390. package/lib/module/gesture-handler/ScreenGestureDetector.js.map +1 -0
  391. package/lib/module/gesture-handler/constraints.js +56 -0
  392. package/lib/module/gesture-handler/constraints.js.map +1 -0
  393. package/lib/module/gesture-handler/defaults.js +39 -0
  394. package/lib/module/gesture-handler/defaults.js.map +1 -0
  395. package/lib/module/gesture-handler/fabricUtils.js +61 -0
  396. package/lib/module/gesture-handler/fabricUtils.js.map +1 -0
  397. package/lib/module/gesture-handler/fabricUtils.web.js +10 -0
  398. package/lib/module/gesture-handler/fabricUtils.web.js.map +1 -0
  399. package/lib/module/gesture-handler/index.js +5 -0
  400. package/lib/module/gesture-handler/index.js.map +1 -0
  401. package/lib/module/index.js +29 -64
  402. package/lib/module/index.js.map +1 -1
  403. package/lib/module/native-stack/contexts/GHContext.js +6 -0
  404. package/lib/module/native-stack/contexts/GHContext.js.map +1 -0
  405. package/lib/module/native-stack/index.js.map +1 -1
  406. package/lib/module/native-stack/navigators/createNativeStackNavigator.js +21 -20
  407. package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  408. package/lib/module/native-stack/types.js.map +1 -1
  409. package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -1
  410. package/lib/module/native-stack/utils/HeaderHeightContext.js.map +1 -1
  411. package/lib/module/native-stack/utils/SafeAreaProviderCompat.js.map +1 -1
  412. package/lib/module/native-stack/utils/getDefaultHeaderHeight.js.map +1 -1
  413. package/lib/module/native-stack/utils/getStatusBarHeight.js +16 -0
  414. package/lib/module/native-stack/utils/getStatusBarHeight.js.map +1 -0
  415. package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -1
  416. package/lib/module/native-stack/utils/useBackPressSubscription.js +2 -4
  417. package/lib/module/native-stack/utils/useBackPressSubscription.js.map +1 -1
  418. package/lib/module/native-stack/utils/useHeaderHeight.js.map +1 -1
  419. package/lib/module/native-stack/views/FontProcessor.js +2 -3
  420. package/lib/module/native-stack/views/FontProcessor.js.map +1 -1
  421. package/lib/module/native-stack/views/FooterComponent.js +10 -0
  422. package/lib/module/native-stack/views/FooterComponent.js.map +1 -0
  423. package/lib/module/native-stack/views/HeaderConfig.js +13 -6
  424. package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
  425. package/lib/module/native-stack/views/NativeStackView.js +114 -46
  426. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  427. package/lib/module/reanimated/ReanimatedHeaderHeightContext.js.map +1 -1
  428. package/lib/module/reanimated/ReanimatedNativeStackScreen.js +8 -12
  429. package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
  430. package/lib/module/reanimated/ReanimatedScreen.js +1 -2
  431. package/lib/module/reanimated/ReanimatedScreen.js.map +1 -1
  432. package/lib/module/reanimated/ReanimatedScreenProvider.js +7 -15
  433. package/lib/module/reanimated/ReanimatedScreenProvider.js.map +1 -1
  434. package/lib/module/reanimated/ReanimatedTransitionProgressContext.js.map +1 -1
  435. package/lib/module/reanimated/index.js.map +1 -1
  436. package/lib/module/reanimated/useReanimatedHeaderHeight.js +1 -1
  437. package/lib/module/reanimated/useReanimatedHeaderHeight.js.map +1 -1
  438. package/lib/module/reanimated/useReanimatedTransitionProgress.js.map +1 -1
  439. package/lib/module/types.js.map +1 -1
  440. package/lib/module/useTransitionProgress.js.map +1 -1
  441. package/lib/module/utils.js +26 -5
  442. package/lib/module/utils.js.map +1 -1
  443. package/lib/typescript/TransitionProgressContext.d.ts +2 -1
  444. package/lib/typescript/TransitionProgressContext.d.ts.map +1 -0
  445. package/lib/typescript/components/DebugContainer.d.ts +15 -0
  446. package/lib/typescript/components/DebugContainer.d.ts.map +1 -0
  447. package/lib/typescript/components/DebugContainer.web.d.ts +4 -0
  448. package/lib/typescript/components/DebugContainer.web.d.ts.map +1 -0
  449. package/lib/typescript/components/FullWindowOverlay.d.ts +6 -0
  450. package/lib/typescript/components/FullWindowOverlay.d.ts.map +1 -0
  451. package/lib/typescript/components/FullWindowOverlay.web.d.ts +6 -0
  452. package/lib/typescript/components/FullWindowOverlay.web.d.ts.map +1 -0
  453. package/lib/typescript/components/Screen.d.ts +8 -0
  454. package/lib/typescript/components/Screen.d.ts.map +1 -0
  455. package/lib/typescript/components/Screen.web.d.ts +11 -0
  456. package/lib/typescript/components/Screen.web.d.ts.map +1 -0
  457. package/lib/typescript/components/ScreenContainer.d.ts +5 -0
  458. package/lib/typescript/components/ScreenContainer.d.ts.map +1 -0
  459. package/lib/typescript/components/ScreenContainer.web.d.ts +4 -0
  460. package/lib/typescript/components/ScreenContainer.web.d.ts.map +1 -0
  461. package/lib/typescript/components/ScreenContentWrapper.d.ts +5 -0
  462. package/lib/typescript/components/ScreenContentWrapper.d.ts.map +1 -0
  463. package/lib/typescript/components/ScreenContentWrapper.web.d.ts +4 -0
  464. package/lib/typescript/components/ScreenContentWrapper.web.d.ts.map +1 -0
  465. package/lib/typescript/components/ScreenFooter.d.ts +12 -0
  466. package/lib/typescript/components/ScreenFooter.d.ts.map +1 -0
  467. package/lib/typescript/components/ScreenFooter.web.d.ts +6 -0
  468. package/lib/typescript/components/ScreenFooter.web.d.ts.map +1 -0
  469. package/lib/typescript/components/ScreenStack.d.ts +5 -0
  470. package/lib/typescript/components/ScreenStack.d.ts.map +1 -0
  471. package/lib/typescript/components/ScreenStack.web.d.ts +4 -0
  472. package/lib/typescript/components/ScreenStack.web.d.ts.map +1 -0
  473. package/lib/typescript/components/ScreenStackHeaderConfig.d.ts +13 -0
  474. package/lib/typescript/components/ScreenStackHeaderConfig.d.ts.map +1 -0
  475. package/lib/typescript/components/ScreenStackHeaderConfig.web.d.ts +13 -0
  476. package/lib/typescript/components/ScreenStackHeaderConfig.web.d.ts.map +1 -0
  477. package/lib/typescript/components/ScreenStackItem.d.ts +11 -0
  478. package/lib/typescript/components/ScreenStackItem.d.ts.map +1 -0
  479. package/lib/typescript/components/SearchBar.d.ts +5 -0
  480. package/lib/typescript/components/SearchBar.d.ts.map +1 -0
  481. package/lib/typescript/components/SearchBar.web.d.ts +4 -0
  482. package/lib/typescript/components/SearchBar.web.d.ts.map +1 -0
  483. package/lib/typescript/components/helpers/DelayedFreeze.d.ts +8 -0
  484. package/lib/typescript/components/helpers/DelayedFreeze.d.ts.map +1 -0
  485. package/lib/typescript/components/helpers/usePrevious.d.ts +2 -0
  486. package/lib/typescript/components/helpers/usePrevious.d.ts.map +1 -0
  487. package/lib/typescript/contexts.d.ts +5 -0
  488. package/lib/typescript/contexts.d.ts.map +1 -0
  489. package/lib/typescript/core.d.ts +6 -0
  490. package/lib/typescript/core.d.ts.map +1 -0
  491. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts +1 -1
  492. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts.map +1 -0
  493. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +76 -0
  494. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -0
  495. package/lib/typescript/fabric/NativeScreensModule.d.ts +6 -0
  496. package/lib/typescript/fabric/NativeScreensModule.d.ts.map +1 -0
  497. package/lib/typescript/fabric/NativeScreensModule.web.d.ts +3 -0
  498. package/lib/typescript/fabric/NativeScreensModule.web.d.ts.map +1 -0
  499. package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts +1 -0
  500. package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts.map +1 -0
  501. package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts +6 -0
  502. package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts.map +1 -0
  503. package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts +7 -0
  504. package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts.map +1 -0
  505. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +34 -24
  506. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -0
  507. package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts +1 -1
  508. package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts.map +1 -0
  509. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +12 -2
  510. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -0
  511. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -2
  512. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -0
  513. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +4 -2
  514. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -0
  515. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +17 -16
  516. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -0
  517. package/lib/typescript/gesture-handler/GestureDetectorProvider.d.ts +5 -0
  518. package/lib/typescript/gesture-handler/GestureDetectorProvider.d.ts.map +1 -0
  519. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts +13 -0
  520. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts.map +1 -0
  521. package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts +5 -0
  522. package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts.map +1 -0
  523. package/lib/typescript/gesture-handler/constraints.d.ts +6 -0
  524. package/lib/typescript/gesture-handler/constraints.d.ts.map +1 -0
  525. package/lib/typescript/gesture-handler/defaults.d.ts +20 -0
  526. package/lib/typescript/gesture-handler/defaults.d.ts.map +1 -0
  527. package/lib/typescript/gesture-handler/fabricUtils.d.ts +10 -0
  528. package/lib/typescript/gesture-handler/fabricUtils.d.ts.map +1 -0
  529. package/lib/typescript/gesture-handler/fabricUtils.web.d.ts +6 -0
  530. package/lib/typescript/gesture-handler/fabricUtils.web.d.ts.map +1 -0
  531. package/lib/typescript/gesture-handler/index.d.ts +2 -0
  532. package/lib/typescript/gesture-handler/index.d.ts.map +1 -0
  533. package/lib/typescript/index.d.ts +25 -31
  534. package/lib/typescript/index.d.ts.map +1 -0
  535. package/lib/typescript/native-stack/contexts/GHContext.d.ts +4 -0
  536. package/lib/typescript/native-stack/contexts/GHContext.d.ts.map +1 -0
  537. package/lib/typescript/native-stack/index.d.ts +1 -0
  538. package/lib/typescript/native-stack/index.d.ts.map +1 -0
  539. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +4 -0
  540. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts.map +1 -0
  541. package/lib/typescript/native-stack/types.d.ts +191 -33
  542. package/lib/typescript/native-stack/types.d.ts.map +1 -0
  543. package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts +1 -0
  544. package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts.map +1 -0
  545. package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts +1 -0
  546. package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts.map +1 -0
  547. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +2 -1
  548. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts.map +1 -0
  549. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +3 -2
  550. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts.map +1 -0
  551. package/lib/typescript/native-stack/utils/getStatusBarHeight.d.ts +3 -0
  552. package/lib/typescript/native-stack/utils/getStatusBarHeight.d.ts.map +1 -0
  553. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +2 -1
  554. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts.map +1 -0
  555. package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts +1 -0
  556. package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts.map +1 -0
  557. package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts +1 -0
  558. package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts.map +1 -0
  559. package/lib/typescript/native-stack/views/FontProcessor.d.ts +1 -0
  560. package/lib/typescript/native-stack/views/FontProcessor.d.ts.map +1 -0
  561. package/lib/typescript/native-stack/views/FooterComponent.d.ts +7 -0
  562. package/lib/typescript/native-stack/views/FooterComponent.d.ts.map +1 -0
  563. package/lib/typescript/native-stack/views/HeaderConfig.d.ts +3 -2
  564. package/lib/typescript/native-stack/views/HeaderConfig.d.ts.map +1 -0
  565. package/lib/typescript/native-stack/views/NativeStackView.d.ts +2 -1
  566. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -0
  567. package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts +1 -0
  568. package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts.map +1 -0
  569. package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts +3 -3
  570. package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts.map +1 -0
  571. package/lib/typescript/reanimated/ReanimatedScreen.d.ts +3 -3
  572. package/lib/typescript/reanimated/ReanimatedScreen.d.ts.map +1 -0
  573. package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts +1 -0
  574. package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts.map +1 -0
  575. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +2 -1
  576. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts.map +1 -0
  577. package/lib/typescript/reanimated/index.d.ts +1 -0
  578. package/lib/typescript/reanimated/index.d.ts.map +1 -0
  579. package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts +2 -3
  580. package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts.map +1 -0
  581. package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts +4 -9
  582. package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts.map +1 -0
  583. package/lib/typescript/types.d.ts +186 -36
  584. package/lib/typescript/types.d.ts.map +1 -0
  585. package/lib/typescript/useTransitionProgress.d.ts +4 -3
  586. package/lib/typescript/useTransitionProgress.d.ts.map +1 -0
  587. package/lib/typescript/utils.d.ts +27 -1
  588. package/lib/typescript/utils.d.ts.map +1 -0
  589. package/native-stack/README.md +156 -108
  590. package/native-stack/package.json +4 -4
  591. package/package.json +1 -1
  592. package/react-native.config.js +19 -16
  593. package/reanimated/package.json +1 -1
  594. package/src/TransitionProgressContext.tsx +3 -1
  595. package/src/components/DebugContainer.tsx +46 -0
  596. package/src/components/DebugContainer.web.tsx +7 -0
  597. package/src/components/FullWindowOverlay.tsx +33 -0
  598. package/src/components/FullWindowOverlay.web.tsx +6 -0
  599. package/src/components/Screen.tsx +392 -0
  600. package/src/components/Screen.web.tsx +46 -0
  601. package/src/components/ScreenContainer.tsx +28 -0
  602. package/src/components/ScreenContainer.web.tsx +5 -0
  603. package/src/components/ScreenContentWrapper.tsx +9 -0
  604. package/src/components/ScreenContentWrapper.web.tsx +5 -0
  605. package/src/components/ScreenFooter.tsx +20 -0
  606. package/src/components/ScreenFooter.web.tsx +7 -0
  607. package/src/components/ScreenStack.tsx +112 -0
  608. package/src/components/ScreenStack.web.tsx +5 -0
  609. package/src/components/ScreenStackHeaderConfig.tsx +122 -0
  610. package/src/components/ScreenStackHeaderConfig.web.tsx +39 -0
  611. package/src/components/ScreenStackItem.tsx +174 -0
  612. package/src/components/SearchBar.tsx +102 -0
  613. package/src/components/SearchBar.web.tsx +5 -0
  614. package/src/components/helpers/DelayedFreeze.tsx +27 -0
  615. package/src/components/helpers/usePrevious.tsx +11 -0
  616. package/src/contexts.tsx +9 -0
  617. package/src/core.ts +45 -0
  618. package/src/fabric/FullWindowOverlayNativeComponent.ts +16 -0
  619. package/src/fabric/ModalScreenNativeComponent.ts +115 -0
  620. package/src/fabric/NativeScreensModule.ts +8 -0
  621. package/src/fabric/NativeScreensModule.web.ts +1 -0
  622. package/src/fabric/ScreenContainerNativeComponent.ts +3 -3
  623. package/src/fabric/ScreenContentWrapperNativeComponent.ts +14 -0
  624. package/src/fabric/ScreenFooterNativeComponent.ts +6 -0
  625. package/src/fabric/ScreenNativeComponent.ts +34 -23
  626. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +3 -1
  627. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +38 -2
  628. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +5 -1
  629. package/src/fabric/ScreenStackNativeComponent.ts +3 -2
  630. package/src/fabric/SearchBarNativeComponent.ts +17 -13
  631. package/src/gesture-handler/GestureDetectorProvider.tsx +16 -0
  632. package/src/gesture-handler/RNScreensTurboModule.ts +13 -0
  633. package/src/gesture-handler/ScreenGestureDetector.tsx +241 -0
  634. package/src/gesture-handler/constraints.ts +87 -0
  635. package/src/gesture-handler/defaults.ts +46 -0
  636. package/src/gesture-handler/fabricUtils.ts +86 -0
  637. package/src/gesture-handler/fabricUtils.web.ts +10 -0
  638. package/src/gesture-handler/index.tsx +4 -0
  639. package/src/index.tsx +49 -113
  640. package/src/native-stack/contexts/GHContext.tsx +9 -0
  641. package/src/native-stack/navigators/createNativeStackNavigator.tsx +6 -3
  642. package/src/native-stack/types.tsx +204 -31
  643. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +2 -2
  644. package/src/native-stack/utils/getStatusBarHeight.tsx +22 -0
  645. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
  646. package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
  647. package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
  648. package/src/native-stack/views/FontProcessor.tsx +2 -2
  649. package/src/native-stack/views/FooterComponent.tsx +10 -0
  650. package/src/native-stack/views/HeaderConfig.tsx +20 -5
  651. package/src/native-stack/views/NativeStackView.tsx +137 -53
  652. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
  653. package/src/reanimated/ReanimatedNativeStackScreen.tsx +15 -13
  654. package/src/reanimated/ReanimatedScreen.tsx +4 -3
  655. package/src/reanimated/ReanimatedScreenProvider.tsx +3 -2
  656. package/src/reanimated/useReanimatedHeaderHeight.tsx +2 -2
  657. package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
  658. package/src/types.tsx +210 -40
  659. package/src/useTransitionProgress.tsx +1 -1
  660. package/src/utils.ts +27 -5
  661. package/windows/README.md +4 -1
  662. package/windows/RNScreens/Screen.h +3 -1
  663. package/SystemBundles/4a5c11b5bb8dfc0553e927a2c8678e1dbd4a75220fe24dfbdba59b5550215de6.bundle +0 -33681
  664. package/SystemBundles/4a5c11b5bb8dfc0553e927a2c8678e1dbd4a75220fe24dfbdba59b5550215de6.map +0 -1
  665. package/SystemModules/amzn__react-native-screens.modules.txt +0 -101
  666. package/SystemModules/amzn__react-native-screens.private.modules.txt +0 -244
  667. package/lib/commonjs/index.native.js +0 -409
  668. package/lib/commonjs/index.native.js.map +0 -1
  669. package/lib/module/index.native.js +0 -412
  670. package/lib/module/index.native.js.map +0 -1
  671. package/lib/typescript/index.native.d.ts +0 -2
  672. package/src/index.native.tsx +0 -601
package/ios/RNSScreen.mm CHANGED
@@ -2,12 +2,14 @@
2
2
 
3
3
  #import "RNSScreen.h"
4
4
  #import "RNSScreenContainer.h"
5
+ #import "RNSScreenContentWrapper.h"
5
6
  #import "RNSScreenWindowTraits.h"
6
7
 
7
8
  #ifdef RCT_NEW_ARCH_ENABLED
8
9
  #import <React/RCTConversions.h>
9
10
  #import <React/RCTFabricComponentsPlugins.h>
10
11
  #import <React/RCTRootComponentView.h>
12
+ #import <React/RCTScrollViewComponentView.h>
11
13
  #import <React/RCTSurfaceTouchHandler.h>
12
14
  #import <react/renderer/components/rnscreens/EventEmitters.h>
13
15
  #import <react/renderer/components/rnscreens/Props.h>
@@ -17,52 +19,82 @@
17
19
  #import "RNSHeaderHeightChangeEvent.h"
18
20
  #import "RNSScreenViewEvent.h"
19
21
  #else
22
+ #import <React/RCTScrollView.h>
20
23
  #import <React/RCTTouchHandler.h>
21
- #endif
24
+ #endif // RCT_NEW_ARCH_ENABLED
22
25
 
23
26
  #import <React/RCTShadowView.h>
24
27
  #import <React/RCTUIManager.h>
28
+ #import <React/RCTUIManagerUtils.h>
29
+
30
+ #import "RNSScreenFooter.h"
25
31
  #import "RNSScreenStack.h"
26
32
  #import "RNSScreenStackHeaderConfig.h"
27
33
 
34
+ #import "RNSDefines.h"
35
+ #import "UIView+RNSUtility.h"
36
+
28
37
  #ifdef RCT_NEW_ARCH_ENABLED
29
38
  namespace react = facebook::react;
39
+ #define ReactScrollViewBase RCTScrollViewComponentView
40
+ #else
41
+ #define ReactScrollViewBase RCTScrollView
30
42
  #endif // RCT_NEW_ARCH_ENABLED
31
43
 
32
- @interface RNSScreenView ()
44
+ constexpr NSInteger SHEET_FIT_TO_CONTENTS = -1;
45
+ constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
46
+
47
+ @interface RNSScreenView () <
48
+ UIAdaptivePresentationControllerDelegate,
49
+ RNSScreenContentWrapperDelegate,
50
+ #if !TARGET_OS_TV
51
+ UISheetPresentationControllerDelegate,
52
+ #endif
33
53
  #ifdef RCT_NEW_ARCH_ENABLED
34
- <RCTRNSScreenViewProtocol, UIAdaptivePresentationControllerDelegate>
54
+ RCTRNSScreenViewProtocol,
55
+ CAAnimationDelegate>
35
56
  #else
36
- <UIAdaptivePresentationControllerDelegate, RCTInvalidating>
57
+ RCTInvalidating>
37
58
  #endif
59
+
38
60
  @end
39
61
 
40
62
  @implementation RNSScreenView {
41
- __weak RCTBridge *_bridge;
63
+ __weak ReactScrollViewBase *_sheetsScrollView;
64
+ BOOL _didSetSheetAllowedDetentsOnController;
42
65
  #ifdef RCT_NEW_ARCH_ENABLED
43
66
  RCTSurfaceTouchHandler *_touchHandler;
44
67
  react::RNSScreenShadowNode::ConcreteState::Shared _state;
45
68
  // on fabric, they are not available by default so we need them exposed here too
46
69
  NSMutableArray<UIView *> *_reactSubviews;
70
+ __weak RNSScreenContentWrapper *_contentWrapper;
47
71
  #else
72
+ __weak RCTBridge *_bridge;
48
73
  RCTTouchHandler *_touchHandler;
49
74
  CGRect _reactFrame;
50
75
  #endif
51
76
  }
52
77
 
53
78
  #ifdef RCT_NEW_ARCH_ENABLED
79
+
80
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
81
+ + (void)load
82
+ {
83
+ [super load];
84
+ }
85
+
54
86
  - (instancetype)initWithFrame:(CGRect)frame
55
87
  {
56
88
  if (self = [super initWithFrame:frame]) {
57
89
  static const auto defaultProps = std::make_shared<const react::RNSScreenProps>();
58
90
  _props = defaultProps;
59
91
  _reactSubviews = [NSMutableArray new];
92
+ _contentWrapper = nil;
60
93
  [self initCommonProps];
61
94
  }
62
95
  return self;
63
96
  }
64
- #endif // RCT_NEW_ARCH_ENABLED
65
-
97
+ #else
66
98
  - (instancetype)initWithBridge:(RCTBridge *)bridge
67
99
  {
68
100
  if (self = [super init]) {
@@ -72,6 +104,7 @@ namespace react = facebook::react;
72
104
 
73
105
  return self;
74
106
  }
107
+ #endif // RCT_NEW_ARCH_ENABLED
75
108
 
76
109
  - (void)initCommonProps
77
110
  {
@@ -86,9 +119,16 @@ namespace react = facebook::react;
86
119
  _hasStatusBarHiddenSet = NO;
87
120
  _hasOrientationSet = NO;
88
121
  _hasHomeIndicatorHiddenSet = NO;
122
+ _activityState = RNSActivityStateUndefined;
123
+ _fullScreenSwipeShadowEnabled = YES;
89
124
  #if !TARGET_OS_TV
90
125
  _sheetExpandsWhenScrolledToEdge = YES;
91
126
  #endif // !TARGET_OS_TV
127
+ _sheetsScrollView = nil;
128
+ _didSetSheetAllowedDetentsOnController = NO;
129
+ #ifdef RCT_NEW_ARCH_ENABLED
130
+ _markedForUnmountInCurrentTransaction = NO;
131
+ #endif // RCT_NEW_ARCH_ENABLED
92
132
  }
93
133
 
94
134
  - (UIViewController *)reactViewController
@@ -97,24 +137,73 @@ namespace react = facebook::react;
97
137
  }
98
138
 
99
139
  #ifdef RCT_NEW_ARCH_ENABLED
140
+ RNS_IGNORE_SUPER_CALL_BEGIN
100
141
  - (NSArray<UIView *> *)reactSubviews
101
142
  {
102
143
  return _reactSubviews;
103
144
  }
145
+ RNS_IGNORE_SUPER_CALL_END
104
146
  #endif
105
147
 
106
148
  - (void)updateBounds
107
149
  {
108
150
  #ifdef RCT_NEW_ARCH_ENABLED
109
151
  if (_state != nullptr) {
110
- auto newState = react::RNSScreenState{RCTSizeFromCGSize(self.bounds.size)};
152
+ RNSScreenStackHeaderConfig *config = [self findHeaderConfig];
153
+ // in large title, ScrollView handles the offset of content so we cannot set it here also.
154
+ CGFloat headerHeight =
155
+ config.largeTitle ? 0 : [_controller calculateHeaderHeightIsModal:self.isPresentedAsNativeModal];
156
+ auto newState =
157
+ react::RNSScreenState{RCTSizeFromCGSize(self.bounds.size), RCTPointFromCGPoint(CGPointMake(0, headerHeight))};
111
158
  _state->updateState(std::move(newState));
112
159
  UINavigationController *navctr = _controller.navigationController;
113
160
  [navctr.view setNeedsLayout];
114
161
  }
115
162
  #else
116
163
  [_bridge.uiManager setSize:self.bounds.size forView:self];
117
- #endif
164
+ #endif // RCT_NEW_ARCH_ENABLED
165
+
166
+ if (_stackPresentation != RNSScreenStackPresentationFormSheet) {
167
+ return;
168
+ }
169
+
170
+ // In case of formSheet stack presentation, to mitigate view flickering
171
+ // (see PR with description of this problem: https://github.com/software-mansion/react-native-screens/pull/1870)
172
+ // we do not set `bottom: 0` in JS for wrapper of the screen content, causing React to not set
173
+ // strict frame every time the sheet size is updated by the code above. This approach leads however to
174
+ // situation where (if present) scrollview does not know its view port size resulting in buggy behaviour.
175
+ // That's exactly the issue we are handling below. We look for a scroll view down the view hierarchy (only going
176
+ // through first subviews, as the OS does something similar e.g. when looking for scrollview for large header
177
+ // interaction) and we set its frame to the sheet size. **This is not perfect**, as the content might jump when items
178
+ // are added/removed to/from the scroll view, but it's the best we got rn. See
179
+ // https://github.com/software-mansion/react-native-screens/pull/1852
180
+
181
+ // TODO: Consider adding a prop to control whether we want to look for a scroll view here.
182
+ // It might be necessary in case someone doesn't want its scroll view to span over whole
183
+ // height of the sheet.
184
+ ReactScrollViewBase *scrollView = [self findDirectLineDescendantReactScrollView];
185
+ if (_sheetsScrollView != scrollView) {
186
+ [_sheetsScrollView removeObserver:self forKeyPath:@"bounds" context:nil];
187
+ _sheetsScrollView = scrollView;
188
+
189
+ // We pass 0 as options, as we are not interested in receiving updated bounds value,
190
+ // we are going to overwrite it anyway.
191
+ [scrollView addObserver:self forKeyPath:@"bounds" options:0 context:nil];
192
+ }
193
+ if (scrollView != nil) {
194
+ [scrollView setFrame:self.frame];
195
+ }
196
+ }
197
+
198
+ - (void)observeValueForKeyPath:(NSString *)keyPath
199
+ ofObject:(id)object
200
+ change:(NSDictionary<NSKeyValueChangeKey, id> *)change
201
+ context:(void *)context
202
+ {
203
+ UIView *scrollview = (UIView *)object;
204
+ if (!CGRectEqualToRect(scrollview.frame, self.frame)) {
205
+ [scrollview setFrame:self.frame];
206
+ }
118
207
  }
119
208
 
120
209
  - (void)setStackPresentation:(RNSScreenStackPresentation)stackPresentation
@@ -166,12 +255,10 @@ namespace react = facebook::react;
166
255
  _controller.presentationController.delegate = self;
167
256
  } else if (_stackPresentation != RNSScreenStackPresentationPush) {
168
257
  #ifdef RCT_NEW_ARCH_ENABLED
169
- // TODO: on Fabric, same controllers can be used as modals and then recycled and used a push which would result in
170
- // this error. It would be good to check if it doesn't leak in such case.
171
258
  #else
172
259
  RCTLogError(
173
260
  @"Screen presentation updated from modal to push, this may likely result in a screen object leakage. If you need to change presentation style create a new screen object instead");
174
- #endif
261
+ #endif // RCT_NEW_ARCH_ENABLED
175
262
  }
176
263
  _stackPresentation = stackPresentation;
177
264
  }
@@ -194,6 +281,7 @@ namespace react = facebook::react;
194
281
  case RNSScreenStackAnimationSimplePush:
195
282
  case RNSScreenStackAnimationSlideFromBottom:
196
283
  case RNSScreenStackAnimationFadeFromBottom:
284
+ case RNSScreenStackAnimationSlideFromLeft:
197
285
  // Default
198
286
  break;
199
287
  }
@@ -224,12 +312,26 @@ namespace react = facebook::react;
224
312
  {
225
313
  int activityState = [activityStateOrNil intValue];
226
314
  if (activityStateOrNil != nil && activityState != -1 && activityState != _activityState) {
315
+ [self maybeAssertActivityStateProgressionOldValue:_activityState newValue:activityState];
227
316
  _activityState = activityState;
228
317
  [_reactSuperview markChildUpdated];
229
318
  }
230
319
  }
231
320
 
232
- #if !TARGET_OS_TV
321
+ - (void)maybeAssertActivityStateProgressionOldValue:(int)oldValue newValue:(int)newValue
322
+ {
323
+ if (self.isNativeStackScreen && newValue < oldValue) {
324
+ RCTLogError(@"[RNScreens] activityState can only progress in NativeStack");
325
+ }
326
+ }
327
+
328
+ /// Note that this method works only after the screen is actually mounted under a screen stack view.
329
+ - (BOOL)isNativeStackScreen
330
+ {
331
+ return [_reactSuperview isKindOfClass:RNSScreenStackView.class];
332
+ }
333
+
334
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
233
335
  - (void)setStatusBarStyle:(RNSStatusBarStyle)statusBarStyle
234
336
  {
235
337
  _hasStatusBarStyleSet = YES;
@@ -251,6 +353,13 @@ namespace react = facebook::react;
251
353
  _statusBarHidden = statusBarHidden;
252
354
  [RNSScreenWindowTraits assertViewControllerBasedStatusBarAppearenceSet];
253
355
  [RNSScreenWindowTraits updateStatusBarAppearance];
356
+
357
+ // As the status bar could change its visibility, we need to calculate header
358
+ // height for the correct value in `onHeaderHeightChange` event when navigation
359
+ // bar is not visible.
360
+ if (self.controller.navigationController.navigationBarHidden && !self.isModal) {
361
+ [self.controller calculateAndNotifyHeaderHeightChangeIsModal:NO];
362
+ }
254
363
  }
255
364
 
256
365
  - (void)setScreenOrientation:(UIInterfaceOrientationMask)screenOrientation
@@ -268,13 +377,48 @@ namespace react = facebook::react;
268
377
  }
269
378
  #endif
270
379
 
380
+ RNS_IGNORE_SUPER_CALL_BEGIN
271
381
  - (UIView *)reactSuperview
272
382
  {
273
383
  return _reactSuperview;
274
384
  }
385
+ RNS_IGNORE_SUPER_CALL_END
386
+
387
+ /// This is RNSScreenContentWrapperDelegate method, where we do get notified when React did update frame of our child.
388
+ - (void)reactDidSetFrame:(CGRect)reactFrame forContentWrapper:(RNSScreenContentWrapper *)contentWrapepr
389
+ {
390
+ if (self.stackPresentation != RNSScreenStackPresentationFormSheet || _didSetSheetAllowedDetentsOnController == YES) {
391
+ return;
392
+ }
393
+
394
+ _didSetSheetAllowedDetentsOnController = YES;
395
+
396
+ #if !TARGET_OS_TV && !TARGET_OS_VISION && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
397
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
398
+ if (@available(iOS 16.0, *)) {
399
+ UISheetPresentationController *sheetController = _controller.sheetPresentationController;
400
+ if (sheetController == nil) {
401
+ RCTLogError(@"[RNScreens] sheetPresentationController is null when attempting to set allowed detents");
402
+ return;
403
+ }
404
+
405
+ if (_sheetAllowedDetents.count > 0 && _sheetAllowedDetents[0].intValue == SHEET_FIT_TO_CONTENTS) {
406
+ auto detents = [self detentsFromMaxHeights:@[ [NSNumber numberWithFloat:reactFrame.size.height] ]];
407
+ [self setAllowedDetentsForSheet:sheetController to:detents animate:YES];
408
+ }
409
+ }
410
+ #endif // Check for iOS >= 16 && !TARGET_OS_TV
411
+ }
275
412
 
276
413
  - (void)addSubview:(UIView *)view
277
414
  {
415
+ /// This system method is called on Paper only. Fabric uses `-[insertSubview:atIndex:]`.
416
+ if ([view isKindOfClass:RNSScreenContentWrapper.class] &&
417
+ self.stackPresentation == RNSScreenStackPresentationFormSheet) {
418
+ auto contentWrapper = (RNSScreenContentWrapper *)view;
419
+ contentWrapper.delegate = self;
420
+ }
421
+
278
422
  if (![view isKindOfClass:[RNSScreenStackHeaderConfig class]]) {
279
423
  [super addSubview:view];
280
424
  } else {
@@ -286,7 +430,6 @@ namespace react = facebook::react;
286
430
  {
287
431
  #ifdef RCT_NEW_ARCH_ENABLED
288
432
  // If screen is already unmounted then there will be no event emitter
289
- // it will be cleaned in prepareForRecycle
290
433
  if (_eventEmitter != nullptr) {
291
434
  std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
292
435
  ->onDismissed(react::RNSScreenEventEmitter::OnDismissed{.dismissCount = dismissCount});
@@ -308,7 +451,6 @@ namespace react = facebook::react;
308
451
  {
309
452
  #ifdef RCT_NEW_ARCH_ENABLED
310
453
  // If screen is already unmounted then there will be no event emitter
311
- // it will be cleaned in prepareForRecycle
312
454
  if (_eventEmitter != nullptr) {
313
455
  std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
314
456
  ->onNativeDismissCancelled(
@@ -325,7 +467,6 @@ namespace react = facebook::react;
325
467
  {
326
468
  #ifdef RCT_NEW_ARCH_ENABLED
327
469
  // If screen is already unmounted then there will be no event emitter
328
- // it will be cleaned in prepareForRecycle
329
470
  if (_eventEmitter != nullptr) {
330
471
  std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
331
472
  ->onWillAppear(react::RNSScreenEventEmitter::OnWillAppear{});
@@ -348,7 +489,6 @@ namespace react = facebook::react;
348
489
  }
349
490
  #ifdef RCT_NEW_ARCH_ENABLED
350
491
  // If screen is already unmounted then there will be no event emitter
351
- // it will be cleaned in prepareForRecycle
352
492
  if (_eventEmitter != nullptr) {
353
493
  std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
354
494
  ->onWillDisappear(react::RNSScreenEventEmitter::OnWillDisappear{});
@@ -364,7 +504,6 @@ namespace react = facebook::react;
364
504
  {
365
505
  #ifdef RCT_NEW_ARCH_ENABLED
366
506
  // If screen is already unmounted then there will be no event emitter
367
- // it will be cleaned in prepareForRecycle
368
507
  if (_eventEmitter != nullptr) {
369
508
  std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
370
509
  ->onAppear(react::RNSScreenEventEmitter::OnAppear{});
@@ -384,7 +523,6 @@ namespace react = facebook::react;
384
523
  {
385
524
  #ifdef RCT_NEW_ARCH_ENABLED
386
525
  // If screen is already unmounted then there will be no event emitter
387
- // it will be cleaned in prepareForRecycle
388
526
  if (_eventEmitter != nullptr) {
389
527
  std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
390
528
  ->onDisappear(react::RNSScreenEventEmitter::OnDisappear{});
@@ -396,20 +534,38 @@ namespace react = facebook::react;
396
534
  #endif
397
535
  }
398
536
 
537
+ - (void)notifySheetDetentChangeToIndex:(NSInteger)newDetentIndex isStable:(BOOL)isStable
538
+ {
539
+ #ifdef RCT_NEW_ARCH_ENABLED
540
+ if (_eventEmitter != nullptr) {
541
+ int index = newDetentIndex;
542
+ std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
543
+ ->onSheetDetentChanged(
544
+ react::RNSScreenEventEmitter::OnSheetDetentChanged{.index = index, .isStable = isStable});
545
+ }
546
+ #else
547
+ if (self.onSheetDetentChanged) {
548
+ self.onSheetDetentChanged(@{
549
+ @"index" : @(newDetentIndex),
550
+ @"isStable" : @(YES),
551
+ });
552
+ }
553
+ #endif
554
+ }
555
+
399
556
  - (void)notifyHeaderHeightChange:(double)headerHeight
400
557
  {
401
558
  #ifdef RCT_NEW_ARCH_ENABLED
402
559
  if (_eventEmitter != nullptr) {
403
- std::dynamic_pointer_cast<const facebook::react::RNSScreenEventEmitter>(_eventEmitter)
404
- ->onHeaderHeightChange(
405
- facebook::react::RNSScreenEventEmitter::OnHeaderHeightChange{.headerHeight = headerHeight});
560
+ std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
561
+ ->onHeaderHeightChange(react::RNSScreenEventEmitter::OnHeaderHeightChange{.headerHeight = headerHeight});
406
562
  }
407
563
 
408
564
  RNSHeaderHeightChangeEvent *event =
409
565
  [[RNSHeaderHeightChangeEvent alloc] initWithEventName:@"onHeaderHeightChange"
410
566
  reactTag:[NSNumber numberWithInt:self.tag]
411
567
  headerHeight:headerHeight];
412
- [[RCTBridge currentBridge].eventDispatcher sendEvent:event];
568
+ [self postNotificationForEventDispatcherObserversWithEvent:event];
413
569
  #else
414
570
  if (self.onHeaderHeightChange) {
415
571
  self.onHeaderHeightChange(@{
@@ -468,22 +624,13 @@ namespace react = facebook::react;
468
624
  }
469
625
  }
470
626
 
471
- #ifdef RCT_NEW_ARCH_ENABLED
472
- - (RCTSurfaceTouchHandler *)touchHandler
473
- #else
474
- - (RCTTouchHandler *)touchHandler
475
- #endif
627
+ - (nullable RNS_TOUCH_HANDLER_ARCH_TYPE *)touchHandler
476
628
  {
477
629
  if (_touchHandler != nil) {
478
630
  return _touchHandler;
479
631
  }
480
- UIView *parent = [self superview];
481
- while (parent != nil && ![parent respondsToSelector:@selector(touchHandler)])
482
- parent = parent.superview;
483
- if (parent != nil) {
484
- return [parent performSelector:@selector(touchHandler)];
485
- }
486
- return nil;
632
+
633
+ return [self rnscreens_findTouchHandlerInAncestorChain];
487
634
  }
488
635
 
489
636
  - (void)notifyFinishTransitioning
@@ -504,7 +651,7 @@ namespace react = facebook::react;
504
651
  progress:progress
505
652
  closing:closing
506
653
  goingForward:goingForward];
507
- [[RCTBridge currentBridge].eventDispatcher sendEvent:event];
654
+ [self postNotificationForEventDispatcherObserversWithEvent:event];
508
655
  #else
509
656
  if (self.onTransitionProgress) {
510
657
  self.onTransitionProgress(@{
@@ -540,12 +687,24 @@ namespace react = facebook::react;
540
687
  - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presentationController
541
688
  {
542
689
  if (_preventNativeDismiss) {
543
- [self notifyDismissCancelledWithDismissCount:1];
544
690
  return NO;
545
691
  }
546
692
  return _gestureEnabled;
547
693
  }
548
694
 
695
+ #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
696
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
697
+ - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)presentationController
698
+ {
699
+ // NOTE(kkafar): We should consider depracating the use of gesture cancel here & align
700
+ // with usePreventRemove API of react-navigation v7.
701
+ [self notifyGestureCancel];
702
+ if (_preventNativeDismiss) {
703
+ [self notifyDismissCancelledWithDismissCount:1];
704
+ }
705
+ }
706
+ #endif
707
+
549
708
  - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
550
709
  {
551
710
  if ([_reactSuperview respondsToSelector:@selector(presentationControllerDidDismiss:)]) {
@@ -553,13 +712,32 @@ namespace react = facebook::react;
553
712
  }
554
713
  }
555
714
 
556
- - (RNSScreenStackHeaderConfig *_Nullable)findHeaderConfig
715
+ - (nullable RNSScreenStackHeaderConfig *)findHeaderConfig
557
716
  {
717
+ // Fast path
718
+ if ([self.reactSubviews.lastObject isKindOfClass:RNSScreenStackHeaderConfig.class]) {
719
+ return (RNSScreenStackHeaderConfig *)self.reactSubviews.lastObject;
720
+ }
721
+
558
722
  for (UIView *view in self.reactSubviews) {
559
723
  if ([view isKindOfClass:RNSScreenStackHeaderConfig.class]) {
560
724
  return (RNSScreenStackHeaderConfig *)view;
561
725
  }
562
726
  }
727
+
728
+ return nil;
729
+ }
730
+
731
+ /// Looks for RCTScrollView in direct line - goes through the subviews at index 0 down the view hierarchy.
732
+ - (nullable ReactScrollViewBase *)findDirectLineDescendantReactScrollView
733
+ {
734
+ UIView *firstSubview = self;
735
+ while (firstSubview.subviews.count > 0) {
736
+ firstSubview = firstSubview.subviews[0];
737
+ if ([firstSubview isKindOfClass:ReactScrollViewBase.class]) {
738
+ return (ReactScrollViewBase *)firstSubview;
739
+ }
740
+ }
563
741
  return nil;
564
742
  }
565
743
 
@@ -591,75 +769,361 @@ namespace react = facebook::react;
591
769
  self.controller.modalPresentationStyle == UIModalPresentationOverCurrentContext;
592
770
  }
593
771
 
594
- #if !TARGET_OS_TV
772
+ - (void)invalidate
773
+ {
774
+ _controller = nil;
775
+ [_sheetsScrollView removeObserver:self forKeyPath:@"bounds" context:nil];
776
+ }
777
+
778
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
779
+
780
+ - (void)setPropertyForSheet:(UISheetPresentationController *)sheet
781
+ withBlock:(void (^)(void))block
782
+ animate:(BOOL)animate API_AVAILABLE(ios(15.0))
783
+ {
784
+ if (animate) {
785
+ [sheet animateChanges:block];
786
+ } else {
787
+ block();
788
+ }
789
+ }
790
+
791
+ - (void)setAllowedDetentsForSheet:(UISheetPresentationController *)sheet
792
+ to:(NSArray<UISheetPresentationControllerDetent *> *)detents
793
+ animate:(BOOL)animate API_AVAILABLE(ios(15.0))
794
+ {
795
+ [self setPropertyForSheet:sheet
796
+ withBlock:^{
797
+ sheet.detents = detents;
798
+ }
799
+ animate:animate];
800
+ }
801
+
802
+ - (void)setSelectedDetentForSheet:(UISheetPresentationController *)sheet
803
+ to:(UISheetPresentationControllerDetentIdentifier)detent
804
+ animate:(BOOL)animate API_AVAILABLE(ios(15.0))
805
+ {
806
+ if (sheet.selectedDetentIdentifier != detent) {
807
+ [self setPropertyForSheet:sheet
808
+ withBlock:^{
809
+ sheet.selectedDetentIdentifier = detent;
810
+ }
811
+ animate:animate];
812
+ }
813
+ }
814
+
815
+ - (void)setCornerRadiusForSheet:(UISheetPresentationController *)sheet
816
+ to:(CGFloat)radius
817
+ animate:(BOOL)animate API_AVAILABLE(ios(15.0))
818
+ {
819
+ if (sheet.preferredCornerRadius != radius) {
820
+ [self setPropertyForSheet:sheet
821
+ withBlock:^{
822
+ sheet.preferredCornerRadius =
823
+ radius < 0 ? UISheetPresentationControllerAutomaticDimension : radius;
824
+ }
825
+ animate:animate];
826
+ }
827
+ }
828
+
829
+ - (void)setGrabberVisibleForSheet:(UISheetPresentationController *)sheet
830
+ to:(BOOL)visible
831
+ animate:(BOOL)animate API_AVAILABLE(ios(15.0))
832
+ {
833
+ if (sheet.prefersGrabberVisible != visible) {
834
+ [self setPropertyForSheet:sheet
835
+ withBlock:^{
836
+ sheet.prefersGrabberVisible = visible;
837
+ }
838
+ animate:animate];
839
+ }
840
+ }
841
+
842
+ - (void)setLargestUndimmedDetentForSheet:(UISheetPresentationController *)sheet
843
+ to:(UISheetPresentationControllerDetentIdentifier)detent
844
+ animate:(BOOL)animate API_AVAILABLE(ios(15.0))
845
+ {
846
+ if (sheet.largestUndimmedDetentIdentifier != detent) {
847
+ [self setPropertyForSheet:sheet
848
+ withBlock:^{
849
+ sheet.largestUndimmedDetentIdentifier = detent;
850
+ }
851
+ animate:animate];
852
+ }
853
+ }
854
+
855
+ #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_15_0) && \
856
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0
857
+ - (NSInteger)detentIndexFromDetentIdentifier:(UISheetPresentationControllerDetentIdentifier)identifier
858
+ API_AVAILABLE(ios(15.0))
859
+ {
860
+ // We first check if we are running on iOS 16+ as the API is different
861
+ #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
862
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
863
+ if (_sheetAllowedDetents.count > 0) {
864
+ // We should be running on custom detents in this case, thus identifier should be a stringified number.
865
+ return identifier.integerValue;
866
+ } else
867
+ #endif // iOS 16 check
868
+ {
869
+ // We're using system defined identifiers.
870
+ if (_sheetAllowedDetents.count >= 2 || _sheetAllowedDetents.count == 0) {
871
+ if (identifier == UISheetPresentationControllerDetentIdentifierMedium) {
872
+ return 0;
873
+ } else if (identifier == UISheetPresentationControllerDetentIdentifierLarge) {
874
+ return 1;
875
+ } else {
876
+ RCTLogError(@"[RNScreens] Unexpected detent identifier %@", identifier);
877
+ }
878
+ } else {
879
+ // There is only single option.
880
+ return 0;
881
+ }
882
+ }
883
+ return 0;
884
+ }
885
+
886
+ - (void)sheetPresentationControllerDidChangeSelectedDetentIdentifier:
887
+ (UISheetPresentationController *)sheetPresentationController API_AVAILABLE(ios(15.0))
888
+ {
889
+ UISheetPresentationControllerDetentIdentifier ident = sheetPresentationController.selectedDetentIdentifier;
890
+ [self notifySheetDetentChangeToIndex:[self detentIndexFromDetentIdentifier:ident] isStable:YES];
891
+ }
892
+ #endif // iOS 15 check
893
+
595
894
  /**
596
895
  * Updates settings for sheet presentation controller.
597
896
  * Note that this method should not be called inside `stackPresentation` setter, because on Paper we don't have
598
- * guarantee that values of all related props had been updated earlier.
897
+ * guarantee that values of all related props had been updated earlier. It should be invoked from `didSetProps`.
898
+ * On Fabric we have control over prop-setting process but it might be reasonable to run it from `finalizeUpdates`.
599
899
  */
600
- - (void)updatePresentationStyle
900
+ - (void)updateFormSheetPresentationStyle
601
901
  {
902
+ if (_stackPresentation != RNSScreenStackPresentationFormSheet) {
903
+ return;
904
+ }
602
905
  #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_15_0) && \
603
906
  __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0
907
+ int firstDimmedDetentIndex = _sheetAllowedDetents.count;
908
+
909
+ // Whether we use system (iOS 15) detents or custom (iOS 16+).
910
+ // Custom detents are in use if we are on iOS 16+ and we have at least single detent
911
+ // defined in the detents array. In any other case we do use system defined detents.
912
+ bool systemDetentsInUse = false;
913
+
604
914
  if (@available(iOS 15.0, *)) {
605
915
  UISheetPresentationController *sheet = _controller.sheetPresentationController;
606
- if (_stackPresentation == RNSScreenStackPresentationFormSheet && sheet != nil) {
607
- sheet.prefersScrollingExpandsWhenScrolledToEdge = _sheetExpandsWhenScrolledToEdge;
608
- sheet.prefersGrabberVisible = _sheetGrabberVisible;
609
- sheet.preferredCornerRadius =
610
- _sheetCornerRadius < 0 ? UISheetPresentationControllerAutomaticDimension : _sheetCornerRadius;
611
-
612
- if (_sheetLargestUndimmedDetent == RNSScreenDetentTypeMedium) {
613
- sheet.largestUndimmedDetentIdentifier = UISheetPresentationControllerDetentIdentifierMedium;
614
- } else if (_sheetLargestUndimmedDetent == RNSScreenDetentTypeLarge) {
615
- sheet.largestUndimmedDetentIdentifier = UISheetPresentationControllerDetentIdentifierLarge;
616
- } else if (_sheetLargestUndimmedDetent == RNSScreenDetentTypeAll) {
617
- sheet.largestUndimmedDetentIdentifier = nil;
916
+ if (sheet == nil) {
917
+ return;
918
+ }
919
+ sheet.delegate = self;
920
+ #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
921
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
922
+ if (@available(iOS 16.0, *)) {
923
+ if (_sheetAllowedDetents.count > 0) {
924
+ if (_sheetAllowedDetents.count == 1 && [_sheetAllowedDetents[0] integerValue] == SHEET_FIT_TO_CONTENTS) {
925
+ // This is `fitToContents` case, where sheet should be just high to display its contents.
926
+ // Paper: we do not set anything here, we will set once React computed layout of our React's children, namely
927
+ // RNSScreenContentWrapper, which in case of formSheet presentation style does have exactly the same frame as
928
+ // actual content. The update will be triggered once our child is mounted and laid out by React.
929
+ // Fabric: in this very moment our children are already mounted & laid out. In the very end of this method,
930
+ // after all other configuration is applied we trigger content wrapper to send us update on its frame.
931
+ } else {
932
+ [self setAllowedDetentsForSheet:sheet
933
+ to:[self detentsFromMaxHeightFractions:_sheetAllowedDetents]
934
+ animate:NO];
935
+ }
936
+ }
937
+ } else
938
+ #endif // Check for iOS >= 16
939
+ {
940
+ systemDetentsInUse = true;
941
+ if (_sheetAllowedDetents.count == 0) {
942
+ [self setAllowedDetentsForSheet:sheet
943
+ to:@[
944
+ UISheetPresentationControllerDetent.mediumDetent,
945
+ UISheetPresentationControllerDetent.largeDetent
946
+ ]
947
+ animate:YES];
948
+ } else if (_sheetAllowedDetents.count >= 2) {
949
+ float firstDetentFraction = _sheetAllowedDetents[0].floatValue;
950
+ float secondDetentFraction = _sheetAllowedDetents[1].floatValue;
951
+ firstDimmedDetentIndex = 2;
952
+
953
+ if (firstDetentFraction < secondDetentFraction) {
954
+ [self setAllowedDetentsForSheet:sheet
955
+ to:@[
956
+ UISheetPresentationControllerDetent.mediumDetent,
957
+ UISheetPresentationControllerDetent.largeDetent
958
+ ]
959
+ animate:YES];
960
+ } else {
961
+ RCTLogError(@"[RNScreens] The values in sheetAllowedDetents array must be sorted");
962
+ }
618
963
  } else {
619
- RCTLogError(@"Unhandled value of sheetLargestUndimmedDetent passed");
964
+ float firstDetentFraction = _sheetAllowedDetents[0].floatValue;
965
+ if (firstDetentFraction == SHEET_FIT_TO_CONTENTS) {
966
+ RCTLogError(@"[RNScreens] Unsupported on iOS versions below 16");
967
+ } else if (firstDetentFraction < 1.0) {
968
+ [self setAllowedDetentsForSheet:sheet to:@[ UISheetPresentationControllerDetent.mediumDetent ] animate:YES];
969
+ [self setSelectedDetentForSheet:sheet to:UISheetPresentationControllerDetentIdentifierMedium animate:YES];
970
+ } else {
971
+ [self setAllowedDetentsForSheet:sheet to:@[ UISheetPresentationControllerDetent.largeDetent ] animate:YES];
972
+ [self setSelectedDetentForSheet:sheet to:UISheetPresentationControllerDetentIdentifierLarge animate:YES];
973
+ }
620
974
  }
975
+ }
621
976
 
622
- if (_sheetAllowedDetents == RNSScreenDetentTypeMedium) {
623
- sheet.detents = @[ UISheetPresentationControllerDetent.mediumDetent ];
624
- if (sheet.selectedDetentIdentifier != UISheetPresentationControllerDetentIdentifierMedium) {
625
- [sheet animateChanges:^{
626
- sheet.selectedDetentIdentifier = UISheetPresentationControllerDetentIdentifierMedium;
627
- }];
977
+ if (_sheetInitialDetent > 0 && _sheetInitialDetent < _sheetAllowedDetents.count) {
978
+ #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
979
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
980
+ if (@available(iOS 16.0, *)) {
981
+ UISheetPresentationControllerDetent *detent = sheet.detents[_sheetInitialDetent];
982
+ [self setSelectedDetentForSheet:sheet to:detent.identifier animate:YES];
983
+ } else
984
+ #endif // Check for iOS >= 16
985
+ {
986
+ if (_sheetInitialDetent < 2) {
987
+ [self setSelectedDetentForSheet:sheet to:UISheetPresentationControllerDetentIdentifierLarge animate:YES];
988
+ } else {
989
+ RCTLogError(
990
+ @"[RNScreens] sheetInitialDetent out of bounds, on iOS versions below 16 sheetAllowedDetents is ignored in favor of an array of two system-defined detents");
628
991
  }
629
- } else if (_sheetAllowedDetents == RNSScreenDetentTypeLarge) {
630
- sheet.detents = @[ UISheetPresentationControllerDetent.largeDetent ];
631
- if (sheet.selectedDetentIdentifier != UISheetPresentationControllerDetentIdentifierLarge) {
632
- [sheet animateChanges:^{
633
- sheet.selectedDetentIdentifier = UISheetPresentationControllerDetentIdentifierLarge;
634
- }];
992
+ }
993
+ } else if (_sheetInitialDetent != 0) {
994
+ RCTLogError(@"[RNScreens] sheetInitialDetent out of bounds for sheetAllowedDetents array");
995
+ }
996
+
997
+ sheet.prefersScrollingExpandsWhenScrolledToEdge = _sheetExpandsWhenScrolledToEdge;
998
+ [self setGrabberVisibleForSheet:sheet to:_sheetGrabberVisible animate:YES];
999
+ [self setCornerRadiusForSheet:sheet to:_sheetCornerRadius animate:YES];
1000
+
1001
+ // lud - largest undimmed detent
1002
+ // First we try to take value from the prop or default.
1003
+ int ludIndex = _sheetLargestUndimmedDetent != nil ? _sheetLargestUndimmedDetent.intValue : -1;
1004
+ // Rationalize the value in case the user set something that did not make sense.
1005
+ ludIndex = ludIndex >= firstDimmedDetentIndex ? firstDimmedDetentIndex - 1 : ludIndex;
1006
+ if (ludIndex == SHEET_LARGEST_UNDIMMED_DETENT_NONE) {
1007
+ [self setLargestUndimmedDetentForSheet:sheet to:nil animate:YES];
1008
+ } else if (ludIndex >= 0) {
1009
+ if (systemDetentsInUse) {
1010
+ // We're on iOS 15 or do not have custom detents specified by the user.
1011
+ if (firstDimmedDetentIndex == 0 || (firstDimmedDetentIndex == 1 && _sheetAllowedDetents[0].floatValue < 1.0)) {
1012
+ // There are no detents specified or there is exactly one & it is less than 1.0 we default to medium.
1013
+ [self setLargestUndimmedDetentForSheet:sheet
1014
+ to:UISheetPresentationControllerDetentIdentifierMedium
1015
+ animate:YES];
1016
+ } else {
1017
+ [self setLargestUndimmedDetentForSheet:sheet
1018
+ to:UISheetPresentationControllerDetentIdentifierLarge
1019
+ animate:YES];
635
1020
  }
636
- } else if (_sheetAllowedDetents == RNSScreenDetentTypeAll) {
637
- sheet.detents =
638
- @[ UISheetPresentationControllerDetent.mediumDetent, UISheetPresentationControllerDetent.largeDetent ];
639
1021
  } else {
640
- RCTLogError(@"Unhandled value of sheetAllowedDetents passed");
1022
+ // We're on iOS 16+ & have custom detents.
1023
+ [self setLargestUndimmedDetentForSheet:sheet to:[NSNumber numberWithInt:ludIndex].stringValue animate:YES];
641
1024
  }
1025
+ } else {
1026
+ RCTLogError(@"[RNScreens] Value of sheetLargestUndimmedDetent prop must be >= -1");
642
1027
  }
643
1028
  }
644
- #endif // Check for max allowed iOS version
1029
+
1030
+ #ifdef RCT_NEW_ARCH_ENABLED
1031
+ // We trigger update from content wrapper, because on Fabric we update props after the children are mounted & laid
1032
+ // out.
1033
+ [self->_contentWrapper triggerDelegateUpdate];
1034
+ #endif // RCT_NEW_ARCH_ENABLED
1035
+ #endif // Check for iOS >= 15
645
1036
  }
646
- #endif // !TARGET_OS_TV
1037
+
1038
+ #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
1039
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
1040
+
1041
+ /**
1042
+ * Creates array of detent objects based on provided `values` & `resolver`. Since we need to name the detents to be able
1043
+ * to later refer to them, this method names the detents by stringifying their indices, e.g. detent on index 2 will be
1044
+ * named "2".
1045
+ */
1046
+ - (NSArray<UISheetPresentationControllerDetent *> *)
1047
+ detentsFromValues:(NSArray<NSNumber *> *)values
1048
+ withResolver:(CGFloat (^)(id<UISheetPresentationControllerDetentResolutionContext>, NSNumber *))resolver
1049
+ API_AVAILABLE(ios(16.0))
1050
+ {
1051
+ NSMutableArray<UISheetPresentationControllerDetent *> *customDetents =
1052
+ [NSMutableArray arrayWithCapacity:values.count];
1053
+ [values enumerateObjectsUsingBlock:^(NSNumber *value, NSUInteger index, BOOL *stop) {
1054
+ UISheetPresentationControllerDetentIdentifier ident = [[NSNumber numberWithInt:index] stringValue];
1055
+ [customDetents addObject:[UISheetPresentationControllerDetent
1056
+ customDetentWithIdentifier:ident
1057
+ resolver:^CGFloat(
1058
+ id<UISheetPresentationControllerDetentResolutionContext> ctx) {
1059
+ return resolver(ctx, value);
1060
+ }]];
1061
+ }];
1062
+ return customDetents;
1063
+ }
1064
+
1065
+ - (NSArray<UISheetPresentationControllerDetent *> *)detentsFromMaxHeightFractions:(NSArray<NSNumber *> *)fractions
1066
+ API_AVAILABLE(ios(16.0))
1067
+ {
1068
+ return [self
1069
+ detentsFromValues:fractions
1070
+ withResolver:^CGFloat(id<UISheetPresentationControllerDetentResolutionContext> ctx, NSNumber *fraction) {
1071
+ return MIN(ctx.maximumDetentValue, ctx.maximumDetentValue * fraction.floatValue);
1072
+ }];
1073
+ }
1074
+
1075
+ - (NSArray<UISheetPresentationControllerDetent *> *)detentsFromMaxHeights:(NSArray<NSNumber *> *)maxHeights
1076
+ API_AVAILABLE(ios(16.0))
1077
+ {
1078
+ return
1079
+ [self detentsFromValues:maxHeights
1080
+ withResolver:^CGFloat(id<UISheetPresentationControllerDetentResolutionContext> ctx, NSNumber *height) {
1081
+ return MIN(ctx.maximumDetentValue, height.floatValue);
1082
+ }];
1083
+ }
1084
+
1085
+ #endif // Check for iOS >= 16
1086
+
1087
+ #endif // !TARGET_OS_TV && !TARGET_OS_VISION
647
1088
 
648
1089
  #pragma mark - Fabric specific
649
1090
  #ifdef RCT_NEW_ARCH_ENABLED
650
1091
 
1092
+ - (void)postNotificationForEventDispatcherObserversWithEvent:(NSObject<RCTEvent> *)event
1093
+ {
1094
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:event, @"event", nil];
1095
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"RCTNotifyEventDispatcherObserversOfEvent_DEPRECATED"
1096
+ object:nil
1097
+ userInfo:userInfo];
1098
+ }
1099
+
651
1100
  - (BOOL)hasHeaderConfig
652
1101
  {
653
1102
  return _config != nil;
654
1103
  }
655
1104
 
1105
+ - (void)willBeUnmountedInUpcomingTransaction
1106
+ {
1107
+ _markedForUnmountInCurrentTransaction = YES;
1108
+ }
1109
+
656
1110
  + (react::ComponentDescriptorProvider)componentDescriptorProvider
657
1111
  {
658
1112
  return react::concreteComponentDescriptorProvider<react::RNSScreenComponentDescriptor>();
659
1113
  }
660
1114
 
1115
+ + (BOOL)shouldBeRecycled
1116
+ {
1117
+ return NO;
1118
+ }
1119
+
661
1120
  - (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
662
1121
  {
1122
+ if ([childComponentView isKindOfClass:RNSScreenContentWrapper.class]) {
1123
+ auto contentWrapper = (RNSScreenContentWrapper *)childComponentView;
1124
+ contentWrapper.delegate = self;
1125
+ _contentWrapper = contentWrapper;
1126
+ }
663
1127
  if ([childComponentView isKindOfClass:[RNSScreenStackHeaderConfig class]]) {
664
1128
  _config = (RNSScreenStackHeaderConfig *)childComponentView;
665
1129
  _config.screenView = self;
@@ -673,33 +1137,16 @@ namespace react = facebook::react;
673
1137
  if ([childComponentView isKindOfClass:[RNSScreenStackHeaderConfig class]]) {
674
1138
  _config = nil;
675
1139
  }
1140
+ if ([childComponentView isKindOfClass:[RNSScreenContentWrapper class]]) {
1141
+ _contentWrapper.delegate = nil;
1142
+ _contentWrapper = nil;
1143
+ }
676
1144
  [_reactSubviews removeObject:childComponentView];
677
1145
  [super unmountChildComponentView:childComponentView index:index];
678
1146
  }
679
1147
 
680
1148
  #pragma mark - RCTComponentViewProtocol
681
1149
 
682
- - (void)prepareForRecycle
683
- {
684
- [super prepareForRecycle];
685
- // TODO: Make sure that there is no edge case when this should be uncommented
686
- // _controller=nil;
687
- _dismissed = NO;
688
- _state.reset();
689
- _touchHandler = nil;
690
-
691
- // We set this prop to default value here to workaround view-recycling.
692
- // Let's assume the view has had _stackPresentation == <some modal stack presentation> set
693
- // before below line was executed. Then, when instantiated again (with the same modal presentation)
694
- // updateProps:oldProps: method would be called and setter for stack presentation would not be called.
695
- // This is crucial as in that setter we register `self.controller` as a delegate
696
- // (UIAdaptivePresentationControllerDelegate) to presentation controller and this leads to buggy modal behaviour as we
697
- // rely on UIAdaptivePresentationControllerDelegate callbacks. Restoring the default value and then comparing against
698
- // it in updateProps:oldProps: allows for setter to be called, however if there was some additional logic to execute
699
- // when stackPresentation is set to "push" the setter would not be triggered.
700
- _stackPresentation = RNSScreenStackPresentationPush;
701
- }
702
-
703
1150
  - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::Shared const &)oldProps
704
1151
  {
705
1152
  const auto &oldScreenProps = *std::static_pointer_cast<const react::RNSScreenProps>(_props);
@@ -707,6 +1154,8 @@ namespace react = facebook::react;
707
1154
 
708
1155
  [self setFullScreenSwipeEnabled:newScreenProps.fullScreenSwipeEnabled];
709
1156
 
1157
+ [self setFullScreenSwipeShadowEnabled:newScreenProps.fullScreenSwipeShadowEnabled];
1158
+
710
1159
  [self setGestureEnabled:newScreenProps.gestureEnabled];
711
1160
 
712
1161
  [self setTransitionDuration:[NSNumber numberWithInt:newScreenProps.transitionDuration]];
@@ -754,21 +1203,21 @@ namespace react = facebook::react;
754
1203
  [self setSheetExpandsWhenScrolledToEdge:newScreenProps.sheetExpandsWhenScrolledToEdge];
755
1204
 
756
1205
  if (newScreenProps.sheetAllowedDetents != oldScreenProps.sheetAllowedDetents) {
757
- [self setSheetAllowedDetents:[RNSConvert RNSScreenDetentTypeFromAllowedDetents:newScreenProps.sheetAllowedDetents]];
1206
+ [self setSheetAllowedDetents:[RNSConvert detentFractionsArrayFromVector:newScreenProps.sheetAllowedDetents]];
1207
+ }
1208
+
1209
+ if (newScreenProps.sheetInitialDetent != oldScreenProps.sheetInitialDetent) {
1210
+ [self setSheetInitialDetent:newScreenProps.sheetInitialDetent];
758
1211
  }
759
1212
 
760
1213
  if (newScreenProps.sheetLargestUndimmedDetent != oldScreenProps.sheetLargestUndimmedDetent) {
761
- [self setSheetLargestUndimmedDetent:
762
- [RNSConvert RNSScreenDetentTypeFromLargestUndimmedDetent:newScreenProps.sheetLargestUndimmedDetent]];
1214
+ [self setSheetLargestUndimmedDetent:[NSNumber numberWithInt:newScreenProps.sheetLargestUndimmedDetent]];
763
1215
  }
764
1216
  #endif // !TARGET_OS_TV
765
1217
 
766
- // Notice that we compare against _stackPresentation, not oldScreenProps.stackPresentation.
767
- // See comment in prepareForRecycle method for explanation.
768
- RNSScreenStackPresentation newStackPresentation =
769
- [RNSConvert RNSScreenStackPresentationFromCppEquivalent:newScreenProps.stackPresentation];
770
- if (newStackPresentation != _stackPresentation) {
771
- [self setStackPresentation:newStackPresentation];
1218
+ if (newScreenProps.stackPresentation != oldScreenProps.stackPresentation) {
1219
+ [self
1220
+ setStackPresentation:[RNSConvert RNSScreenStackPresentationFromCppEquivalent:newScreenProps.stackPresentation]];
772
1221
  }
773
1222
 
774
1223
  if (newScreenProps.stackAnimation != oldScreenProps.stackAnimation) {
@@ -793,7 +1242,7 @@ namespace react = facebook::react;
793
1242
  _newLayoutMetrics = layoutMetrics;
794
1243
  _oldLayoutMetrics = oldLayoutMetrics;
795
1244
  UIViewController *parentVC = self.reactViewController.parentViewController;
796
- if (parentVC != nil && ![parentVC isKindOfClass:[RNSNavigationController class]]) {
1245
+ if (parentVC == nil || ![parentVC isKindOfClass:[RNSNavigationController class]]) {
797
1246
  [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
798
1247
  }
799
1248
  // when screen is mounted under RNSNavigationController it's size is controller
@@ -808,8 +1257,8 @@ namespace react = facebook::react;
808
1257
  - (void)finalizeUpdates:(RNComponentViewUpdateMask)updateMask
809
1258
  {
810
1259
  [super finalizeUpdates:updateMask];
811
- #if !TARGET_OS_TV
812
- [self updatePresentationStyle];
1260
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
1261
+ [self updateFormSheetPresentationStyle];
813
1262
  #endif // !TARGET_OS_TV
814
1263
  }
815
1264
 
@@ -819,8 +1268,10 @@ namespace react = facebook::react;
819
1268
  - (void)didSetProps:(NSArray<NSString *> *)changedProps
820
1269
  {
821
1270
  [super didSetProps:changedProps];
822
- #if !TARGET_OS_TV
823
- [self updatePresentationStyle];
1271
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
1272
+ if (self.stackPresentation == RNSScreenStackPresentationFormSheet) {
1273
+ [self updateFormSheetPresentationStyle];
1274
+ }
824
1275
  #endif // !TARGET_OS_TV
825
1276
  }
826
1277
 
@@ -845,10 +1296,6 @@ namespace react = facebook::react;
845
1296
  // subviews
846
1297
  }
847
1298
 
848
- - (void)invalidate
849
- {
850
- _controller = nil;
851
- }
852
1299
  #endif
853
1300
 
854
1301
  @end
@@ -975,9 +1422,6 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
975
1422
  - (void)viewDidDisappear:(BOOL)animated
976
1423
  {
977
1424
  [super viewDidDisappear:animated];
978
- #ifdef RCT_NEW_ARCH_ENABLED
979
- [self resetViewToScreen];
980
- #endif
981
1425
  if (self.parentViewController == nil && self.presentingViewController == nil) {
982
1426
  if (self.screenView.preventNativeDismiss) {
983
1427
  // if we want to prevent the native dismiss, we do not send dismissal event,
@@ -1031,6 +1475,12 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
1031
1475
  }
1032
1476
  }
1033
1477
 
1478
+ - (BOOL)isModalWithHeader
1479
+ {
1480
+ return self.screenView.isModal && self.childViewControllers.count == 1 &&
1481
+ [self.childViewControllers[0] isKindOfClass:UINavigationController.class];
1482
+ }
1483
+
1034
1484
  // Checks whether this screen has any child view controllers of type RNSNavigationController.
1035
1485
  // Useful for checking if this screen has nested stack or is displayed at the top.
1036
1486
  - (BOOL)hasNestedStack
@@ -1044,33 +1494,9 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
1044
1494
  return NO;
1045
1495
  }
1046
1496
 
1047
- - (CGFloat)getCalculatedHeaderHeightIsModal:(BOOL)isModal
1497
+ - (CGSize)getStatusBarHeightIsModal:(BOOL)isModal
1048
1498
  {
1049
- CGFloat navbarHeight = self.navigationController.navigationBar.frame.size.height;
1050
-
1051
- // In case where screen is a modal, we want to calculate just its childViewController's height
1052
- if (isModal && self.childViewControllers.count > 0 &&
1053
- [self.childViewControllers[0] isKindOfClass:UINavigationController.class]) {
1054
- UINavigationController *childNavCtr = self.childViewControllers[0];
1055
- navbarHeight = childNavCtr.navigationBar.frame.size.height;
1056
- }
1057
-
1058
- return navbarHeight;
1059
- }
1060
-
1061
- - (CGSize)getCalculatedStatusBarHeightIsModal:(BOOL)isModal
1062
- {
1063
- #if !TARGET_OS_TV
1064
- BOOL isDraggableModal = isModal && ![self.screenView isFullscreenModal];
1065
- BOOL isDraggableModalWithChildViewCtr =
1066
- isDraggableModal && self.childViewControllers.count > 0 && self.childViewControllers[0] != nil;
1067
-
1068
- // When modal is floating (we can grab its header), we don't want to calculate status bar in it.
1069
- // Thus, we return '0' as a height of status bar.
1070
- if (isDraggableModalWithChildViewCtr || self.screenView.isTransparentModal) {
1071
- return CGSizeMake(0, 0);
1072
- }
1073
-
1499
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
1074
1500
  CGSize fallbackStatusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
1075
1501
 
1076
1502
  #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
@@ -1087,21 +1513,51 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
1087
1513
  #endif /* Check for iOS 13.0 */
1088
1514
 
1089
1515
  #else
1090
- // On TVOS, status bar doesn't exist
1516
+ // TVOS does not have status bar.
1091
1517
  return CGSizeMake(0, 0);
1092
1518
  #endif // !TARGET_OS_TV
1093
1519
  }
1094
1520
 
1521
+ - (UINavigationController *)getVisibleNavigationControllerIsModal:(BOOL)isModal
1522
+ {
1523
+ UINavigationController *navctr = self.navigationController;
1524
+
1525
+ if (isModal) {
1526
+ // In case where screen is a modal, we want to calculate childViewController's
1527
+ // navigation bar height instead of the navigation controller from RNSScreen.
1528
+ if (self.isModalWithHeader) {
1529
+ navctr = self.childViewControllers[0];
1530
+ } else {
1531
+ // If the modal does not meet requirements (there's no RNSNavigationController which means that probably it
1532
+ // doesn't have header or there are more than one RNSNavigationController which is invalid) we don't want to
1533
+ // return anything.
1534
+ return nil;
1535
+ }
1536
+ }
1537
+
1538
+ return navctr;
1539
+ }
1540
+
1095
1541
  - (CGFloat)calculateHeaderHeightIsModal:(BOOL)isModal
1096
1542
  {
1097
- CGFloat navbarHeight = [self getCalculatedHeaderHeightIsModal:isModal];
1098
- CGSize statusBarSize = [self getCalculatedStatusBarHeightIsModal:isModal];
1543
+ UINavigationController *navctr = [self getVisibleNavigationControllerIsModal:isModal];
1544
+
1545
+ // If there's no navigation controller for the modal (or the navigation bar is hidden), we simply don't want to
1546
+ // return header height, as modal possibly does not have header when navigation controller is nil,
1547
+ // and we don't want to count status bar if navigation bar is hidden (inset could be negative).
1548
+ if (navctr == nil || navctr.isNavigationBarHidden) {
1549
+ return 0;
1550
+ }
1551
+
1552
+ CGFloat navbarHeight = navctr.navigationBar.frame.size.height;
1553
+ #if !TARGET_OS_TV
1554
+ CGFloat navbarInset = navctr.navigationBar.frame.origin.y;
1555
+ #else
1556
+ // On TVOS there's no inset of navigation bar.
1557
+ CGFloat navbarInset = 0;
1558
+ #endif // !TARGET_OS_TV
1099
1559
 
1100
- // Unfortunately, UIKit doesn't care about switching width and height options on screen rotation.
1101
- // We should check if user has rotated its screen, so we're choosing the minimum value between the
1102
- // width and height.
1103
- CGFloat statusBarHeight = MIN(statusBarSize.width, statusBarSize.height);
1104
- return navbarHeight + statusBarHeight;
1560
+ return navbarHeight + navbarInset;
1105
1561
  }
1106
1562
 
1107
1563
  - (void)calculateAndNotifyHeaderHeightChangeIsModal:(BOOL)isModal
@@ -1195,15 +1651,28 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
1195
1651
  UIViewController *lastViewController = [[self childViewControllers] lastObject];
1196
1652
  if ([self.presentedViewController isKindOfClass:[RNSScreen class]]) {
1197
1653
  lastViewController = self.presentedViewController;
1654
+
1655
+ if (!includingModals) {
1656
+ return nil;
1657
+ }
1658
+
1198
1659
  // we don't want to allow controlling of status bar appearance when we present non-fullScreen modal
1199
1660
  // and it is not possible if `modalPresentationCapturesStatusBarAppearance` is not set to YES, so even
1200
1661
  // if we went into a modal here and ask it, it wouldn't take any effect. For fullScreen modals, the system
1201
1662
  // asks them by itself, so we can stop traversing here.
1202
1663
  // for screen orientation, we need to start the search again from that modal
1203
- return !includingModals
1204
- ? nil
1205
- : [(RNSScreen *)lastViewController findChildVCForConfigAndTrait:trait includingModals:includingModals]
1206
- ?: lastViewController;
1664
+ UIViewController *modalOrChild = [(RNSScreen *)lastViewController findChildVCForConfigAndTrait:trait
1665
+ includingModals:includingModals];
1666
+ if (modalOrChild != nil) {
1667
+ return modalOrChild;
1668
+ }
1669
+
1670
+ // if searched VC was not found, we don't want to search for configs of child VCs any longer,
1671
+ // and we don't want to rely on lastViewController.
1672
+ // That's because the modal did not find a child VC that has an orientation set,
1673
+ // and it doesn't itself have an orientation set. Hence, we fallback to the standard behavior.
1674
+ // Please keep in mind that this behavior might be wrong and could lead to undiscovered bugs.
1675
+ // For more information, see https://github.com/software-mansion/react-native-screens/pull/2008.
1207
1676
  }
1208
1677
 
1209
1678
  UIViewController *selfOrNil = [self hasTraitSet:trait] ? self : nil;
@@ -1366,26 +1835,15 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
1366
1835
  #ifdef RCT_NEW_ARCH_ENABLED
1367
1836
  #pragma mark - Fabric specific
1368
1837
 
1369
- - (void)setViewToSnapshot:(UIView *)snapshot
1838
+ - (void)setViewToSnapshot
1370
1839
  {
1371
- // modals of native stack seem not to support
1372
- // changing their view by just setting the view
1373
- if (_initialView.stackPresentation != RNSScreenStackPresentationPush) {
1374
- UIView *superView = self.view.superview;
1840
+ UIView *superView = self.view.superview;
1841
+ // if we dismissed the view natively, it will already be detached from view hierarchy
1842
+ if (self.view.window != nil) {
1843
+ UIView *snapshot = [self.view snapshotViewAfterScreenUpdates:NO];
1375
1844
  [self.view removeFromSuperview];
1376
1845
  self.view = snapshot;
1377
- [superView addSubview:self.view];
1378
- } else {
1379
- [self.view removeFromSuperview];
1380
- self.view = snapshot;
1381
- }
1382
- }
1383
-
1384
- - (void)resetViewToScreen
1385
- {
1386
- if (self.view != _initialView) {
1387
- [self.view removeFromSuperview];
1388
- self.view = _initialView;
1846
+ [superView addSubview:snapshot];
1389
1847
  }
1390
1848
  }
1391
1849
 
@@ -1398,6 +1856,15 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
1398
1856
  // we don't want to send `scrollViewDidEndDecelerating` event to JS before the JS thread is ready
1399
1857
  return;
1400
1858
  }
1859
+
1860
+ if ([NSStringFromClass([view class]) isEqualToString:@"AVPlayerView"]) {
1861
+ // Traversing through AVPlayerView is an uncommon edge case that causes the disappearing screen
1862
+ // to an excessive traversal through all video player elements
1863
+ // (e.g., for react-native-video, this includes all controls and additional video views).
1864
+ // Thus, we want to avoid unnecessary traversals through these views.
1865
+ return;
1866
+ }
1867
+
1401
1868
  if ([view isKindOfClass:[UIScrollView class]] &&
1402
1869
  ([[(UIScrollView *)view delegate] respondsToSelector:@selector(scrollViewDidEndDecelerating:)])) {
1403
1870
  [[(UIScrollView *)view delegate] scrollViewDidEndDecelerating:(id)view];
@@ -1418,6 +1885,7 @@ RCT_EXPORT_MODULE()
1418
1885
  RCT_REMAP_VIEW_PROPERTY(activityState, activityStateOrNil, NSNumber)
1419
1886
  RCT_EXPORT_VIEW_PROPERTY(customAnimationOnSwipe, BOOL);
1420
1887
  RCT_EXPORT_VIEW_PROPERTY(fullScreenSwipeEnabled, BOOL);
1888
+ RCT_EXPORT_VIEW_PROPERTY(fullScreenSwipeShadowEnabled, BOOL);
1421
1889
  RCT_EXPORT_VIEW_PROPERTY(gestureEnabled, BOOL)
1422
1890
  RCT_EXPORT_VIEW_PROPERTY(gestureResponseDistance, NSDictionary)
1423
1891
  RCT_EXPORT_VIEW_PROPERTY(hideKeyboardOnSwipe, BOOL)
@@ -1437,6 +1905,7 @@ RCT_EXPORT_VIEW_PROPERTY(onTransitionProgress, RCTDirectEventBlock);
1437
1905
  RCT_EXPORT_VIEW_PROPERTY(onWillAppear, RCTDirectEventBlock);
1438
1906
  RCT_EXPORT_VIEW_PROPERTY(onWillDisappear, RCTDirectEventBlock);
1439
1907
  RCT_EXPORT_VIEW_PROPERTY(onGestureCancel, RCTDirectEventBlock);
1908
+ RCT_EXPORT_VIEW_PROPERTY(onSheetDetentChanged, RCTDirectEventBlock);
1440
1909
 
1441
1910
  #if !TARGET_OS_TV
1442
1911
  RCT_EXPORT_VIEW_PROPERTY(screenOrientation, UIInterfaceOrientationMask)
@@ -1445,14 +1914,15 @@ RCT_EXPORT_VIEW_PROPERTY(statusBarHidden, BOOL)
1445
1914
  RCT_EXPORT_VIEW_PROPERTY(statusBarStyle, RNSStatusBarStyle)
1446
1915
  RCT_EXPORT_VIEW_PROPERTY(homeIndicatorHidden, BOOL)
1447
1916
 
1448
- RCT_EXPORT_VIEW_PROPERTY(sheetAllowedDetents, RNSScreenDetentType);
1449
- RCT_EXPORT_VIEW_PROPERTY(sheetLargestUndimmedDetent, RNSScreenDetentType);
1917
+ RCT_EXPORT_VIEW_PROPERTY(sheetAllowedDetents, NSArray<NSNumber *> *);
1918
+ RCT_EXPORT_VIEW_PROPERTY(sheetLargestUndimmedDetent, NSNumber *);
1450
1919
  RCT_EXPORT_VIEW_PROPERTY(sheetGrabberVisible, BOOL);
1451
1920
  RCT_EXPORT_VIEW_PROPERTY(sheetCornerRadius, CGFloat);
1921
+ RCT_EXPORT_VIEW_PROPERTY(sheetInitialDetent, NSInteger);
1452
1922
  RCT_EXPORT_VIEW_PROPERTY(sheetExpandsWhenScrolledToEdge, BOOL);
1453
1923
  #endif
1454
1924
 
1455
- #if !TARGET_OS_TV
1925
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
1456
1926
  // See:
1457
1927
  // 1. https://github.com/software-mansion/react-native-screens/pull/1543
1458
1928
  // 2. https://github.com/software-mansion/react-native-screens/pull/1596
@@ -1475,10 +1945,13 @@ RCT_EXPORT_VIEW_PROPERTY(sheetExpandsWhenScrolledToEdge, BOOL);
1475
1945
  }
1476
1946
  #endif // !TARGET_OS_TV
1477
1947
 
1948
+ #ifdef RCT_NEW_ARCH_ENABLED
1949
+ #else
1478
1950
  - (UIView *)view
1479
1951
  {
1480
1952
  return [[RNSScreenView alloc] initWithBridge:self.bridge];
1481
1953
  }
1954
+ #endif
1482
1955
 
1483
1956
  + (BOOL)requiresMainQueueSetup
1484
1957
  {
@@ -1517,7 +1990,9 @@ RCT_ENUM_CONVERTER(
1517
1990
  @"simple_push" : @(RNSScreenStackAnimationSimplePush),
1518
1991
  @"slide_from_bottom" : @(RNSScreenStackAnimationSlideFromBottom),
1519
1992
  @"slide_from_right" : @(RNSScreenStackAnimationDefault),
1520
- @"slide_from_left" : @(RNSScreenStackAnimationDefault),
1993
+ @"slide_from_left" : @(RNSScreenStackAnimationSlideFromLeft),
1994
+ @"ios_from_right" : @(RNSScreenStackAnimationDefault),
1995
+ @"ios_from_left" : @(RNSScreenStackAnimationSlideFromLeft),
1521
1996
  }),
1522
1997
  RNSScreenStackAnimationDefault,
1523
1998
  integerValue)
@@ -1597,3 +2072,7 @@ RCT_ENUM_CONVERTER(
1597
2072
  #endif
1598
2073
 
1599
2074
  @end
2075
+
2076
+ // So that the define-macro is not leaked out of this file.
2077
+ // This one is defined in very top of the file depending on RN architecture.
2078
+ #undef ReactScrollViewBase