@amazon-devices/react-native-screens 2.0.1758683737 → 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 (673) 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/THIRD_PARTY_NOTICES.txt +1 -684
  9. package/android/CMakeLists.txt +80 -0
  10. package/android/build.gradle +96 -17
  11. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +61 -0
  12. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +38 -25
  13. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
  14. package/android/src/main/cpp/NativeProxy.cpp +51 -0
  15. package/android/src/main/cpp/NativeProxy.h +35 -0
  16. package/android/src/main/cpp/OnLoad.cpp +8 -0
  17. package/android/src/main/cpp/jni-adapter.cpp +106 -0
  18. package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +20 -10
  19. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +69 -1
  20. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +8 -8
  21. package/android/src/main/java/com/swmansion/rnscreens/InsetsObserverProxy.kt +104 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/ModalScreenViewManager.kt +12 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/NativeDismissalObserver.kt +12 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +65 -7
  25. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +327 -84
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +122 -72
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +27 -4
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapper.kt +38 -0
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapperManager.kt +25 -0
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooter.kt +299 -0
  32. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooterManager.kt +25 -0
  33. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +91 -67
  34. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +12 -1
  35. package/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +281 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +184 -81
  37. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +467 -80
  38. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +8 -1
  39. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +156 -124
  40. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigShadowNode.kt +25 -0
  41. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +159 -39
  42. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +24 -9
  43. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +19 -13
  44. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +31 -28
  45. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +276 -71
  46. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +124 -64
  47. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +127 -0
  48. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +4 -2
  49. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +160 -53
  50. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +57 -32
  51. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +15 -10
  52. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetBehaviorExt.kt +42 -0
  53. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogRootView.kt +104 -0
  54. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogScreen.kt +26 -0
  55. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingFragment.kt +493 -0
  56. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +66 -0
  57. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt +24 -0
  58. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/SheetUtils.kt +135 -0
  59. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +7 -8
  60. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +8 -9
  61. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +7 -8
  62. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +9 -10
  63. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
  64. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
  65. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
  66. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +13 -16
  67. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
  68. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
  69. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +8 -9
  70. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +8 -11
  71. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +7 -8
  72. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +8 -9
  73. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +7 -8
  74. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +12 -11
  75. package/android/src/main/java/com/swmansion/rnscreens/events/SheetDetentChangedEvent.kt +27 -0
  76. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
  77. package/android/src/main/java/com/swmansion/rnscreens/ext/NumericExt.kt +12 -0
  78. package/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +32 -0
  79. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
  80. package/android/src/main/java/com/swmansion/rnscreens/utils/PaddingBundle.kt +8 -0
  81. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +282 -0
  82. package/android/src/main/jni/CMakeLists.txt +35 -23
  83. package/android/src/main/jni/rnscreens.h +3 -0
  84. package/android/src/main/res/base/anim/rns_ios_from_left_background_close.xml +5 -0
  85. package/android/src/main/res/base/anim/rns_ios_from_left_background_open.xml +5 -0
  86. package/android/src/main/res/base/anim/rns_ios_from_left_foreground_close.xml +6 -0
  87. package/android/src/main/res/base/anim/rns_ios_from_left_foreground_open.xml +6 -0
  88. package/android/src/main/res/base/anim/rns_ios_from_right_background_close.xml +5 -0
  89. package/android/src/main/res/base/anim/rns_ios_from_right_background_open.xml +5 -0
  90. package/android/src/main/res/base/anim/rns_ios_from_right_foreground_close.xml +6 -0
  91. package/android/src/main/res/base/anim/rns_ios_from_right_foreground_open.xml +6 -0
  92. package/android/src/main/res/base/drawable/rns_rounder_top_corners_shape.xml +8 -0
  93. package/android/src/main/res/v33/anim-v33/rns_default_enter_in.xml +0 -1
  94. package/android/src/main/res/v33/anim-v33/rns_default_enter_out.xml +2 -2
  95. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +25 -0
  96. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +16 -0
  97. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +25 -0
  98. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +16 -0
  99. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +25 -0
  100. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +16 -0
  101. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +16 -3
  102. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +7 -2
  103. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +6 -0
  104. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +2 -0
  105. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +99 -0
  106. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +37 -0
  107. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +39 -0
  108. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +11 -2
  109. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
  110. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +36 -0
  111. package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
  112. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h +40 -0
  113. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +16 -0
  114. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +32 -0
  115. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +55 -12
  116. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +157 -0
  117. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +31 -11
  118. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h +49 -0
  119. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.cpp +22 -0
  120. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.h +40 -0
  121. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.cpp +34 -0
  122. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.h +57 -0
  123. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h +27 -0
  124. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.cpp +8 -0
  125. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.h +31 -0
  126. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.cpp +15 -0
  127. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.h +39 -0
  128. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +23 -2
  129. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +33 -8
  130. package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
  131. package/cpp/RNSScreenRemovalListener.cpp +25 -0
  132. package/cpp/RNSScreenRemovalListener.h +20 -0
  133. package/cpp/RNScreensTurboModule.cpp +115 -0
  134. package/cpp/RNScreensTurboModule.h +40 -0
  135. package/gesture-handler/package.json +6 -0
  136. package/ios/RNSConvert.h +24 -4
  137. package/ios/RNSConvert.mm +180 -55
  138. package/ios/RNSEnums.h +48 -0
  139. package/ios/RNSFullWindowOverlay.mm +12 -2
  140. package/ios/RNSModalScreen.h +8 -0
  141. package/ios/RNSModalScreen.mm +65 -0
  142. package/ios/RNSModule.h +19 -0
  143. package/ios/RNSModule.mm +173 -0
  144. package/ios/RNSPercentDrivenInteractiveTransition.h +12 -0
  145. package/ios/RNSPercentDrivenInteractiveTransition.mm +69 -0
  146. package/ios/RNSScreen.h +24 -5
  147. package/ios/RNSScreen.mm +652 -173
  148. package/ios/RNSScreenContainer.mm +12 -1
  149. package/ios/RNSScreenContentWrapper.h +44 -0
  150. package/ios/RNSScreenContentWrapper.mm +67 -0
  151. package/ios/RNSScreenFooter.h +30 -0
  152. package/ios/RNSScreenFooter.mm +142 -0
  153. package/ios/RNSScreenNavigationContainer.mm +7 -0
  154. package/ios/RNSScreenStack.h +6 -0
  155. package/ios/RNSScreenStack.mm +333 -109
  156. package/ios/RNSScreenStackAnimator.h +15 -1
  157. package/ios/RNSScreenStackAnimator.mm +380 -115
  158. package/ios/RNSScreenStackHeaderConfig.h +74 -6
  159. package/ios/RNSScreenStackHeaderConfig.mm +338 -69
  160. package/ios/RNSScreenStackHeaderSubview.h +0 -7
  161. package/ios/RNSScreenStackHeaderSubview.mm +61 -24
  162. package/ios/RNSScreenWindowTraits.h +1 -1
  163. package/ios/RNSScreenWindowTraits.mm +24 -50
  164. package/ios/RNSSearchBar.h +5 -5
  165. package/ios/RNSSearchBar.mm +42 -11
  166. package/ios/events/RNSHeaderHeightChangeEvent.h +0 -1
  167. package/ios/events/RNSHeaderHeightChangeEvent.mm +15 -0
  168. package/ios/events/RNSScreenViewEvent.h +0 -1
  169. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.h +15 -0
  170. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm +14 -0
  171. package/ios/utils/RCTTouchHandler+RNSUtility.h +15 -0
  172. package/ios/utils/RCTTouchHandler+RNSUtility.mm +15 -0
  173. package/ios/utils/RNSDefines.h +7 -0
  174. package/ios/utils/RNSUIBarButtonItem.h +2 -0
  175. package/ios/utils/UINavigationBar+RNSUtility.h +37 -0
  176. package/ios/utils/UINavigationBar+RNSUtility.mm +44 -0
  177. package/ios/utils/UIView+RNSUtility.h +23 -0
  178. package/ios/utils/UIView+RNSUtility.mm +54 -0
  179. package/kepler-compatibility.json +2 -4
  180. package/lib/commonjs/TransitionProgressContext.js +1 -0
  181. package/lib/commonjs/TransitionProgressContext.js.map +1 -1
  182. package/lib/commonjs/components/DebugContainer.js +39 -0
  183. package/lib/commonjs/components/DebugContainer.js.map +1 -0
  184. package/lib/commonjs/components/DebugContainer.web.js +15 -0
  185. package/lib/commonjs/components/DebugContainer.web.js.map +1 -0
  186. package/lib/commonjs/components/FullWindowOverlay.js +31 -0
  187. package/lib/commonjs/components/FullWindowOverlay.js.map +1 -0
  188. package/lib/commonjs/components/FullWindowOverlay.web.js +9 -0
  189. package/lib/commonjs/components/FullWindowOverlay.web.js.map +1 -0
  190. package/lib/commonjs/components/Screen.js +286 -0
  191. package/lib/commonjs/components/Screen.js.map +1 -0
  192. package/lib/commonjs/components/Screen.web.js +47 -0
  193. package/lib/commonjs/components/Screen.web.js.map +1 -0
  194. package/lib/commonjs/components/ScreenContainer.js +32 -0
  195. package/lib/commonjs/components/ScreenContainer.js.map +1 -0
  196. package/lib/commonjs/components/ScreenContainer.web.js +10 -0
  197. package/lib/commonjs/components/ScreenContainer.web.js.map +1 -0
  198. package/lib/commonjs/components/ScreenContentWrapper.js +17 -0
  199. package/lib/commonjs/components/ScreenContentWrapper.js.map +1 -0
  200. package/lib/commonjs/components/ScreenContentWrapper.web.js +10 -0
  201. package/lib/commonjs/components/ScreenContentWrapper.web.js.map +1 -0
  202. package/lib/commonjs/components/ScreenFooter.js +25 -0
  203. package/lib/commonjs/components/ScreenFooter.js.map +1 -0
  204. package/lib/commonjs/components/ScreenFooter.web.js +11 -0
  205. package/lib/commonjs/components/ScreenFooter.web.js.map +1 -0
  206. package/lib/commonjs/components/ScreenStack.js +67 -0
  207. package/lib/commonjs/components/ScreenStack.js.map +1 -0
  208. package/lib/commonjs/components/ScreenStack.web.js +10 -0
  209. package/lib/commonjs/components/ScreenStack.web.js.map +1 -0
  210. package/lib/commonjs/components/ScreenStackHeaderConfig.js +90 -0
  211. package/lib/commonjs/components/ScreenStackHeaderConfig.js.map +1 -0
  212. package/lib/commonjs/components/ScreenStackHeaderConfig.web.js +27 -0
  213. package/lib/commonjs/components/ScreenStackHeaderConfig.web.js.map +1 -0
  214. package/lib/commonjs/components/ScreenStackItem.js +107 -0
  215. package/lib/commonjs/components/ScreenStackItem.js.map +1 -0
  216. package/lib/commonjs/components/SearchBar.js +63 -0
  217. package/lib/commonjs/components/SearchBar.js.map +1 -0
  218. package/lib/commonjs/components/SearchBar.web.js +10 -0
  219. package/lib/commonjs/components/SearchBar.web.js.map +1 -0
  220. package/lib/commonjs/components/helpers/DelayedFreeze.js +31 -0
  221. package/lib/commonjs/components/helpers/DelayedFreeze.js.map +1 -0
  222. package/lib/commonjs/components/helpers/usePrevious.js +15 -0
  223. package/lib/commonjs/components/helpers/usePrevious.js.map +1 -0
  224. package/lib/commonjs/contexts.js +11 -0
  225. package/lib/commonjs/contexts.js.map +1 -0
  226. package/lib/commonjs/core.js +40 -0
  227. package/lib/commonjs/core.js.map +1 -0
  228. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +16 -1
  229. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
  230. package/lib/commonjs/fabric/ModalScreenNativeComponent.js +14 -0
  231. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -0
  232. package/lib/commonjs/fabric/NativeScreensModule.js +10 -0
  233. package/lib/commonjs/fabric/NativeScreensModule.js.map +1 -0
  234. package/lib/commonjs/fabric/NativeScreensModule.web.js +8 -0
  235. package/lib/commonjs/fabric/NativeScreensModule.web.js.map +1 -0
  236. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js +8 -11
  237. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js.map +1 -1
  238. package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js +18 -0
  239. package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
  240. package/lib/commonjs/fabric/ScreenFooterNativeComponent.js +10 -0
  241. package/lib/commonjs/fabric/ScreenFooterNativeComponent.js.map +1 -0
  242. package/lib/commonjs/fabric/ScreenNativeComponent.js +16 -16
  243. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  244. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js +2 -1
  245. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -1
  246. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +10 -9
  247. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  248. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +5 -2
  249. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  250. package/lib/commonjs/fabric/ScreenStackNativeComponent.js +8 -11
  251. package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -1
  252. package/lib/commonjs/fabric/SearchBarNativeComponent.js +4 -5
  253. package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -1
  254. package/lib/commonjs/gesture-handler/GestureDetectorProvider.js +19 -0
  255. package/lib/commonjs/gesture-handler/GestureDetectorProvider.js.map +1 -0
  256. package/lib/commonjs/gesture-handler/RNScreensTurboModule.js +8 -0
  257. package/lib/commonjs/gesture-handler/RNScreensTurboModule.js.map +1 -0
  258. package/lib/commonjs/gesture-handler/ScreenGestureDetector.js +201 -0
  259. package/lib/commonjs/gesture-handler/ScreenGestureDetector.js.map +1 -0
  260. package/lib/commonjs/gesture-handler/constraints.js +64 -0
  261. package/lib/commonjs/gesture-handler/constraints.js.map +1 -0
  262. package/lib/commonjs/gesture-handler/defaults.js +45 -0
  263. package/lib/commonjs/gesture-handler/defaults.js.map +1 -0
  264. package/lib/commonjs/gesture-handler/fabricUtils.js +66 -0
  265. package/lib/commonjs/gesture-handler/fabricUtils.js.map +1 -0
  266. package/lib/commonjs/gesture-handler/fabricUtils.web.js +17 -0
  267. package/lib/commonjs/gesture-handler/fabricUtils.web.js.map +1 -0
  268. package/lib/commonjs/gesture-handler/index.js +14 -0
  269. package/lib/commonjs/gesture-handler/index.js.map +1 -0
  270. package/lib/commonjs/index.js +157 -93
  271. package/lib/commonjs/index.js.map +1 -1
  272. package/lib/commonjs/native-stack/contexts/GHContext.js +12 -0
  273. package/lib/commonjs/native-stack/contexts/GHContext.js.map +1 -0
  274. package/lib/commonjs/native-stack/index.js.map +1 -1
  275. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +21 -20
  276. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  277. package/lib/commonjs/native-stack/types.js.map +1 -1
  278. package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -1
  279. package/lib/commonjs/native-stack/utils/HeaderHeightContext.js.map +1 -1
  280. package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js.map +1 -1
  281. package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js.map +1 -1
  282. package/lib/commonjs/native-stack/utils/getStatusBarHeight.js +22 -0
  283. package/lib/commonjs/native-stack/utils/getStatusBarHeight.js.map +1 -0
  284. package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -1
  285. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js +2 -4
  286. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js.map +1 -1
  287. package/lib/commonjs/native-stack/utils/useHeaderHeight.js.map +1 -1
  288. package/lib/commonjs/native-stack/views/FontProcessor.js +1 -3
  289. package/lib/commonjs/native-stack/views/FontProcessor.js.map +1 -1
  290. package/lib/commonjs/native-stack/views/FooterComponent.js +17 -0
  291. package/lib/commonjs/native-stack/views/FooterComponent.js.map +1 -0
  292. package/lib/commonjs/native-stack/views/HeaderConfig.js +21 -13
  293. package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
  294. package/lib/commonjs/native-stack/views/NativeStackView.js +118 -52
  295. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  296. package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js.map +1 -1
  297. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +15 -21
  298. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
  299. package/lib/commonjs/reanimated/ReanimatedScreen.js +2 -2
  300. package/lib/commonjs/reanimated/ReanimatedScreen.js.map +1 -1
  301. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js +8 -16
  302. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js.map +1 -1
  303. package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js.map +1 -1
  304. package/lib/commonjs/reanimated/index.js.map +1 -1
  305. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js +2 -2
  306. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js.map +1 -1
  307. package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js.map +1 -1
  308. package/lib/commonjs/types.js.map +1 -1
  309. package/lib/commonjs/useTransitionProgress.js.map +1 -1
  310. package/lib/commonjs/utils.js +28 -6
  311. package/lib/commonjs/utils.js.map +1 -1
  312. package/lib/module/TransitionProgressContext.js +2 -0
  313. package/lib/module/TransitionProgressContext.js.map +1 -1
  314. package/lib/module/components/DebugContainer.js +30 -0
  315. package/lib/module/components/DebugContainer.js.map +1 -0
  316. package/lib/module/components/DebugContainer.web.js +6 -0
  317. package/lib/module/components/DebugContainer.web.js.map +1 -0
  318. package/lib/module/components/FullWindowOverlay.js +24 -0
  319. package/lib/module/components/FullWindowOverlay.js.map +1 -0
  320. package/lib/module/components/FullWindowOverlay.web.js +3 -0
  321. package/lib/module/components/FullWindowOverlay.web.js.map +1 -0
  322. package/lib/module/components/Screen.js +282 -0
  323. package/lib/module/components/Screen.js.map +1 -0
  324. package/lib/module/components/Screen.web.js +40 -0
  325. package/lib/module/components/Screen.web.js.map +1 -0
  326. package/lib/module/components/ScreenContainer.js +26 -0
  327. package/lib/module/components/ScreenContainer.js.map +1 -0
  328. package/lib/module/components/ScreenContainer.web.js +4 -0
  329. package/lib/module/components/ScreenContainer.web.js.map +1 -0
  330. package/lib/module/components/ScreenContentWrapper.js +10 -0
  331. package/lib/module/components/ScreenContentWrapper.js.map +1 -0
  332. package/lib/module/components/ScreenContentWrapper.web.js +4 -0
  333. package/lib/module/components/ScreenContentWrapper.web.js.map +1 -0
  334. package/lib/module/components/ScreenFooter.js +18 -0
  335. package/lib/module/components/ScreenFooter.js.map +1 -0
  336. package/lib/module/components/ScreenFooter.web.js +6 -0
  337. package/lib/module/components/ScreenFooter.web.js.map +1 -0
  338. package/lib/module/components/ScreenStack.js +63 -0
  339. package/lib/module/components/ScreenStack.js.map +1 -0
  340. package/lib/module/components/ScreenStack.web.js +4 -0
  341. package/lib/module/components/ScreenStack.web.js.map +1 -0
  342. package/lib/module/components/ScreenStackHeaderConfig.js +81 -0
  343. package/lib/module/components/ScreenStackHeaderConfig.js.map +1 -0
  344. package/lib/module/components/ScreenStackHeaderConfig.web.js +14 -0
  345. package/lib/module/components/ScreenStackHeaderConfig.web.js.map +1 -0
  346. package/lib/module/components/ScreenStackItem.js +98 -0
  347. package/lib/module/components/ScreenStackItem.js.map +1 -0
  348. package/lib/module/components/SearchBar.js +57 -0
  349. package/lib/module/components/SearchBar.js.map +1 -0
  350. package/lib/module/components/SearchBar.web.js +4 -0
  351. package/lib/module/components/SearchBar.web.js.map +1 -0
  352. package/lib/module/components/helpers/DelayedFreeze.js +24 -0
  353. package/lib/module/components/helpers/DelayedFreeze.js.map +1 -0
  354. package/lib/module/components/helpers/usePrevious.js +9 -0
  355. package/lib/module/components/helpers/usePrevious.js.map +1 -0
  356. package/lib/module/contexts.js +4 -0
  357. package/lib/module/contexts.js.map +1 -0
  358. package/lib/module/core.js +31 -0
  359. package/lib/module/core.js.map +1 -0
  360. package/lib/module/fabric/FullWindowOverlayNativeComponent.js +16 -0
  361. package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
  362. package/lib/module/fabric/ModalScreenNativeComponent.js +10 -0
  363. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -0
  364. package/lib/module/fabric/NativeScreensModule.js +5 -0
  365. package/lib/module/fabric/NativeScreensModule.js.map +1 -0
  366. package/lib/module/fabric/NativeScreensModule.web.js +2 -0
  367. package/lib/module/fabric/NativeScreensModule.web.js.map +1 -0
  368. package/lib/module/fabric/ScreenContainerNativeComponent.js +3 -4
  369. package/lib/module/fabric/ScreenContainerNativeComponent.js.map +1 -1
  370. package/lib/module/fabric/ScreenContentWrapperNativeComponent.js +10 -0
  371. package/lib/module/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
  372. package/lib/module/fabric/ScreenFooterNativeComponent.js +3 -0
  373. package/lib/module/fabric/ScreenFooterNativeComponent.js.map +1 -0
  374. package/lib/module/fabric/ScreenNativeComponent.js +11 -8
  375. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  376. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js +2 -0
  377. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -1
  378. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +8 -2
  379. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  380. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +5 -1
  381. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  382. package/lib/module/fabric/ScreenStackNativeComponent.js +3 -3
  383. package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -1
  384. package/lib/module/fabric/SearchBarNativeComponent.js +3 -1
  385. package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -1
  386. package/lib/module/gesture-handler/GestureDetectorProvider.js +12 -0
  387. package/lib/module/gesture-handler/GestureDetectorProvider.js.map +1 -0
  388. package/lib/module/gesture-handler/RNScreensTurboModule.js +2 -0
  389. package/lib/module/gesture-handler/RNScreensTurboModule.js.map +1 -0
  390. package/lib/module/gesture-handler/ScreenGestureDetector.js +193 -0
  391. package/lib/module/gesture-handler/ScreenGestureDetector.js.map +1 -0
  392. package/lib/module/gesture-handler/constraints.js +56 -0
  393. package/lib/module/gesture-handler/constraints.js.map +1 -0
  394. package/lib/module/gesture-handler/defaults.js +39 -0
  395. package/lib/module/gesture-handler/defaults.js.map +1 -0
  396. package/lib/module/gesture-handler/fabricUtils.js +61 -0
  397. package/lib/module/gesture-handler/fabricUtils.js.map +1 -0
  398. package/lib/module/gesture-handler/fabricUtils.web.js +10 -0
  399. package/lib/module/gesture-handler/fabricUtils.web.js.map +1 -0
  400. package/lib/module/gesture-handler/index.js +5 -0
  401. package/lib/module/gesture-handler/index.js.map +1 -0
  402. package/lib/module/index.js +29 -63
  403. package/lib/module/index.js.map +1 -1
  404. package/lib/module/native-stack/contexts/GHContext.js +6 -0
  405. package/lib/module/native-stack/contexts/GHContext.js.map +1 -0
  406. package/lib/module/native-stack/index.js.map +1 -1
  407. package/lib/module/native-stack/navigators/createNativeStackNavigator.js +21 -20
  408. package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  409. package/lib/module/native-stack/types.js.map +1 -1
  410. package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -1
  411. package/lib/module/native-stack/utils/HeaderHeightContext.js.map +1 -1
  412. package/lib/module/native-stack/utils/SafeAreaProviderCompat.js.map +1 -1
  413. package/lib/module/native-stack/utils/getDefaultHeaderHeight.js.map +1 -1
  414. package/lib/module/native-stack/utils/getStatusBarHeight.js +16 -0
  415. package/lib/module/native-stack/utils/getStatusBarHeight.js.map +1 -0
  416. package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -1
  417. package/lib/module/native-stack/utils/useBackPressSubscription.js +2 -4
  418. package/lib/module/native-stack/utils/useBackPressSubscription.js.map +1 -1
  419. package/lib/module/native-stack/utils/useHeaderHeight.js.map +1 -1
  420. package/lib/module/native-stack/views/FontProcessor.js +2 -3
  421. package/lib/module/native-stack/views/FontProcessor.js.map +1 -1
  422. package/lib/module/native-stack/views/FooterComponent.js +10 -0
  423. package/lib/module/native-stack/views/FooterComponent.js.map +1 -0
  424. package/lib/module/native-stack/views/HeaderConfig.js +13 -6
  425. package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
  426. package/lib/module/native-stack/views/NativeStackView.js +114 -46
  427. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  428. package/lib/module/reanimated/ReanimatedHeaderHeightContext.js.map +1 -1
  429. package/lib/module/reanimated/ReanimatedNativeStackScreen.js +8 -12
  430. package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
  431. package/lib/module/reanimated/ReanimatedScreen.js +1 -2
  432. package/lib/module/reanimated/ReanimatedScreen.js.map +1 -1
  433. package/lib/module/reanimated/ReanimatedScreenProvider.js +7 -15
  434. package/lib/module/reanimated/ReanimatedScreenProvider.js.map +1 -1
  435. package/lib/module/reanimated/ReanimatedTransitionProgressContext.js.map +1 -1
  436. package/lib/module/reanimated/index.js.map +1 -1
  437. package/lib/module/reanimated/useReanimatedHeaderHeight.js +1 -1
  438. package/lib/module/reanimated/useReanimatedHeaderHeight.js.map +1 -1
  439. package/lib/module/reanimated/useReanimatedTransitionProgress.js.map +1 -1
  440. package/lib/module/types.js.map +1 -1
  441. package/lib/module/useTransitionProgress.js.map +1 -1
  442. package/lib/module/utils.js +26 -5
  443. package/lib/module/utils.js.map +1 -1
  444. package/lib/typescript/TransitionProgressContext.d.ts +2 -1
  445. package/lib/typescript/TransitionProgressContext.d.ts.map +1 -0
  446. package/lib/typescript/components/DebugContainer.d.ts +15 -0
  447. package/lib/typescript/components/DebugContainer.d.ts.map +1 -0
  448. package/lib/typescript/components/DebugContainer.web.d.ts +4 -0
  449. package/lib/typescript/components/DebugContainer.web.d.ts.map +1 -0
  450. package/lib/typescript/components/FullWindowOverlay.d.ts +6 -0
  451. package/lib/typescript/components/FullWindowOverlay.d.ts.map +1 -0
  452. package/lib/typescript/components/FullWindowOverlay.web.d.ts +6 -0
  453. package/lib/typescript/components/FullWindowOverlay.web.d.ts.map +1 -0
  454. package/lib/typescript/components/Screen.d.ts +8 -0
  455. package/lib/typescript/components/Screen.d.ts.map +1 -0
  456. package/lib/typescript/components/Screen.web.d.ts +11 -0
  457. package/lib/typescript/components/Screen.web.d.ts.map +1 -0
  458. package/lib/typescript/components/ScreenContainer.d.ts +5 -0
  459. package/lib/typescript/components/ScreenContainer.d.ts.map +1 -0
  460. package/lib/typescript/components/ScreenContainer.web.d.ts +4 -0
  461. package/lib/typescript/components/ScreenContainer.web.d.ts.map +1 -0
  462. package/lib/typescript/components/ScreenContentWrapper.d.ts +5 -0
  463. package/lib/typescript/components/ScreenContentWrapper.d.ts.map +1 -0
  464. package/lib/typescript/components/ScreenContentWrapper.web.d.ts +4 -0
  465. package/lib/typescript/components/ScreenContentWrapper.web.d.ts.map +1 -0
  466. package/lib/typescript/components/ScreenFooter.d.ts +12 -0
  467. package/lib/typescript/components/ScreenFooter.d.ts.map +1 -0
  468. package/lib/typescript/components/ScreenFooter.web.d.ts +6 -0
  469. package/lib/typescript/components/ScreenFooter.web.d.ts.map +1 -0
  470. package/lib/typescript/components/ScreenStack.d.ts +5 -0
  471. package/lib/typescript/components/ScreenStack.d.ts.map +1 -0
  472. package/lib/typescript/components/ScreenStack.web.d.ts +4 -0
  473. package/lib/typescript/components/ScreenStack.web.d.ts.map +1 -0
  474. package/lib/typescript/components/ScreenStackHeaderConfig.d.ts +13 -0
  475. package/lib/typescript/components/ScreenStackHeaderConfig.d.ts.map +1 -0
  476. package/lib/typescript/components/ScreenStackHeaderConfig.web.d.ts +13 -0
  477. package/lib/typescript/components/ScreenStackHeaderConfig.web.d.ts.map +1 -0
  478. package/lib/typescript/components/ScreenStackItem.d.ts +11 -0
  479. package/lib/typescript/components/ScreenStackItem.d.ts.map +1 -0
  480. package/lib/typescript/components/SearchBar.d.ts +5 -0
  481. package/lib/typescript/components/SearchBar.d.ts.map +1 -0
  482. package/lib/typescript/components/SearchBar.web.d.ts +4 -0
  483. package/lib/typescript/components/SearchBar.web.d.ts.map +1 -0
  484. package/lib/typescript/components/helpers/DelayedFreeze.d.ts +8 -0
  485. package/lib/typescript/components/helpers/DelayedFreeze.d.ts.map +1 -0
  486. package/lib/typescript/components/helpers/usePrevious.d.ts +2 -0
  487. package/lib/typescript/components/helpers/usePrevious.d.ts.map +1 -0
  488. package/lib/typescript/contexts.d.ts +5 -0
  489. package/lib/typescript/contexts.d.ts.map +1 -0
  490. package/lib/typescript/core.d.ts +6 -0
  491. package/lib/typescript/core.d.ts.map +1 -0
  492. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts +1 -1
  493. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts.map +1 -0
  494. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +76 -0
  495. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -0
  496. package/lib/typescript/fabric/NativeScreensModule.d.ts +6 -0
  497. package/lib/typescript/fabric/NativeScreensModule.d.ts.map +1 -0
  498. package/lib/typescript/fabric/NativeScreensModule.web.d.ts +3 -0
  499. package/lib/typescript/fabric/NativeScreensModule.web.d.ts.map +1 -0
  500. package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts +1 -0
  501. package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts.map +1 -0
  502. package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts +6 -0
  503. package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts.map +1 -0
  504. package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts +7 -0
  505. package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts.map +1 -0
  506. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +34 -24
  507. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -0
  508. package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts +1 -1
  509. package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts.map +1 -0
  510. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +12 -2
  511. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -0
  512. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -2
  513. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -0
  514. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +4 -2
  515. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -0
  516. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +17 -16
  517. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -0
  518. package/lib/typescript/gesture-handler/GestureDetectorProvider.d.ts +5 -0
  519. package/lib/typescript/gesture-handler/GestureDetectorProvider.d.ts.map +1 -0
  520. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts +13 -0
  521. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts.map +1 -0
  522. package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts +5 -0
  523. package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts.map +1 -0
  524. package/lib/typescript/gesture-handler/constraints.d.ts +6 -0
  525. package/lib/typescript/gesture-handler/constraints.d.ts.map +1 -0
  526. package/lib/typescript/gesture-handler/defaults.d.ts +20 -0
  527. package/lib/typescript/gesture-handler/defaults.d.ts.map +1 -0
  528. package/lib/typescript/gesture-handler/fabricUtils.d.ts +10 -0
  529. package/lib/typescript/gesture-handler/fabricUtils.d.ts.map +1 -0
  530. package/lib/typescript/gesture-handler/fabricUtils.web.d.ts +6 -0
  531. package/lib/typescript/gesture-handler/fabricUtils.web.d.ts.map +1 -0
  532. package/lib/typescript/gesture-handler/index.d.ts +2 -0
  533. package/lib/typescript/gesture-handler/index.d.ts.map +1 -0
  534. package/lib/typescript/index.d.ts +25 -31
  535. package/lib/typescript/index.d.ts.map +1 -0
  536. package/lib/typescript/native-stack/contexts/GHContext.d.ts +4 -0
  537. package/lib/typescript/native-stack/contexts/GHContext.d.ts.map +1 -0
  538. package/lib/typescript/native-stack/index.d.ts +1 -0
  539. package/lib/typescript/native-stack/index.d.ts.map +1 -0
  540. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +4 -0
  541. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts.map +1 -0
  542. package/lib/typescript/native-stack/types.d.ts +191 -33
  543. package/lib/typescript/native-stack/types.d.ts.map +1 -0
  544. package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts +1 -0
  545. package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts.map +1 -0
  546. package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts +1 -0
  547. package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts.map +1 -0
  548. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +2 -1
  549. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts.map +1 -0
  550. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +3 -2
  551. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts.map +1 -0
  552. package/lib/typescript/native-stack/utils/getStatusBarHeight.d.ts +3 -0
  553. package/lib/typescript/native-stack/utils/getStatusBarHeight.d.ts.map +1 -0
  554. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +2 -1
  555. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts.map +1 -0
  556. package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts +1 -0
  557. package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts.map +1 -0
  558. package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts +1 -0
  559. package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts.map +1 -0
  560. package/lib/typescript/native-stack/views/FontProcessor.d.ts +1 -0
  561. package/lib/typescript/native-stack/views/FontProcessor.d.ts.map +1 -0
  562. package/lib/typescript/native-stack/views/FooterComponent.d.ts +7 -0
  563. package/lib/typescript/native-stack/views/FooterComponent.d.ts.map +1 -0
  564. package/lib/typescript/native-stack/views/HeaderConfig.d.ts +3 -2
  565. package/lib/typescript/native-stack/views/HeaderConfig.d.ts.map +1 -0
  566. package/lib/typescript/native-stack/views/NativeStackView.d.ts +2 -1
  567. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -0
  568. package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts +1 -0
  569. package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts.map +1 -0
  570. package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts +3 -3
  571. package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts.map +1 -0
  572. package/lib/typescript/reanimated/ReanimatedScreen.d.ts +3 -3
  573. package/lib/typescript/reanimated/ReanimatedScreen.d.ts.map +1 -0
  574. package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts +1 -0
  575. package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts.map +1 -0
  576. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +2 -1
  577. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts.map +1 -0
  578. package/lib/typescript/reanimated/index.d.ts +1 -0
  579. package/lib/typescript/reanimated/index.d.ts.map +1 -0
  580. package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts +2 -3
  581. package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts.map +1 -0
  582. package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts +4 -9
  583. package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts.map +1 -0
  584. package/lib/typescript/types.d.ts +186 -36
  585. package/lib/typescript/types.d.ts.map +1 -0
  586. package/lib/typescript/useTransitionProgress.d.ts +4 -3
  587. package/lib/typescript/useTransitionProgress.d.ts.map +1 -0
  588. package/lib/typescript/utils.d.ts +27 -1
  589. package/lib/typescript/utils.d.ts.map +1 -0
  590. package/native-stack/README.md +156 -108
  591. package/native-stack/package.json +4 -4
  592. package/package.json +1 -1
  593. package/react-native.config.js +19 -16
  594. package/reanimated/package.json +1 -1
  595. package/src/TransitionProgressContext.tsx +3 -1
  596. package/src/components/DebugContainer.tsx +46 -0
  597. package/src/components/DebugContainer.web.tsx +7 -0
  598. package/src/components/FullWindowOverlay.tsx +33 -0
  599. package/src/components/FullWindowOverlay.web.tsx +6 -0
  600. package/src/components/Screen.tsx +392 -0
  601. package/src/components/Screen.web.tsx +46 -0
  602. package/src/components/ScreenContainer.tsx +28 -0
  603. package/src/components/ScreenContainer.web.tsx +5 -0
  604. package/src/components/ScreenContentWrapper.tsx +9 -0
  605. package/src/components/ScreenContentWrapper.web.tsx +5 -0
  606. package/src/components/ScreenFooter.tsx +20 -0
  607. package/src/components/ScreenFooter.web.tsx +7 -0
  608. package/src/components/ScreenStack.tsx +112 -0
  609. package/src/components/ScreenStack.web.tsx +5 -0
  610. package/src/components/ScreenStackHeaderConfig.tsx +122 -0
  611. package/src/components/ScreenStackHeaderConfig.web.tsx +39 -0
  612. package/src/components/ScreenStackItem.tsx +174 -0
  613. package/src/components/SearchBar.tsx +102 -0
  614. package/src/components/SearchBar.web.tsx +5 -0
  615. package/src/components/helpers/DelayedFreeze.tsx +27 -0
  616. package/src/components/helpers/usePrevious.tsx +11 -0
  617. package/src/contexts.tsx +9 -0
  618. package/src/core.ts +45 -0
  619. package/src/fabric/FullWindowOverlayNativeComponent.ts +16 -0
  620. package/src/fabric/ModalScreenNativeComponent.ts +115 -0
  621. package/src/fabric/NativeScreensModule.ts +8 -0
  622. package/src/fabric/NativeScreensModule.web.ts +1 -0
  623. package/src/fabric/ScreenContainerNativeComponent.ts +3 -3
  624. package/src/fabric/ScreenContentWrapperNativeComponent.ts +14 -0
  625. package/src/fabric/ScreenFooterNativeComponent.ts +6 -0
  626. package/src/fabric/ScreenNativeComponent.ts +36 -23
  627. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +3 -1
  628. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +38 -2
  629. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +5 -1
  630. package/src/fabric/ScreenStackNativeComponent.ts +3 -2
  631. package/src/fabric/SearchBarNativeComponent.ts +17 -13
  632. package/src/gesture-handler/GestureDetectorProvider.tsx +16 -0
  633. package/src/gesture-handler/RNScreensTurboModule.ts +13 -0
  634. package/src/gesture-handler/ScreenGestureDetector.tsx +241 -0
  635. package/src/gesture-handler/constraints.ts +87 -0
  636. package/src/gesture-handler/defaults.ts +46 -0
  637. package/src/gesture-handler/fabricUtils.ts +86 -0
  638. package/src/gesture-handler/fabricUtils.web.ts +10 -0
  639. package/src/gesture-handler/index.tsx +4 -0
  640. package/src/index.tsx +49 -112
  641. package/src/native-stack/contexts/GHContext.tsx +9 -0
  642. package/src/native-stack/navigators/createNativeStackNavigator.tsx +6 -3
  643. package/src/native-stack/types.tsx +204 -31
  644. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +2 -2
  645. package/src/native-stack/utils/getStatusBarHeight.tsx +22 -0
  646. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
  647. package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
  648. package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
  649. package/src/native-stack/views/FontProcessor.tsx +2 -2
  650. package/src/native-stack/views/FooterComponent.tsx +10 -0
  651. package/src/native-stack/views/HeaderConfig.tsx +20 -5
  652. package/src/native-stack/views/NativeStackView.tsx +137 -53
  653. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
  654. package/src/reanimated/ReanimatedNativeStackScreen.tsx +15 -13
  655. package/src/reanimated/ReanimatedScreen.tsx +4 -3
  656. package/src/reanimated/ReanimatedScreenProvider.tsx +3 -2
  657. package/src/reanimated/useReanimatedHeaderHeight.tsx +2 -2
  658. package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
  659. package/src/types.tsx +210 -40
  660. package/src/useTransitionProgress.tsx +1 -1
  661. package/src/utils.ts +27 -5
  662. package/windows/README.md +4 -1
  663. package/windows/RNScreens/Screen.h +3 -1
  664. package/SystemBundles/8f5a820b958535e533acb38dbc0c72c1837721b9db075f4a1740e42b9fee3910.bundle +0 -33668
  665. package/SystemBundles/8f5a820b958535e533acb38dbc0c72c1837721b9db075f4a1740e42b9fee3910.map +0 -1
  666. package/SystemModules/amzn__react-native-screens.modules.txt +0 -101
  667. package/SystemModules/amzn__react-native-screens.private.modules.txt +0 -244
  668. package/lib/commonjs/index.native.js +0 -407
  669. package/lib/commonjs/index.native.js.map +0 -1
  670. package/lib/module/index.native.js +0 -410
  671. package/lib/module/index.native.js.map +0 -1
  672. package/lib/typescript/index.native.d.ts +0 -2
  673. package/src/index.native.tsx +0 -599
@@ -1,12 +1,15 @@
1
1
  #ifdef RCT_NEW_ARCH_ENABLED
2
2
  #import <React/RCTFabricComponentsPlugins.h>
3
+ #import <React/RCTFabricSurface.h>
3
4
  #import <React/RCTMountingTransactionObserving.h>
4
5
  #import <React/RCTSurfaceTouchHandler.h>
6
+ #import <React/RCTSurfaceView.h>
5
7
  #import <React/UIView+React.h>
6
8
  #import <react/renderer/components/rnscreens/ComponentDescriptors.h>
7
9
  #import <react/renderer/components/rnscreens/EventEmitters.h>
8
10
  #import <react/renderer/components/rnscreens/Props.h>
9
11
  #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
12
+ #import "RCTSurfaceTouchHandler+RNSUtility.h"
10
13
  #else
11
14
  #import <React/RCTBridge.h>
12
15
  #import <React/RCTRootContentView.h>
@@ -14,13 +17,19 @@
14
17
  #import <React/RCTTouchHandler.h>
15
18
  #import <React/RCTUIManager.h>
16
19
  #import <React/RCTUIManagerUtils.h>
20
+ #import "RCTTouchHandler+RNSUtility.h"
17
21
  #endif // RCT_NEW_ARCH_ENABLED
18
22
 
23
+ #import "RNSDefines.h"
24
+ #import "RNSPercentDrivenInteractiveTransition.h"
19
25
  #import "RNSScreen.h"
20
26
  #import "RNSScreenStack.h"
21
27
  #import "RNSScreenStackAnimator.h"
22
28
  #import "RNSScreenStackHeaderConfig.h"
23
29
  #import "RNSScreenWindowTraits.h"
30
+ #import "utils/UINavigationBar+RNSUtility.h"
31
+
32
+ #import "UIView+RNSUtility.h"
24
33
 
25
34
  #ifdef RCT_NEW_ARCH_ENABLED
26
35
  namespace react = facebook::react;
@@ -66,13 +75,18 @@ namespace react = facebook::react;
66
75
  [super viewDidLayoutSubviews];
67
76
  if ([self.topViewController isKindOfClass:[RNSScreen class]]) {
68
77
  RNSScreen *screenController = (RNSScreen *)self.topViewController;
78
+ BOOL isNotDismissingModal = screenController.presentedViewController == nil ||
79
+ (screenController.presentedViewController != nil &&
80
+ ![screenController.presentedViewController isBeingDismissed]);
69
81
 
70
82
  // Calculate header height during simple transition from one screen to another.
71
83
  // If RNSScreen includes a navigation controller of type RNSNavigationController, it should not calculate
72
84
  // header height, as it could have nested stack.
73
- if (![screenController hasNestedStack]) {
74
- [(RNSScreen *)self.topViewController calculateAndNotifyHeaderHeightChangeIsModal:NO];
85
+ if (![screenController hasNestedStack] && isNotDismissingModal) {
86
+ [screenController calculateAndNotifyHeaderHeightChangeIsModal:NO];
75
87
  }
88
+
89
+ [self maybeUpdateHeaderInsetsInShadowTreeForScreen:screenController];
76
90
  }
77
91
  }
78
92
 
@@ -85,11 +99,40 @@ namespace react = facebook::react;
85
99
  {
86
100
  return [self topViewController];
87
101
  }
102
+
103
+ - (void)maybeUpdateHeaderInsetsInShadowTreeForScreen:(RNSScreen *)screenController
104
+ {
105
+ // This might happen e.g. if there is only native title present in navigation bar.
106
+ if (self.navigationBar.subviews.count < 2) {
107
+ return;
108
+ }
109
+
110
+ auto headerConfig = screenController.screenView.findHeaderConfig;
111
+ if (headerConfig == nil || !headerConfig.shouldHeaderBeVisible) {
112
+ return;
113
+ }
114
+
115
+ NSDirectionalEdgeInsets navBarMargins = [self.navigationBar directionalLayoutMargins];
116
+ NSDirectionalEdgeInsets navBarContentMargins =
117
+ [self.navigationBar.rnscreens_findContentView directionalLayoutMargins];
118
+
119
+ BOOL isDisplayingBackButton = [headerConfig shouldBackButtonBeVisibleInNavigationBar:self.navigationBar];
120
+
121
+ // 44.0 is just "closed eyes default". It is so on device I've tested with, nothing more.
122
+ UIView *barButtonView = isDisplayingBackButton ? self.navigationBar.rnscreens_findBackButtonWrapperView : nil;
123
+ CGFloat platformBackButtonWidth = barButtonView != nil ? barButtonView.frame.size.width : 44.0f;
124
+
125
+ [headerConfig updateHeaderInsetsInShadowTreeTo:NSDirectionalEdgeInsets{
126
+ .leading = navBarMargins.leading + navBarContentMargins.leading +
127
+ (isDisplayingBackButton ? platformBackButtonWidth : 0),
128
+ .trailing = navBarMargins.trailing + navBarContentMargins.trailing,
129
+ }];
130
+ }
88
131
  #endif
89
132
 
90
133
  @end
91
134
 
92
- #if !TARGET_OS_TV
135
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
93
136
  @interface RNSScreenEdgeGestureRecognizer : UIScreenEdgePanGestureRecognizer
94
137
  @end
95
138
 
@@ -108,16 +151,26 @@ namespace react = facebook::react;
108
151
  NSMutableArray<RNSScreenView *> *_reactSubviews;
109
152
  BOOL _invalidated;
110
153
  BOOL _isFullWidthSwiping;
111
- UIPercentDrivenInteractiveTransition *_interactionController;
112
- BOOL _hasLayout;
154
+ RNSPercentDrivenInteractiveTransition *_interactionController;
113
155
  __weak RNSScreenStackManager *_manager;
114
156
  BOOL _updateScheduled;
115
157
  #ifdef RCT_NEW_ARCH_ENABLED
116
- UIView *_snapshot;
117
- #endif
158
+ /// Screens that are subject of `ShadowViewMutation::Type::Delete` mutation
159
+ /// in current transaction. This vector should be populated when we receive notification via
160
+ /// `RCTMountingObserving` protocol, that a transaction will be performed, and should
161
+ /// be cleaned up when we're notified that the transaction has been completed.
162
+ std::vector<__strong RNSScreenView *> _toBeDeletedScreens;
163
+ #endif // RCT_NEW_ARCH_ENABLED
118
164
  }
119
165
 
120
166
  #ifdef RCT_NEW_ARCH_ENABLED
167
+
168
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
169
+ + (void)load
170
+ {
171
+ [super load];
172
+ }
173
+
121
174
  - (instancetype)initWithFrame:(CGRect)frame
122
175
  {
123
176
  if (self = [super initWithFrame:frame]) {
@@ -133,7 +186,6 @@ namespace react = facebook::react;
133
186
  - (instancetype)initWithManager:(RNSScreenStackManager *)manager
134
187
  {
135
188
  if (self = [super init]) {
136
- _hasLayout = NO;
137
189
  _invalidated = NO;
138
190
  _manager = manager;
139
191
  [self initCommonProps];
@@ -147,7 +199,7 @@ namespace react = facebook::react;
147
199
  _presentedModals = [NSMutableArray new];
148
200
  _controller = [RNSNavigationController new];
149
201
  _controller.delegate = self;
150
- #if !TARGET_OS_TV
202
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
151
203
  [self setupGestureHandlers];
152
204
  #endif
153
205
  // we have to initialize viewControllers with a non empty array for
@@ -192,21 +244,16 @@ namespace react = facebook::react;
192
244
  willShowViewController:(UIViewController *)viewController
193
245
  animated:(BOOL)animated
194
246
  {
195
- UIView *view = viewController.view;
196
247
  #ifdef RCT_NEW_ARCH_ENABLED
197
- if (![view isKindOfClass:[RNSScreenView class]]) {
248
+ if (![viewController.view isKindOfClass:[RNSScreenView class]]) {
198
249
  // if the current view is a snapshot, config was already removed so we don't trigger the method
199
250
  return;
200
251
  }
201
252
  #endif
202
- RNSScreenStackHeaderConfig *config = nil;
203
- for (UIView *subview in view.reactSubviews) {
204
- if ([subview isKindOfClass:[RNSScreenStackHeaderConfig class]]) {
205
- config = (RNSScreenStackHeaderConfig *)subview;
206
- break;
207
- }
208
- }
209
- [RNSScreenStackHeaderConfig willShowViewController:viewController animated:animated withConfig:config];
253
+ auto *screenView = static_cast<RNSScreenView *>(viewController.view);
254
+ [RNSScreenStackHeaderConfig willShowViewController:viewController
255
+ animated:animated
256
+ withConfig:screenView.findHeaderConfig];
210
257
  }
211
258
 
212
259
  - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
@@ -239,10 +286,12 @@ namespace react = facebook::react;
239
286
  }
240
287
  }
241
288
 
289
+ RNS_IGNORE_SUPER_CALL_BEGIN
242
290
  - (NSArray<UIView *> *)reactSubviews
243
291
  {
244
292
  return _reactSubviews;
245
293
  }
294
+ RNS_IGNORE_SUPER_CALL_END
246
295
 
247
296
  - (void)didMoveToWindow
248
297
  {
@@ -263,18 +312,9 @@ namespace react = facebook::react;
263
312
  - (void)maybeAddToParentAndUpdateContainer
264
313
  {
265
314
  BOOL wasScreenMounted = _controller.parentViewController != nil;
266
- #ifdef RCT_NEW_ARCH_ENABLED
267
- BOOL isScreenReadyForShowing = self.window;
268
- #else
269
- BOOL isScreenReadyForShowing = self.window && _hasLayout;
270
- #endif
271
- if (!isScreenReadyForShowing && !wasScreenMounted) {
272
- // We wait with adding to parent controller until the stack is mounted and has its initial
273
- // layout done.
274
- // If we add it before layout, some of the items (specifically items from the navigation bar),
275
- // won't be able to position properly. Also the position and size of such items, even if it
276
- // happens to change, won't be properly updated (this is perhaps some internal issue of UIKit).
277
- // If we add it when window is not attached, some of the view transitions will be bloced (i.e.
315
+ if (!self.window && !wasScreenMounted) {
316
+ // We wait with adding to parent controller until the stack is mounted.
317
+ // If we add it when window is not attached, some of the view transitions will be blocked (i.e.
278
318
  // modal transitions) and the internal view controler's state will get out of sync with what's
279
319
  // on screen without us knowing.
280
320
  return;
@@ -320,6 +360,38 @@ namespace react = facebook::react;
320
360
  }
321
361
  }
322
362
 
363
+ + (UIViewController *)findTopMostPresentedViewControllerFromViewController:(UIViewController *)controller
364
+ {
365
+ auto presentedVc = controller;
366
+ while (presentedVc.presentedViewController != nil) {
367
+ presentedVc = presentedVc.presentedViewController;
368
+ }
369
+ return presentedVc;
370
+ }
371
+
372
+ - (UIViewController *)findReactRootViewController
373
+ {
374
+ UIView *parent = self;
375
+ while (parent) {
376
+ parent = parent.reactSuperview;
377
+ if (parent.isReactRootView) {
378
+ return parent.reactViewController;
379
+ }
380
+ }
381
+ return nil;
382
+ }
383
+
384
+ - (UIViewController *)lastFromPresentedViewControllerChainStartingFrom:(UIViewController *)vc
385
+ {
386
+ UIViewController *lastNonNullVc = vc;
387
+ UIViewController *lastVc = vc.presentedViewController;
388
+ while (lastVc != nil) {
389
+ lastNonNullVc = lastVc;
390
+ lastVc = lastVc.presentedViewController;
391
+ }
392
+ return lastNonNullVc;
393
+ }
394
+
323
395
  - (void)setModalViewControllers:(NSArray<UIViewController *> *)controllers
324
396
  {
325
397
  // prevent re-entry
@@ -346,9 +418,18 @@ namespace react = facebook::react;
346
418
  NSMutableArray<UIViewController *> *newControllers = [NSMutableArray arrayWithArray:controllers];
347
419
  [newControllers removeObjectsInArray:_presentedModals];
348
420
 
349
- // find bottom-most controller that should stay on the stack for the duration of transition
421
+ // We need to find bottom-most view controller that should stay on the stack
422
+ // for the duration of transition.
423
+
424
+ // There are couple of scenarios:
425
+ // (1) no modals are presented or all modals were presented by this RNSNavigationController,
426
+ // (2) there are modals presented by other RNSNavigationControllers (nested/outer),
427
+ // (3) there are modals presented by other controllers (e.g. React Native's Modal view).
428
+
429
+ // Last controller that is common for both _presentedModals & controllers
430
+ __block UIViewController *changeRootController = _controller;
431
+ // Last common controller index + 1
350
432
  NSUInteger changeRootIndex = 0;
351
- UIViewController *changeRootController = _controller;
352
433
  for (NSUInteger i = 0; i < MIN(_presentedModals.count, controllers.count); i++) {
353
434
  if (_presentedModals[i] == controllers[i]) {
354
435
  changeRootController = controllers[i];
@@ -400,6 +481,7 @@ namespace react = facebook::react;
400
481
  return;
401
482
  } else {
402
483
  UIViewController *previous = changeRootController;
484
+
403
485
  for (NSUInteger i = changeRootIndex; i < controllers.count; i++) {
404
486
  UIViewController *next = controllers[i];
405
487
  BOOL lastModal = (i == controllers.count - 1);
@@ -437,16 +519,62 @@ namespace react = facebook::react;
437
519
  }
438
520
  };
439
521
 
440
- if (changeRootController.presentedViewController != nil &&
441
- [_presentedModals containsObject:changeRootController.presentedViewController]) {
522
+ // changeRootController is the last controller that *is owned by this stack*, and should stay unchanged after this
523
+ // batch of transitions. Therefore changeRootController.presentedViewController is the first constroller to be
524
+ // dismissed (implying also all controllers above). Notice here, that firstModalToBeDismissed could have been
525
+ // RNSScreen modal presented from *this* stack, another stack, or any other view controller with modal presentation
526
+ // provided by third-party libraries (e.g. React Native's Modal view). In case of presence of other (not managed by
527
+ // us) modal controllers, weird interactions might arise. The code below, besides handling our presentation /
528
+ // dismissal logic also attempts to handle possible wide gamut of cases of interactions with third-party modal
529
+ // controllers, however it's not perfect.
530
+ // TODO: Find general way to manage owned and foreign modal view controllers and refactor this code. Consider building
531
+ // model first (data structue, attempting to be aware of all modals in presentation and some text-like algorithm for
532
+ // computing required operations).
533
+
534
+ UIViewController *firstModalToBeDismissed = changeRootController.presentedViewController;
535
+
536
+ if (firstModalToBeDismissed != nil) {
442
537
  BOOL shouldAnimate = changeRootIndex == controllers.count &&
443
- [changeRootController.presentedViewController isKindOfClass:[RNSScreen class]] &&
444
- ((RNSScreen *)changeRootController.presentedViewController).screenView.stackAnimation !=
445
- RNSScreenStackAnimationNone;
446
- [changeRootController dismissViewControllerAnimated:shouldAnimate completion:finish];
447
- } else {
448
- finish();
538
+ [firstModalToBeDismissed isKindOfClass:[RNSScreen class]] &&
539
+ ((RNSScreen *)firstModalToBeDismissed).screenView.stackAnimation != RNSScreenStackAnimationNone;
540
+
541
+ if ([_presentedModals containsObject:firstModalToBeDismissed] ||
542
+ ![firstModalToBeDismissed isKindOfClass:RNSScreen.class]) {
543
+ // We dismiss every VC that was presented by changeRootController VC or its descendant.
544
+ // After the series of dismissals is completed we run completion block in which
545
+ // we present modals on top of changeRootController (which may be the this stack VC)
546
+ //
547
+ // There also might the second case, where the firstModalToBeDismissed is foreign.
548
+ // See: https://github.com/software-mansion/react-native-screens/issues/2048
549
+ // For now, to mitigate the issue, we also decide to trigger its dismissal before
550
+ // starting the presentation chain down below in finish() callback.
551
+ [changeRootController dismissViewControllerAnimated:shouldAnimate completion:finish];
552
+ return;
553
+ }
554
+ }
555
+
556
+ // changeRootController does not have presentedViewController but it does not mean that no modals are in presentation;
557
+ // modals could be presented by another stack (nested / outer), third-party view controller or they could be using
558
+ // UIModalPresentationCurrentContext / UIModalPresentationOverCurrentContext presentation styles; in the last case
559
+ // for some reason system asks top-level (react root) vc to present instead of our stack, despite the fact that
560
+ // `definesPresentationContext` returns `YES` for UINavigationController.
561
+ // So we first need to find top-level controller manually:
562
+ UIViewController *reactRootVc = [self findReactRootViewController];
563
+ UIViewController *topMostVc = [RNSScreenStackView findTopMostPresentedViewControllerFromViewController:reactRootVc];
564
+
565
+ if (topMostVc != reactRootVc) {
566
+ changeRootController = topMostVc;
567
+
568
+ // Here we handle just the simplest case where the top level VC was dismissed. In any more complex
569
+ // scenario we will still have problems, see: https://github.com/software-mansion/react-native-screens/issues/1813
570
+ if ([_presentedModals containsObject:topMostVc] && ![controllers containsObject:topMostVc]) {
571
+ [changeRootController dismissViewControllerAnimated:YES completion:finish];
572
+ return;
573
+ }
449
574
  }
575
+
576
+ // We didn't detect any controllers for dismissal, thus we start presenting new VCs
577
+ finish();
450
578
  }
451
579
 
452
580
  - (void)setPushViewControllers:(NSArray<UIViewController *> *)controllers
@@ -507,10 +635,16 @@ namespace react = facebook::react;
507
635
  ((RNSScreenView *)top.view).replaceAnimation == RNSScreenReplaceAnimationPush) {
508
636
  // setting new controllers with animation does `push` animation by default
509
637
  #ifdef RCT_NEW_ARCH_ENABLED
510
- auto screenController = (RNSScreen *)top;
511
- [screenController resetViewToScreen];
512
- #endif
638
+ // This is a workaround for the case, when in the app we're trying to do `replace` action on screens, when
639
+ // there's already ongoing transition to some screen. In such case, we're making the snapshot, but we're trying
640
+ // to add it to the wrong superview (where it should be UIViewControllerWrapperView, but it's
641
+ // _UIParallaxDimmingView instead). At the moment of RN 0.74 we can't queue the unmounts for such situation
642
+ // either, so we need to turn off animations, when the view is not yet mounted, but it will appear after the
643
+ // transition of previous replacement.
644
+ [_controller setViewControllers:controllers animated:previousTop.view.window != nil];
645
+ #else
513
646
  [_controller setViewControllers:controllers animated:YES];
647
+ #endif // RCT_NEW_ARCH_ENABLED
514
648
  } else {
515
649
  // last top controller is no longer on stack
516
650
  // in this case we set the controllers stack to the new list with
@@ -526,11 +660,8 @@ namespace react = facebook::react;
526
660
  // no animation and do animated push of the last item
527
661
  NSMutableArray *newControllers = [NSMutableArray arrayWithArray:controllers];
528
662
  [newControllers removeLastObject];
663
+
529
664
  [_controller setViewControllers:newControllers animated:NO];
530
- #ifdef RCT_NEW_ARCH_ENABLED
531
- auto screenController = (RNSScreen *)top;
532
- [screenController resetViewToScreen];
533
- #endif
534
665
  [_controller pushViewController:top animated:YES];
535
666
  } else {
536
667
  // don't really know what this case could be, but may need to handle it
@@ -548,7 +679,7 @@ namespace react = facebook::react;
548
679
  NSMutableArray<UIViewController *> *pushControllers = [NSMutableArray new];
549
680
  NSMutableArray<UIViewController *> *modalControllers = [NSMutableArray new];
550
681
  for (RNSScreenView *screen in _reactSubviews) {
551
- if (!screen.dismissed && screen.controller != nil) {
682
+ if (!screen.dismissed && screen.controller != nil && screen.activityState != RNSActivityStateInactive) {
552
683
  if (pushControllers.count == 0) {
553
684
  // first screen on the list needs to be places as "push controller"
554
685
  [pushControllers addObject:screen.controller];
@@ -570,19 +701,32 @@ namespace react = facebook::react;
570
701
  {
571
702
  [super layoutSubviews];
572
703
  _controller.view.frame = self.bounds;
704
+
705
+ // We need to update the bounds of the modal views here, since
706
+ // for contained modals they are not updated by modals themselves.
707
+ for (UIViewController *modal in _presentedModals) {
708
+ // Because `layoutSubviews` method is also called on grabbing the modal,
709
+ // we don't want to update the frame when modal is being dismissed.
710
+ // We also want to get the frame in correct position. In the best case, it
711
+ // should be modal's superview (UITransitionView), which frame is being changed correctly.
712
+ // Otherwise, when superview is nil, we will fallback to the bounds of the ScreenStack.
713
+ BOOL isModalBeingDismissed = [modal isKindOfClass:[RNSScreen class]] && ((RNSScreen *)modal).isBeingDismissed;
714
+ CGRect correctFrame = modal.view.superview != nil ? modal.view.superview.frame : self.bounds;
715
+
716
+ if (!CGRectEqualToRect(modal.view.frame, correctFrame) && !isModalBeingDismissed) {
717
+ modal.view.frame = correctFrame;
718
+ }
719
+ }
573
720
  }
574
721
 
575
722
  - (void)dismissOnReload
576
723
  {
577
724
  #ifdef RCT_NEW_ARCH_ENABLED
578
- if ([_controller.visibleViewController isKindOfClass:[RNSScreen class]]) {
579
- [(RNSScreen *)_controller.visibleViewController resetViewToScreen];
580
- }
581
725
  #else
582
726
  dispatch_async(dispatch_get_main_queue(), ^{
583
727
  [self invalidate];
584
728
  });
585
- #endif
729
+ #endif // RCT_NEW_ARCH_ENABLED
586
730
  }
587
731
 
588
732
  #pragma mark methods connected to transitioning
@@ -605,7 +749,7 @@ namespace react = facebook::react;
605
749
  // Also, we need to return the animator when full width swiping even if the animation is not custom,
606
750
  // otherwise the screen will be just popped immediately due to no animation
607
751
  ((operation == UINavigationControllerOperationPop && shouldCancelDismiss) || _isFullWidthSwiping ||
608
- [RNSScreenStackAnimator isCustomAnimation:screen.stackAnimation])) {
752
+ [RNSScreenStackAnimator isCustomAnimation:screen.stackAnimation] || _customAnimation)) {
609
753
  return [[RNSScreenStackAnimator alloc] initWithOperation:operation];
610
754
  }
611
755
  return nil;
@@ -617,26 +761,18 @@ namespace react = facebook::react;
617
761
  // item is close to an edge and we start pulling from edge we want the Touchable to be cancelled.
618
762
  // Without the below code the Touchable will remain active (highlighted) for the duration of back
619
763
  // gesture and onPress may fire when we release the finger.
620
- UIView *parent = _controller.view;
621
- while (parent != nil && ![parent respondsToSelector:@selector(touchHandler)])
622
- parent = parent.superview;
623
- if (parent != nil) {
624
- #ifdef RCT_NEW_ARCH_ENABLED
625
- RCTSurfaceTouchHandler *touchHandler = [parent performSelector:@selector(touchHandler)];
626
- #else
627
- RCTTouchHandler *touchHandler = [parent performSelector:@selector(touchHandler)];
628
- #endif
629
- [touchHandler setEnabled:NO];
630
- [touchHandler setEnabled:YES];
631
- [touchHandler reset];
632
- }
764
+
765
+ [[self rnscreens_findTouchHandlerInAncestorChain] rnscreens_cancelTouches];
633
766
  }
634
767
 
635
768
  - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
636
769
  {
770
+ if (_disableSwipeBack) {
771
+ return NO;
772
+ }
637
773
  RNSScreenView *topScreen = _reactSubviews.lastObject;
638
774
 
639
- #if TARGET_OS_TV
775
+ #if TARGET_OS_TV || TARGET_OS_VISION
640
776
  [self cancelTouchesInParent];
641
777
  return YES;
642
778
  #else
@@ -654,12 +790,14 @@ namespace react = facebook::react;
654
790
  // Now we're dealing with RNSScreenEdgeGestureRecognizer (or _UIParallaxTransitionPanGestureRecognizer)
655
791
  if (topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation]) {
656
792
  if ([gestureRecognizer isKindOfClass:[RNSScreenEdgeGestureRecognizer class]]) {
793
+ UIRectEdge edges = ((RNSScreenEdgeGestureRecognizer *)gestureRecognizer).edges;
794
+ BOOL isRTL = _controller.view.semanticContentAttribute == UISemanticContentAttributeForceRightToLeft;
795
+ BOOL isSlideFromLeft = topScreen.stackAnimation == RNSScreenStackAnimationSlideFromLeft;
657
796
  // if we do not set any explicit `semanticContentAttribute`, it is `UISemanticContentAttributeUnspecified` instead
658
797
  // of `UISemanticContentAttributeForceLeftToRight`, so we just check if it is RTL or not
659
- BOOL isCorrectEdge = (_controller.view.semanticContentAttribute == UISemanticContentAttributeForceRightToLeft &&
660
- ((RNSScreenEdgeGestureRecognizer *)gestureRecognizer).edges == UIRectEdgeRight) ||
661
- (_controller.view.semanticContentAttribute != UISemanticContentAttributeForceRightToLeft &&
662
- ((RNSScreenEdgeGestureRecognizer *)gestureRecognizer).edges == UIRectEdgeLeft);
798
+ BOOL isCorrectEdge = (isRTL && edges == UIRectEdgeRight) ||
799
+ (!isRTL && isSlideFromLeft && edges == UIRectEdgeRight) ||
800
+ (isRTL && isSlideFromLeft && edges == UIRectEdgeLeft) || (!isRTL && edges == UIRectEdgeLeft);
663
801
  if (isCorrectEdge) {
664
802
  [self cancelTouchesInParent];
665
803
  return YES;
@@ -679,7 +817,7 @@ namespace react = facebook::react;
679
817
  #endif // TARGET_OS_TV
680
818
  }
681
819
 
682
- #if !TARGET_OS_TV
820
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
683
821
  - (void)setupGestureHandlers
684
822
  {
685
823
  // gesture recognizers for custom stack animations
@@ -723,11 +861,14 @@ namespace react = facebook::react;
723
861
  }
724
862
  }
725
863
 
864
+ bool isInverted = topScreen.stackAnimation == RNSScreenStackAnimationSlideFromLeft;
865
+
726
866
  float transitionProgress = (translation / distance);
867
+ transitionProgress = isInverted ? transitionProgress * -1 : transitionProgress;
727
868
 
728
869
  switch (gestureRecognizer.state) {
729
870
  case UIGestureRecognizerStateBegan: {
730
- _interactionController = [UIPercentDrivenInteractiveTransition new];
871
+ _interactionController = [RNSPercentDrivenInteractiveTransition new];
731
872
  [_controller popViewControllerAnimated:YES];
732
873
  break;
733
874
  }
@@ -745,13 +886,17 @@ namespace react = facebook::react;
745
886
  case UIGestureRecognizerStateEnded: {
746
887
  // values taken from
747
888
  // https://github.com/react-navigation/react-navigation/blob/54739828598d7072c1bf7b369659e3682db3edc5/packages/stack/src/views/Stack/Card.tsx#L316
748
- BOOL shouldFinishTransition = (translation + velocity * 0.3) > (distance / 2);
889
+ float snapPoint = distance / 2;
890
+ float gestureDistance = translation + velocity * 0.3;
891
+ gestureDistance = isInverted ? gestureDistance * -1 : gestureDistance;
892
+ BOOL shouldFinishTransition = gestureDistance > snapPoint;
749
893
  if (shouldFinishTransition) {
750
894
  [_interactionController finishInteractiveTransition];
751
895
  } else {
752
896
  [_interactionController cancelInteractiveTransition];
753
897
  }
754
898
  _interactionController = nil;
899
+ _isFullWidthSwiping = NO;
755
900
  }
756
901
  default: {
757
902
  break;
@@ -770,7 +915,7 @@ namespace react = facebook::react;
770
915
  if (_interactionController == nil && fromView.reactSuperview) {
771
916
  BOOL shouldCancelDismiss = [self shouldCancelDismissFromView:fromView toView:toView];
772
917
  if (shouldCancelDismiss) {
773
- _interactionController = [UIPercentDrivenInteractiveTransition new];
918
+ _interactionController = [RNSPercentDrivenInteractiveTransition new];
774
919
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
775
920
  [self->_interactionController cancelInteractiveTransition];
776
921
  self->_interactionController = nil;
@@ -783,6 +928,10 @@ namespace react = facebook::react;
783
928
  });
784
929
  }
785
930
  }
931
+
932
+ if (_interactionController != nil) {
933
+ [_interactionController setAnimationController:animationController];
934
+ }
786
935
  return _interactionController;
787
936
  }
788
937
 
@@ -798,12 +947,17 @@ namespace react = facebook::react;
798
947
  {
799
948
  [self emitOnFinishTransitioningEvent];
800
949
  [RNSScreenWindowTraits updateWindowTraits];
950
+ // Because of the bug that caused view to have incorrect dimensions while changing the orientation,
951
+ // we need to signalize that it needs to be layouted.
952
+ // see https://github.com/software-mansion/react-native-screens/pull/1970
953
+ [_controller.view setNeedsLayout];
801
954
  }
802
955
  #endif
803
956
 
804
957
  - (void)markChildUpdated
805
958
  {
806
- // do nothing
959
+ // In native stack this should be called only for `preload` purposes.
960
+ [self updateContainer];
807
961
  }
808
962
 
809
963
  - (void)didUpdateChildren
@@ -844,8 +998,8 @@ namespace react = facebook::react;
844
998
  - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
845
999
  {
846
1000
  if (CGRectContainsPoint(_controller.navigationBar.frame, point)) {
847
- // headerConfig should be the first subview of the topmost screen
848
- UIView *headerConfig = [[_reactSubviews.lastObject reactSubviews] firstObject];
1001
+ RNSScreenView *topMostScreen = (RNSScreenView *)_reactSubviews.lastObject;
1002
+ UIView *headerConfig = topMostScreen.findHeaderConfig;
849
1003
  if ([headerConfig isKindOfClass:[RNSScreenStackHeaderConfig class]]) {
850
1004
  UIView *headerHitTestResult = [headerConfig hitTest:point withEvent:event];
851
1005
  if (headerHitTestResult != nil) {
@@ -856,7 +1010,7 @@ namespace react = facebook::react;
856
1010
  return [super hitTest:point withEvent:event];
857
1011
  }
858
1012
 
859
- #if !TARGET_OS_TV
1013
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
860
1014
 
861
1015
  - (BOOL)isScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
862
1016
  {
@@ -930,6 +1084,9 @@ namespace react = facebook::react;
930
1084
 
931
1085
  #endif // !TARGET_OS_TV
932
1086
 
1087
+ RNS_IGNORE_SUPER_CALL_BEGIN
1088
+ // We hijack the udpates as we don't want to update UIKit model yet.
1089
+ // This is done after all mutations are processed.
933
1090
  - (void)insertReactSubview:(RNSScreenView *)subview atIndex:(NSInteger)atIndex
934
1091
  {
935
1092
  if (![subview isKindOfClass:[RNSScreenView class]]) {
@@ -945,6 +1102,7 @@ namespace react = facebook::react;
945
1102
  subview.reactSuperview = nil;
946
1103
  [_reactSubviews removeObject:subview];
947
1104
  }
1105
+ RNS_IGNORE_SUPER_CALL_END
948
1106
 
949
1107
  - (void)didUpdateReactSubviews
950
1108
  {
@@ -952,11 +1110,37 @@ namespace react = facebook::react;
952
1110
  // set yet, however the layout call is already enqueued on ui thread. Enqueuing update call on the
953
1111
  // ui queue will guarantee that the update will run after layout.
954
1112
  dispatch_async(dispatch_get_main_queue(), ^{
955
- self->_hasLayout = YES;
956
1113
  [self maybeAddToParentAndUpdateContainer];
957
1114
  });
958
1115
  }
959
1116
 
1117
+ - (void)startScreenTransition
1118
+ {
1119
+ if (_interactionController == nil) {
1120
+ _customAnimation = YES;
1121
+ _interactionController = [RNSPercentDrivenInteractiveTransition new];
1122
+ [_controller popViewControllerAnimated:YES];
1123
+ }
1124
+ }
1125
+
1126
+ - (void)updateScreenTransition:(double)progress
1127
+ {
1128
+ [_interactionController updateInteractiveTransition:progress];
1129
+ }
1130
+
1131
+ - (void)finishScreenTransition:(BOOL)canceled
1132
+ {
1133
+ _customAnimation = NO;
1134
+ if (canceled) {
1135
+ [_interactionController updateInteractiveTransition:0.0];
1136
+ [_interactionController cancelInteractiveTransition];
1137
+ } else {
1138
+ [_interactionController updateInteractiveTransition:1.0];
1139
+ [_interactionController finishInteractiveTransition];
1140
+ }
1141
+ _interactionController = nil;
1142
+ }
1143
+
960
1144
  #ifdef RCT_NEW_ARCH_ENABLED
961
1145
  #pragma mark - Fabric specific
962
1146
 
@@ -977,23 +1161,24 @@ namespace react = facebook::react;
977
1161
 
978
1162
  [_reactSubviews insertObject:(RNSScreenView *)childComponentView atIndex:index];
979
1163
  ((RNSScreenView *)childComponentView).reactSuperview = self;
980
- dispatch_async(dispatch_get_main_queue(), ^{
981
- [self maybeAddToParentAndUpdateContainer];
982
- });
1164
+ // Container update is done after all mount operations are executed in
1165
+ // `- [RNSScreenStackView mountingTransactionDidMount: withSurfaceTelemetry:]`
1166
+ }
1167
+
1168
+ - (nullable RNSScreenView *)childScreenForTag:(react::Tag)tag
1169
+ {
1170
+ for (RNSScreenView *child in _reactSubviews) {
1171
+ if (child.tag == tag) {
1172
+ return child;
1173
+ }
1174
+ }
1175
+ return nil;
983
1176
  }
984
1177
 
985
1178
  - (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
986
1179
  {
987
1180
  RNSScreenView *screenChildComponent = (RNSScreenView *)childComponentView;
988
- // We should only do a snapshot of a screen that is on the top.
989
- // We also check `_presentedModals` since if you push 2 modals, second one is not a "child" of _controller.
990
- // Also, when dissmised with a gesture, the screen already is not under the window, so we don't need to apply
991
- // snapshot.
992
- if (screenChildComponent.window != nil &&
993
- ((screenChildComponent == _controller.visibleViewController.view && _presentedModals.count < 2) ||
994
- screenChildComponent == [_presentedModals.lastObject view])) {
995
- [screenChildComponent.controller setViewToSnapshot:_snapshot];
996
- }
1181
+ [screenChildComponent.controller setViewToSnapshot];
997
1182
 
998
1183
  RCTAssert(
999
1184
  screenChildComponent.reactSuperview == self,
@@ -1012,26 +1197,53 @@ namespace react = facebook::react;
1012
1197
  screenChildComponent.reactSuperview = nil;
1013
1198
  [_reactSubviews removeObject:screenChildComponent];
1014
1199
  [screenChildComponent removeFromSuperview];
1015
- dispatch_async(dispatch_get_main_queue(), ^{
1016
- [self maybeAddToParentAndUpdateContainer];
1017
- });
1018
1200
  }
1019
1201
 
1020
- - (void)takeSnapshot
1202
+ - (void)mountingTransactionWillMount:(const facebook::react::MountingTransaction &)transaction
1203
+ withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry
1021
1204
  {
1022
- _snapshot = [_controller.visibleViewController.view snapshotViewAfterScreenUpdates:NO];
1205
+ for (const auto &mutation : transaction.getMutations()) {
1206
+ if (mutation.type == react::ShadowViewMutation::Delete) {
1207
+ RNSScreenView *_Nullable toBeRemovedChild = [self childScreenForTag:mutation.oldChildShadowView.tag];
1208
+ if (toBeRemovedChild != nil) {
1209
+ [toBeRemovedChild willBeUnmountedInUpcomingTransaction];
1210
+ _toBeDeletedScreens.push_back(toBeRemovedChild);
1211
+ }
1212
+ }
1213
+ }
1023
1214
  }
1024
1215
 
1025
- - (void)mountingTransactionWillMount:(react::MountingTransaction const &)transaction
1026
- withSurfaceTelemetry:(react::SurfaceTelemetry const &)surfaceTelemetry
1216
+ - (void)mountingTransactionDidMount:(const facebook::react::MountingTransaction &)transaction
1217
+ withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry
1027
1218
  {
1028
- for (auto &mutation : transaction.getMutations()) {
1029
- if (mutation.type == react::ShadowViewMutation::Type::Remove && mutation.parentShadowView.componentName != nil &&
1030
- strcmp(mutation.parentShadowView.componentName, "RNSScreenStack") == 0) {
1031
- [self takeSnapshot];
1032
- return;
1219
+ for (const auto &mutation : transaction.getMutations()) {
1220
+ if (mutation.parentShadowView.tag == self.tag &&
1221
+ (mutation.type == react::ShadowViewMutation::Type::Insert ||
1222
+ mutation.type == react::ShadowViewMutation::Type::Remove)) {
1223
+ // we need to wait until children have their layout set. At this point they don't have the layout
1224
+ // set yet, however the layout call is already enqueued on ui thread. Enqueuing update call on the
1225
+ // ui queue will guarantee that the update will run after layout.
1226
+ dispatch_async(dispatch_get_main_queue(), ^{
1227
+ [self maybeAddToParentAndUpdateContainer];
1228
+ });
1229
+ break;
1033
1230
  }
1034
1231
  }
1232
+
1233
+ if (!self->_toBeDeletedScreens.empty()) {
1234
+ __weak RNSScreenStackView *weakSelf = self;
1235
+ // We want to run after container updates are performed (transitions etc.)
1236
+ dispatch_async(dispatch_get_main_queue(), ^{
1237
+ RNSScreenStackView *_Nullable strongSelf = weakSelf;
1238
+ if (strongSelf == nil) {
1239
+ return;
1240
+ }
1241
+ for (RNSScreenView *screenRef : strongSelf->_toBeDeletedScreens) {
1242
+ [screenRef invalidate];
1243
+ }
1244
+ strongSelf->_toBeDeletedScreens.clear();
1245
+ });
1246
+ }
1035
1247
  }
1036
1248
 
1037
1249
  - (void)prepareForRecycle
@@ -1044,7 +1256,6 @@ namespace react = facebook::react;
1044
1256
  }
1045
1257
 
1046
1258
  [_presentedModals removeAllObjects];
1047
- [self dismissOnReload];
1048
1259
  [_controller willMoveToParentViewController:nil];
1049
1260
  [_controller removeFromParentViewController];
1050
1261
  [_controller setViewControllers:@[ [UIViewController new] ]];
@@ -1060,12 +1271,25 @@ namespace react = facebook::react;
1060
1271
  - (void)invalidate
1061
1272
  {
1062
1273
  _invalidated = YES;
1063
- for (UIViewController *controller in _presentedModals) {
1274
+ [self dismissAllRelatedModals];
1275
+ [_controller willMoveToParentViewController:nil];
1276
+ [_controller removeFromParentViewController];
1277
+ }
1278
+
1279
+ // This method aims to dismiss all modals for which presentation process
1280
+ // has been initiated in this navigation controller, i. e. either a Screen
1281
+ // with modal presentation or foreign modal presented from inside a Screen.
1282
+ - (void)dismissAllRelatedModals
1283
+ {
1284
+ [_controller.presentedViewController dismissViewControllerAnimated:YES completion:nil];
1285
+
1286
+ // This loop seems to be excessive. Above message send to `_controller` should
1287
+ // be enough, because system dismisses the controllers recursively,
1288
+ // however better safe than sorry & introduce a regression, thus it is left here.
1289
+ for (UIViewController *controller in [_presentedModals reverseObjectEnumerator]) {
1064
1290
  [controller dismissViewControllerAnimated:NO completion:nil];
1065
1291
  }
1066
1292
  [_presentedModals removeAllObjects];
1067
- [_controller willMoveToParentViewController:nil];
1068
- [_controller removeFromParentViewController];
1069
1293
  }
1070
1294
 
1071
1295
  #endif // RCT_NEW_ARCH_ENABLED