react-native-screens 4.0.0-beta.0 → 4.0.0-beta.10

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 (216) hide show
  1. package/README.md +1 -1
  2. package/android/build.gradle +26 -6
  3. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +61 -0
  4. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +4 -3
  5. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +54 -1
  6. package/android/src/main/java/com/swmansion/rnscreens/InsetsObserverProxy.kt +2 -4
  7. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +59 -36
  8. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +26 -5
  9. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +37 -17
  10. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +1 -2
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigShadowNode.kt +25 -0
  12. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +18 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +8 -2
  14. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +2 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +3 -3
  16. package/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +17 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/utils/PaddingBundle.kt +8 -0
  18. package/android/src/main/jni/rnscreens.h +2 -0
  19. package/android/src/main/res/base/anim/rns_ios_from_left_background_close.xml +5 -0
  20. package/android/src/main/res/base/anim/{rns_slide_out_to_left_ios.xml → rns_ios_from_left_background_open.xml} +1 -1
  21. package/android/src/main/res/base/anim/rns_ios_from_left_foreground_close.xml +6 -0
  22. package/android/src/main/res/base/anim/rns_ios_from_left_foreground_open.xml +6 -0
  23. package/android/src/main/res/base/anim/rns_ios_from_right_background_open.xml +5 -0
  24. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +39 -0
  25. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +1 -1
  26. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +5 -99
  27. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +101 -0
  28. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +2 -0
  29. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h +44 -0
  30. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.cpp +8 -0
  31. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.h +32 -0
  32. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.cpp +23 -0
  33. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.h +50 -0
  34. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h +27 -0
  35. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.cpp +8 -0
  36. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.h +32 -0
  37. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.cpp +15 -0
  38. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.h +40 -0
  39. package/ios/RNSConvert.mm +4 -2
  40. package/ios/RNSFullWindowOverlay.mm +6 -0
  41. package/ios/RNSModalScreen.mm +7 -0
  42. package/ios/RNSScreen.h +9 -0
  43. package/ios/RNSScreen.mm +46 -8
  44. package/ios/RNSScreenContainer.mm +6 -0
  45. package/ios/RNSScreenContentWrapper.mm +6 -0
  46. package/ios/RNSScreenFooter.mm +6 -0
  47. package/ios/RNSScreenNavigationContainer.mm +7 -0
  48. package/ios/RNSScreenStack.mm +86 -8
  49. package/ios/RNSScreenStackHeaderConfig.h +63 -0
  50. package/ios/RNSScreenStackHeaderConfig.mm +133 -6
  51. package/ios/RNSScreenStackHeaderSubview.mm +32 -3
  52. package/ios/RNSSearchBar.mm +7 -0
  53. package/ios/utils/UINavigationBar+RNSUtility.h +37 -0
  54. package/ios/utils/UINavigationBar+RNSUtility.mm +44 -0
  55. package/ios/utils/UIView+RNSUtility.mm +0 -1
  56. package/lib/commonjs/TransitionProgressContext.js +1 -0
  57. package/lib/commonjs/TransitionProgressContext.js.map +1 -1
  58. package/lib/commonjs/components/Screen.js +111 -5
  59. package/lib/commonjs/components/Screen.js.map +1 -1
  60. package/lib/commonjs/components/Screen.web.js +2 -0
  61. package/lib/commonjs/components/Screen.web.js.map +1 -1
  62. package/lib/commonjs/components/ScreenContainer.js +1 -0
  63. package/lib/commonjs/components/ScreenContainer.js.map +1 -1
  64. package/lib/commonjs/components/ScreenContentWrapper.web.js +11 -0
  65. package/lib/commonjs/components/ScreenContentWrapper.web.js.map +1 -0
  66. package/lib/commonjs/components/ScreenFooter.web.js +11 -0
  67. package/lib/commonjs/components/ScreenFooter.web.js.map +1 -0
  68. package/lib/commonjs/components/ScreenStack.js +1 -0
  69. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  70. package/lib/commonjs/components/ScreenStackHeaderConfig.js +54 -17
  71. package/lib/commonjs/components/ScreenStackHeaderConfig.js.map +1 -1
  72. package/lib/commonjs/components/SearchBar.js +1 -0
  73. package/lib/commonjs/components/SearchBar.js.map +1 -1
  74. package/lib/commonjs/components/helpers/usePrevious.js +15 -0
  75. package/lib/commonjs/components/helpers/usePrevious.js.map +1 -0
  76. package/lib/commonjs/core.js +1 -0
  77. package/lib/commonjs/core.js.map +1 -1
  78. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +1 -0
  79. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
  80. package/lib/commonjs/fabric/ModalScreenNativeComponent.js +1 -0
  81. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  82. package/lib/commonjs/fabric/NativeScreensModule.js +2 -1
  83. package/lib/commonjs/fabric/NativeScreensModule.js.map +1 -1
  84. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js +1 -0
  85. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js.map +1 -1
  86. package/lib/commonjs/fabric/ScreenNativeComponent.js +1 -0
  87. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  88. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js +1 -0
  89. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -1
  90. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +4 -1
  91. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  92. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +4 -1
  93. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  94. package/lib/commonjs/fabric/ScreenStackNativeComponent.js +1 -0
  95. package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -1
  96. package/lib/commonjs/fabric/SearchBarNativeComponent.js +2 -2
  97. package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -1
  98. package/lib/commonjs/native-stack/contexts/GHContext.js +1 -0
  99. package/lib/commonjs/native-stack/contexts/GHContext.js.map +1 -1
  100. package/lib/commonjs/native-stack/views/NativeStackView.js +7 -13
  101. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  102. package/lib/module/TransitionProgressContext.js +2 -0
  103. package/lib/module/TransitionProgressContext.js.map +1 -1
  104. package/lib/module/components/Screen.js +112 -5
  105. package/lib/module/components/Screen.js.map +1 -1
  106. package/lib/module/components/Screen.web.js +3 -0
  107. package/lib/module/components/Screen.web.js.map +1 -1
  108. package/lib/module/components/ScreenContainer.js +2 -0
  109. package/lib/module/components/ScreenContainer.js.map +1 -1
  110. package/lib/module/components/ScreenContentWrapper.web.js +5 -0
  111. package/lib/module/components/ScreenContentWrapper.web.js.map +1 -0
  112. package/lib/module/components/ScreenFooter.web.js +5 -0
  113. package/lib/module/components/ScreenFooter.web.js.map +1 -0
  114. package/lib/module/components/ScreenStack.js +2 -0
  115. package/lib/module/components/ScreenStack.js.map +1 -1
  116. package/lib/module/components/ScreenStackHeaderConfig.js +52 -16
  117. package/lib/module/components/ScreenStackHeaderConfig.js.map +1 -1
  118. package/lib/module/components/SearchBar.js +2 -0
  119. package/lib/module/components/SearchBar.js.map +1 -1
  120. package/lib/module/components/helpers/usePrevious.js +9 -0
  121. package/lib/module/components/helpers/usePrevious.js.map +1 -0
  122. package/lib/module/core.js +2 -0
  123. package/lib/module/core.js.map +1 -1
  124. package/lib/module/fabric/FullWindowOverlayNativeComponent.js +2 -0
  125. package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
  126. package/lib/module/fabric/ModalScreenNativeComponent.js +2 -0
  127. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  128. package/lib/module/fabric/NativeScreensModule.js +2 -1
  129. package/lib/module/fabric/NativeScreensModule.js.map +1 -1
  130. package/lib/module/fabric/ScreenContainerNativeComponent.js +2 -0
  131. package/lib/module/fabric/ScreenContainerNativeComponent.js.map +1 -1
  132. package/lib/module/fabric/ScreenNativeComponent.js +2 -0
  133. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  134. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js +2 -0
  135. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -1
  136. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +5 -1
  137. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  138. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +5 -1
  139. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  140. package/lib/module/fabric/ScreenStackNativeComponent.js +2 -0
  141. package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -1
  142. package/lib/module/fabric/SearchBarNativeComponent.js +2 -0
  143. package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -1
  144. package/lib/module/index.js +6 -6
  145. package/lib/module/native-stack/contexts/GHContext.js +2 -0
  146. package/lib/module/native-stack/contexts/GHContext.js.map +1 -1
  147. package/lib/module/native-stack/views/NativeStackView.js +7 -13
  148. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  149. package/lib/typescript/TransitionProgressContext.d.ts.map +1 -1
  150. package/lib/typescript/components/Screen.d.ts +5 -1
  151. package/lib/typescript/components/Screen.d.ts.map +1 -1
  152. package/lib/typescript/components/Screen.web.d.ts.map +1 -1
  153. package/lib/typescript/components/ScreenContainer.d.ts.map +1 -1
  154. package/lib/typescript/components/ScreenContentWrapper.web.d.ts +5 -0
  155. package/lib/typescript/components/ScreenContentWrapper.web.d.ts.map +1 -0
  156. package/lib/typescript/components/ScreenFooter.web.d.ts +5 -0
  157. package/lib/typescript/components/ScreenFooter.web.d.ts.map +1 -0
  158. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  159. package/lib/typescript/components/ScreenStackHeaderConfig.d.ts +1 -1
  160. package/lib/typescript/components/ScreenStackHeaderConfig.d.ts.map +1 -1
  161. package/lib/typescript/components/SearchBar.d.ts.map +1 -1
  162. package/lib/typescript/components/helpers/usePrevious.d.ts +2 -0
  163. package/lib/typescript/components/helpers/usePrevious.d.ts.map +1 -0
  164. package/lib/typescript/core.d.ts.map +1 -1
  165. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts.map +1 -1
  166. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +1 -0
  167. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  168. package/lib/typescript/fabric/NativeScreensModule.d.ts.map +1 -1
  169. package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts.map +1 -1
  170. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +1 -1
  171. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  172. package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts.map +1 -1
  173. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  174. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  175. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -1
  176. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -1
  177. package/lib/typescript/index.d.ts +18 -0
  178. package/lib/typescript/index.d.ts.map +1 -1
  179. package/lib/typescript/native-stack/contexts/GHContext.d.ts.map +1 -1
  180. package/lib/typescript/native-stack/types.d.ts +14 -5
  181. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  182. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  183. package/lib/typescript/types.d.ts +56 -11
  184. package/lib/typescript/types.d.ts.map +1 -1
  185. package/native-stack/README.md +30 -5
  186. package/package.json +1 -1
  187. package/src/TransitionProgressContext.tsx +2 -0
  188. package/src/components/Screen.tsx +161 -8
  189. package/src/components/Screen.web.tsx +3 -0
  190. package/src/components/ScreenContainer.tsx +2 -0
  191. package/src/components/ScreenContentWrapper.web.tsx +6 -0
  192. package/src/components/ScreenFooter.web.tsx +6 -0
  193. package/src/components/ScreenStack.tsx +2 -0
  194. package/src/components/ScreenStackHeaderConfig.tsx +61 -26
  195. package/src/components/SearchBar.tsx +2 -0
  196. package/src/components/helpers/usePrevious.tsx +11 -0
  197. package/src/core.ts +2 -0
  198. package/src/fabric/FullWindowOverlayNativeComponent.ts +2 -0
  199. package/src/fabric/ModalScreenNativeComponent.ts +3 -0
  200. package/src/fabric/NativeScreensModule.ts +2 -0
  201. package/src/fabric/ScreenContainerNativeComponent.ts +2 -0
  202. package/src/fabric/ScreenNativeComponent.ts +4 -1
  203. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +2 -0
  204. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +5 -1
  205. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +5 -1
  206. package/src/fabric/ScreenStackNativeComponent.ts +2 -0
  207. package/src/fabric/SearchBarNativeComponent.ts +2 -0
  208. package/src/index.tsx +6 -6
  209. package/src/native-stack/contexts/GHContext.tsx +2 -0
  210. package/src/native-stack/types.tsx +14 -5
  211. package/src/native-stack/views/NativeStackView.tsx +11 -16
  212. package/src/types.tsx +63 -11
  213. package/windows/RNScreens/Screen.h +2 -1
  214. /package/android/src/main/res/base/anim/{rns_slide_in_from_left_ios.xml → rns_ios_from_right_background_close.xml} +0 -0
  215. /package/android/src/main/res/base/anim/{rns_slide_out_to_right_ios.xml → rns_ios_from_right_foreground_close.xml} +0 -0
  216. /package/android/src/main/res/base/anim/{rns_slide_in_from_right_ios.xml → rns_ios_from_right_foreground_open.xml} +0 -0
@@ -0,0 +1,27 @@
1
+ #pragma once
2
+
3
+ #ifdef ANDROID
4
+ #include <fbjni/fbjni.h>
5
+ #endif
6
+ #include <react/debug/react_native_assert.h>
7
+ #include <react/renderer/components/rnscreens/Props.h>
8
+ #include <react/renderer/components/rnscreens/utils/RectUtil.h>
9
+ #include <react/renderer/core/ConcreteComponentDescriptor.h>
10
+ #include "RNSScreenStackHeaderSubviewShadowNode.h"
11
+
12
+ namespace facebook::react {
13
+
14
+ using namespace rnscreens;
15
+
16
+ class RNSScreenStackHeaderSubviewComponentDescriptor final
17
+ : public ConcreteComponentDescriptor<
18
+ RNSScreenStackHeaderSubviewShadowNode> {
19
+ public:
20
+ using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
21
+
22
+ void adopt(ShadowNode &shadowNode) const override {
23
+ ConcreteComponentDescriptor::adopt(shadowNode);
24
+ }
25
+ };
26
+
27
+ } // namespace facebook::react
@@ -0,0 +1,8 @@
1
+ #include "RNSScreenStackHeaderSubviewShadowNode.h"
2
+
3
+ namespace facebook::react {
4
+
5
+ extern const char RNSScreenStackHeaderSubviewComponentName[] =
6
+ "RNSScreenStackHeaderSubview";
7
+
8
+ }
@@ -0,0 +1,32 @@
1
+ #pragma once
2
+
3
+ #include <jsi/jsi.h>
4
+ #include <react/renderer/components/rnscreens/EventEmitters.h>
5
+ #include <react/renderer/components/rnscreens/Props.h>
6
+ #include <react/renderer/components/view/ConcreteViewShadowNode.h>
7
+ #include <react/renderer/core/LayoutContext.h>
8
+ #include "FrameCorrectionModes.h"
9
+ #include "RNSScreenStackHeaderSubviewState.h"
10
+
11
+ namespace facebook::react {
12
+
13
+ using namespace rnscreens;
14
+
15
+ JSI_EXPORT extern const char RNSScreenStackHeaderSubviewComponentName[];
16
+
17
+ class JSI_EXPORT RNSScreenStackHeaderSubviewShadowNode final
18
+ : public ConcreteViewShadowNode<
19
+ RNSScreenStackHeaderSubviewComponentName,
20
+ RNSScreenStackHeaderSubviewProps,
21
+ RNSScreenStackHeaderSubviewEventEmitter,
22
+ RNSScreenStackHeaderSubviewState> {
23
+ public:
24
+ using ConcreteViewShadowNode::ConcreteViewShadowNode;
25
+ using StateData = ConcreteViewShadowNode::ConcreteStateData;
26
+
27
+ #pragma mark - ShadowNode overrides
28
+
29
+ #pragma mark - Custom interface
30
+ };
31
+
32
+ } // namespace facebook::react
@@ -0,0 +1,15 @@
1
+ #include "RNSScreenStackHeaderSubviewState.h"
2
+
3
+ namespace facebook {
4
+ namespace react {
5
+
6
+ using namespace rnscreens;
7
+
8
+ #ifdef ANDROID
9
+ folly::dynamic RNSScreenStackHeaderSubviewState::getDynamic() const {
10
+ return folly::dynamic::object();
11
+ }
12
+ #endif
13
+
14
+ } // namespace react
15
+ } // namespace facebook
@@ -0,0 +1,40 @@
1
+ #pragma once
2
+
3
+ #include <react/renderer/core/graphicsConversions.h>
4
+ #include <react/renderer/graphics/Float.h>
5
+
6
+ #ifdef ANDROID
7
+ #include <folly/dynamic.h>
8
+ #include <react/renderer/mapbuffer/MapBuffer.h>
9
+ #include <react/renderer/mapbuffer/MapBufferBuilder.h>
10
+ #endif
11
+
12
+ #include "FrameCorrectionModes.h"
13
+
14
+ namespace facebook::react {
15
+
16
+ using namespace rnscreens;
17
+
18
+ class JSI_EXPORT RNSScreenStackHeaderSubviewState final {
19
+ public:
20
+ using Shared = std::shared_ptr<const RNSScreenStackHeaderSubviewState>;
21
+
22
+ RNSScreenStackHeaderSubviewState() = default;
23
+
24
+ #ifdef ANDROID
25
+ RNSScreenStackHeaderSubviewState(
26
+ RNSScreenStackHeaderSubviewState const &previousState,
27
+ folly::dynamic data) {}
28
+ #endif
29
+
30
+ #ifdef ANDROID
31
+ folly::dynamic getDynamic() const;
32
+ MapBuffer getMapBuffer() const {
33
+ return MapBufferBuilder::EMPTY();
34
+ };
35
+ #endif
36
+
37
+ #pragma mark - Getters
38
+ };
39
+
40
+ } // namespace facebook::react
package/ios/RNSConvert.mm CHANGED
@@ -51,12 +51,14 @@
51
51
  + (RNSScreenStackAnimation)RNSScreenStackAnimationFromCppEquivalent:(react::RNSScreenStackAnimation)stackAnimation
52
52
  {
53
53
  switch (stackAnimation) {
54
- // these three are intentionally grouped
54
+ // these four are intentionally grouped
55
55
  case react::RNSScreenStackAnimation::Slide_from_right:
56
- case react::RNSScreenStackAnimation::Ios:
56
+ case react::RNSScreenStackAnimation::Ios_from_right:
57
57
  case react::RNSScreenStackAnimation::Default:
58
58
  return RNSScreenStackAnimationDefault;
59
+ // these two are intentionally grouped
59
60
  case react::RNSScreenStackAnimation::Slide_from_left:
61
+ case react::RNSScreenStackAnimation::Ios_from_left:
60
62
  return RNSScreenStackAnimationSlideFromLeft;
61
63
  case react::RNSScreenStackAnimation::Flip:
62
64
  return RNSScreenStackAnimationFlip;
@@ -15,6 +15,12 @@
15
15
 
16
16
  @implementation RNSFullWindowOverlayContainer
17
17
 
18
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
19
+ + (void)load
20
+ {
21
+ [super load];
22
+ }
23
+
18
24
  - (instancetype)initWithFrame:(CGRect)frame
19
25
  {
20
26
  if (self = [super initWithFrame:frame]) {
@@ -30,6 +30,13 @@
30
30
  }
31
31
 
32
32
  #ifdef RCT_NEW_ARCH_ENABLED
33
+
34
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
35
+ + (void)load
36
+ {
37
+ [super load];
38
+ }
39
+
33
40
  + (react::ComponentDescriptorProvider)componentDescriptorProvider
34
41
  {
35
42
  return react::concreteComponentDescriptorProvider<react::RNSModalScreenComponentDescriptor>();
package/ios/RNSScreen.h CHANGED
@@ -90,6 +90,7 @@ namespace react = facebook::react;
90
90
  @property (nonatomic) NSNumber *sheetLargestUndimmedDetent;
91
91
  @property (nonatomic) BOOL sheetGrabberVisible;
92
92
  @property (nonatomic) CGFloat sheetCornerRadius;
93
+ @property (nonatomic) NSInteger sheetInitialDetent;
93
94
  @property (nonatomic) BOOL sheetExpandsWhenScrolledToEdge;
94
95
  #endif // !TARGET_OS_TV
95
96
 
@@ -132,6 +133,14 @@ namespace react = facebook::react;
132
133
  - (BOOL)isModal;
133
134
  - (BOOL)isPresentedAsNativeModal;
134
135
 
136
+ /**
137
+ * Tell `Screen` component that it has been removed from react state and can safely cleanup
138
+ * any retained resources.
139
+ *
140
+ * Note, that on old architecture this method might be called by RN via `RCTInvalidating` protocol.
141
+ */
142
+ - (void)invalidate;
143
+
135
144
  /// Looks for header configuration in instance's `reactSubviews` and returns it. If not present returns `nil`.
136
145
  - (RNSScreenStackHeaderConfig *_Nullable)findHeaderConfig;
137
146
 
package/ios/RNSScreen.mm CHANGED
@@ -75,6 +75,13 @@ constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
75
75
  }
76
76
 
77
77
  #ifdef RCT_NEW_ARCH_ENABLED
78
+
79
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
80
+ + (void)load
81
+ {
82
+ [super load];
83
+ }
84
+
78
85
  - (instancetype)initWithFrame:(CGRect)frame
79
86
  {
80
87
  if (self = [super initWithFrame:frame]) {
@@ -297,6 +304,10 @@ constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
297
304
  {
298
305
  int activityState = [activityStateOrNil intValue];
299
306
  if (activityStateOrNil != nil && activityState != -1 && activityState != _activityState) {
307
+ if ([_controller.navigationController isKindOfClass:RNSNavigationController.class] &&
308
+ _activityState < activityState) {
309
+ RCTLogError(@"[RNScreens] activityState can only progress in NativeStack");
310
+ }
300
311
  _activityState = activityState;
301
312
  [_reactSuperview markChildUpdated];
302
313
  }
@@ -738,6 +749,12 @@ constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
738
749
  self.controller.modalPresentationStyle == UIModalPresentationOverCurrentContext;
739
750
  }
740
751
 
752
+ - (void)invalidate
753
+ {
754
+ _controller = nil;
755
+ [_sheetsScrollView removeObserver:self forKeyPath:@"bounds" context:nil];
756
+ }
757
+
741
758
  #if !TARGET_OS_TV && !TARGET_OS_VISION
742
759
 
743
760
  - (void)setPropertyForSheet:(UISheetPresentationController *)sheet
@@ -882,8 +899,8 @@ constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
882
899
  sheet.delegate = self;
883
900
  #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
884
901
  __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
885
- if (_sheetAllowedDetents.count > 0) {
886
- if (@available(iOS 16.0, *)) {
902
+ if (@available(iOS 16.0, *)) {
903
+ if (_sheetAllowedDetents.count > 0) {
887
904
  if (_sheetAllowedDetents.count == 1 && [_sheetAllowedDetents[0] integerValue] == SHEET_FIT_TO_CONTENTS) {
888
905
  // This is `fitToContents` case, where sheet should be just high to display its contents.
889
906
  // Paper: we do not set anything here, we will set once React computed layout of our React's children, namely
@@ -937,6 +954,26 @@ constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
937
954
  }
938
955
  }
939
956
 
957
+ if (_sheetInitialDetent > 0 && _sheetInitialDetent < _sheetAllowedDetents.count) {
958
+ #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
959
+ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
960
+ if (@available(iOS 16.0, *)) {
961
+ UISheetPresentationControllerDetent *detent = sheet.detents[_sheetInitialDetent];
962
+ [self setSelectedDetentForSheet:sheet to:detent.identifier animate:YES];
963
+ } else
964
+ #endif // Check for iOS >= 16
965
+ {
966
+ if (_sheetInitialDetent < 2) {
967
+ [self setSelectedDetentForSheet:sheet to:UISheetPresentationControllerDetentIdentifierLarge animate:YES];
968
+ } else {
969
+ RCTLogError(
970
+ @"[RNScreens] sheetInitialDetent out of bounds, on iOS versions below 16 sheetAllowedDetents is ignored in favor of an array of two system-defined detents");
971
+ }
972
+ }
973
+ } else if (_sheetInitialDetent != 0) {
974
+ RCTLogError(@"[RNScreens] sheetInitialDetent out of bounds for sheetAllowedDetents array");
975
+ }
976
+
940
977
  sheet.prefersScrollingExpandsWhenScrolledToEdge = _sheetExpandsWhenScrolledToEdge;
941
978
  [self setGrabberVisibleForSheet:sheet to:_sheetGrabberVisible animate:YES];
942
979
  [self setCornerRadiusForSheet:sheet to:_sheetCornerRadius animate:YES];
@@ -1144,6 +1181,10 @@ constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
1144
1181
  [self setSheetAllowedDetents:[RNSConvert detentFractionsArrayFromVector:newScreenProps.sheetAllowedDetents]];
1145
1182
  }
1146
1183
 
1184
+ if (newScreenProps.sheetInitialDetent != oldScreenProps.sheetInitialDetent) {
1185
+ [self setSheetInitialDetent:newScreenProps.sheetInitialDetent];
1186
+ }
1187
+
1147
1188
  if (newScreenProps.sheetLargestUndimmedDetent != oldScreenProps.sheetLargestUndimmedDetent) {
1148
1189
  [self setSheetLargestUndimmedDetent:[NSNumber numberWithInt:newScreenProps.sheetLargestUndimmedDetent]];
1149
1190
  }
@@ -1230,11 +1271,6 @@ constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
1230
1271
  // subviews
1231
1272
  }
1232
1273
 
1233
- - (void)invalidate
1234
- {
1235
- _controller = nil;
1236
- [_sheetsScrollView removeObserver:self forKeyPath:@"bounds" context:nil];
1237
- }
1238
1274
  #endif
1239
1275
 
1240
1276
  @end
@@ -1857,6 +1893,7 @@ RCT_EXPORT_VIEW_PROPERTY(sheetAllowedDetents, NSArray<NSNumber *> *);
1857
1893
  RCT_EXPORT_VIEW_PROPERTY(sheetLargestUndimmedDetent, NSNumber *);
1858
1894
  RCT_EXPORT_VIEW_PROPERTY(sheetGrabberVisible, BOOL);
1859
1895
  RCT_EXPORT_VIEW_PROPERTY(sheetCornerRadius, CGFloat);
1896
+ RCT_EXPORT_VIEW_PROPERTY(sheetInitialDetent, NSInteger);
1860
1897
  RCT_EXPORT_VIEW_PROPERTY(sheetExpandsWhenScrolledToEdge, BOOL);
1861
1898
  #endif
1862
1899
 
@@ -1929,7 +1966,8 @@ RCT_ENUM_CONVERTER(
1929
1966
  @"slide_from_bottom" : @(RNSScreenStackAnimationSlideFromBottom),
1930
1967
  @"slide_from_right" : @(RNSScreenStackAnimationDefault),
1931
1968
  @"slide_from_left" : @(RNSScreenStackAnimationSlideFromLeft),
1932
- @"ios" : @(RNSScreenStackAnimationDefault),
1969
+ @"ios_from_right" : @(RNSScreenStackAnimationDefault),
1970
+ @"ios_from_left" : @(RNSScreenStackAnimationSlideFromLeft),
1933
1971
  }),
1934
1972
  RNSScreenStackAnimationDefault,
1935
1973
  integerValue)
@@ -251,6 +251,12 @@ namespace react = facebook::react;
251
251
  #pragma mark-- Fabric specific
252
252
  #ifdef RCT_NEW_ARCH_ENABLED
253
253
 
254
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
255
+ + (void)load
256
+ {
257
+ [super load];
258
+ }
259
+
254
260
  - (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
255
261
  {
256
262
  if (![childComponentView isKindOfClass:[RNSScreenView class]]) {
@@ -36,6 +36,12 @@ namespace react = facebook::react;
36
36
  }
37
37
  }
38
38
 
39
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
40
+ + (void)load
41
+ {
42
+ [super load];
43
+ }
44
+
39
45
  + (react::ComponentDescriptorProvider)componentDescriptorProvider
40
46
  {
41
47
  return react::concreteComponentDescriptorProvider<react::RNSScreenContentWrapperComponentDescriptor>();
@@ -100,6 +100,12 @@
100
100
 
101
101
  #pragma Fabric specific
102
102
 
103
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
104
+ + (void)load
105
+ {
106
+ [super load];
107
+ }
108
+
103
109
  + (react::ComponentDescriptorProvider)componentDescriptorProvider
104
110
  {
105
111
  return react::concreteComponentDescriptorProvider<react::RNSScreenFooterComponentDescriptor>();
@@ -43,6 +43,13 @@ namespace react = facebook::react;
43
43
  {
44
44
  return react::concreteComponentDescriptorProvider<react::RNSScreenNavigationContainerComponentDescriptor>();
45
45
  }
46
+
47
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
48
+ + (void)load
49
+ {
50
+ [super load];
51
+ }
52
+
46
53
  #endif
47
54
 
48
55
  @end
@@ -25,6 +25,7 @@
25
25
  #import "RNSScreenStackAnimator.h"
26
26
  #import "RNSScreenStackHeaderConfig.h"
27
27
  #import "RNSScreenWindowTraits.h"
28
+ #import "utils/UINavigationBar+RNSUtility.h"
28
29
 
29
30
  #import "UIView+RNSUtility.h"
30
31
 
@@ -82,6 +83,8 @@ namespace react = facebook::react;
82
83
  if (![screenController hasNestedStack] && isNotDismissingModal) {
83
84
  [screenController calculateAndNotifyHeaderHeightChangeIsModal:NO];
84
85
  }
86
+
87
+ [self maybeUpdateHeaderInsetsInShadowTreeForScreen:screenController];
85
88
  }
86
89
  }
87
90
 
@@ -94,6 +97,35 @@ namespace react = facebook::react;
94
97
  {
95
98
  return [self topViewController];
96
99
  }
100
+
101
+ - (void)maybeUpdateHeaderInsetsInShadowTreeForScreen:(RNSScreen *)screenController
102
+ {
103
+ // This might happen e.g. if there is only native title present in navigation bar.
104
+ if (self.navigationBar.subviews.count < 2) {
105
+ return;
106
+ }
107
+
108
+ auto headerConfig = screenController.screenView.findHeaderConfig;
109
+ if (headerConfig == nil || !headerConfig.shouldHeaderBeVisible) {
110
+ return;
111
+ }
112
+
113
+ NSDirectionalEdgeInsets navBarMargins = [self.navigationBar directionalLayoutMargins];
114
+ NSDirectionalEdgeInsets navBarContentMargins =
115
+ [self.navigationBar.rnscreens_findContentView directionalLayoutMargins];
116
+
117
+ BOOL isDisplayingBackButton = [headerConfig shouldBackButtonBeVisibleInNavigationBar:self.navigationBar];
118
+
119
+ // 44.0 is just "closed eyes default". It is so on device I've tested with, nothing more.
120
+ UIView *barButtonView = isDisplayingBackButton ? self.navigationBar.rnscreens_findBackButtonWrapperView : nil;
121
+ CGFloat platformBackButtonWidth = barButtonView != nil ? barButtonView.frame.size.width : 44.0f;
122
+
123
+ [headerConfig updateHeaderInsetsInShadowTreeTo:NSDirectionalEdgeInsets{
124
+ .leading = navBarMargins.leading + navBarContentMargins.leading +
125
+ (isDisplayingBackButton ? platformBackButtonWidth : 0),
126
+ .trailing = navBarMargins.trailing + navBarContentMargins.trailing,
127
+ }];
128
+ }
97
129
  #endif
98
130
 
99
131
  @end
@@ -120,9 +152,23 @@ namespace react = facebook::react;
120
152
  UIPercentDrivenInteractiveTransition *_interactionController;
121
153
  __weak RNSScreenStackManager *_manager;
122
154
  BOOL _updateScheduled;
155
+ #ifdef RCT_NEW_ARCH_ENABLED
156
+ /// Screens that are subject of `ShadowViewMutation::Type::Delete` mutation
157
+ /// in current transaction. This vector should be populated when we receive notification via
158
+ /// `RCTMountingObserving` protocol, that a transaction will be performed, and should
159
+ /// be cleaned up when we're notified that the transaction has been completed.
160
+ std::vector<__strong RNSScreenView *> _toBeDeletedScreens;
161
+ #endif // RCT_NEW_ARCH_ENABLED
123
162
  }
124
163
 
125
164
  #ifdef RCT_NEW_ARCH_ENABLED
165
+
166
+ // Needed because of this: https://github.com/facebook/react-native/pull/37274
167
+ + (void)load
168
+ {
169
+ [super load];
170
+ }
171
+
126
172
  - (instancetype)initWithFrame:(CGRect)frame
127
173
  {
128
174
  if (self = [super initWithFrame:frame]) {
@@ -506,13 +552,6 @@ namespace react = facebook::react;
506
552
  [changeRootController dismissViewControllerAnimated:shouldAnimate completion:finish];
507
553
  return;
508
554
  }
509
-
510
- UIViewController *lastModalVc = [self lastFromPresentedViewControllerChainStartingFrom:firstModalToBeDismissed];
511
-
512
- if (lastModalVc != firstModalToBeDismissed) {
513
- [lastModalVc dismissViewControllerAnimated:shouldAnimate completion:finish];
514
- return;
515
- }
516
555
  }
517
556
 
518
557
  // changeRootController does not have presentedViewController but it does not mean that no modals are in presentation;
@@ -641,7 +680,7 @@ namespace react = facebook::react;
641
680
  NSMutableArray<UIViewController *> *pushControllers = [NSMutableArray new];
642
681
  NSMutableArray<UIViewController *> *modalControllers = [NSMutableArray new];
643
682
  for (RNSScreenView *screen in _reactSubviews) {
644
- if (!screen.dismissed && screen.controller != nil) {
683
+ if (!screen.dismissed && screen.controller != nil && screen.activityState != RNSActivityStateInactive) {
645
684
  if (pushControllers.count == 0) {
646
685
  // first screen on the list needs to be places as "push controller"
647
686
  [pushControllers addObject:screen.controller];
@@ -915,6 +954,7 @@ namespace react = facebook::react;
915
954
  - (void)markChildUpdated
916
955
  {
917
956
  // do nothing
957
+ [self updateContainer];
918
958
  }
919
959
 
920
960
  - (void)didUpdateChildren
@@ -1118,6 +1158,16 @@ namespace react = facebook::react;
1118
1158
  // `- [RNSScreenStackView mountingTransactionDidMount: withSurfaceTelemetry:]`
1119
1159
  }
1120
1160
 
1161
+ - (nullable RNSScreenView *)childScreenForTag:(react::Tag)tag
1162
+ {
1163
+ for (RNSScreenView *child in _reactSubviews) {
1164
+ if (child.tag == tag) {
1165
+ return child;
1166
+ }
1167
+ }
1168
+ return nil;
1169
+ }
1170
+
1121
1171
  - (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
1122
1172
  {
1123
1173
  RNSScreenView *screenChildComponent = (RNSScreenView *)childComponentView;
@@ -1151,6 +1201,19 @@ namespace react = facebook::react;
1151
1201
  [screenChildComponent removeFromSuperview];
1152
1202
  }
1153
1203
 
1204
+ - (void)mountingTransactionWillMount:(const facebook::react::MountingTransaction &)transaction
1205
+ withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry
1206
+ {
1207
+ for (const auto &mutation : transaction.getMutations()) {
1208
+ if (mutation.type == react::ShadowViewMutation::Delete) {
1209
+ RNSScreenView *_Nullable toBeRemovedChild = [self childScreenForTag:mutation.oldChildShadowView.tag];
1210
+ if (toBeRemovedChild != nil) {
1211
+ _toBeDeletedScreens.push_back(toBeRemovedChild);
1212
+ }
1213
+ }
1214
+ }
1215
+ }
1216
+
1154
1217
  - (void)mountingTransactionDidMount:(const facebook::react::MountingTransaction &)transaction
1155
1218
  withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry
1156
1219
  {
@@ -1167,6 +1230,21 @@ namespace react = facebook::react;
1167
1230
  break;
1168
1231
  }
1169
1232
  }
1233
+
1234
+ if (!self->_toBeDeletedScreens.empty()) {
1235
+ __weak RNSScreenStackView *weakSelf = self;
1236
+ // We want to run after container updates are performed (transitions etc.)
1237
+ dispatch_async(dispatch_get_main_queue(), ^{
1238
+ RNSScreenStackView *_Nullable strongSelf = weakSelf;
1239
+ if (strongSelf == nil) {
1240
+ return;
1241
+ }
1242
+ for (RNSScreenView *screenRef : strongSelf->_toBeDeletedScreens) {
1243
+ [screenRef invalidate];
1244
+ }
1245
+ strongSelf->_toBeDeletedScreens.clear();
1246
+ });
1247
+ }
1170
1248
  }
1171
1249
 
1172
1250
  - (void)prepareForRecycle
@@ -1,6 +1,7 @@
1
1
  #ifdef RCT_NEW_ARCH_ENABLED
2
2
  #import <React/RCTViewComponentView.h>
3
3
  #else
4
+ #import <React/RCTShadowView.h>
4
5
  #import <React/RCTViewManager.h>
5
6
  #endif
6
7
 
@@ -61,12 +62,74 @@
61
62
  animated:(BOOL)animated
62
63
  withConfig:(RNSScreenStackHeaderConfig *)config;
63
64
 
65
+ /**
66
+ * Allows to send information with insets to the corresponding node in shadow tree.
67
+ * Currently only horizontal insets are send through. Vertical ones are filtered out.
68
+ */
69
+ - (void)updateHeaderInsetsInShadowTreeTo:(NSDirectionalEdgeInsets)insets;
70
+
71
+ /**
72
+ * Returns true iff subview of given `type` is present.
73
+ *
74
+ * **Please note that the subviews are not mounted under the header config in HostTree**
75
+ * This method should serve only to check whether given subview type has been rendered.
76
+ */
77
+ - (BOOL)hasSubviewOfType:(RNSScreenStackHeaderSubviewType)type;
78
+
79
+ /**
80
+ * Returns `true` iff subview of type `left` is present.
81
+ *
82
+ * **Please note that the subviews are not mounted under the header config in HostTree**
83
+ * This method should serve only to check whether given subview type has been rendered.
84
+ */
85
+ - (BOOL)hasSubviewLeft;
86
+
87
+ /**
88
+ * Returns
89
+ * - `YES` on Paper, when `self.hide == NO`
90
+ * - `YES` on Fabric, when `self.show == YES`
91
+ * - `NO` otherwise.
92
+ *
93
+ * Convenience method, so that we do not need ifdefs in every callsite.
94
+ */
95
+ - (BOOL)shouldHeaderBeVisible;
96
+
97
+ /**
98
+ * @returns`true` iff the applying this header config instance to a view controller will
99
+ * result in visible back button if feasible.
100
+ */
101
+ - (BOOL)shouldBackButtonBeVisibleInNavigationBar:(nullable UINavigationBar *)navBar;
102
+
64
103
  @end
65
104
 
66
105
  @interface RNSScreenStackHeaderConfigManager : RCTViewManager
67
106
 
68
107
  @end
69
108
 
109
+ #ifdef RCT_NEW_ARCH_ENABLED
110
+ #else
111
+
112
+ /**
113
+ * Used as local data send to shadow view on Paper. This helps us to provide Yoga
114
+ * with knowledge of native insets in the navigation bar.
115
+ */
116
+ @interface RNSHeaderConfigInsetsPayload : NSObject
117
+
118
+ @property (nonatomic) NSDirectionalEdgeInsets insets;
119
+
120
+ - (instancetype)initWithInsets:(NSDirectionalEdgeInsets)insets NS_DESIGNATED_INITIALIZER;
121
+
122
+ @end
123
+
124
+ /**
125
+ * Custom shadow view for header config. This is used on Paper to provide Yoga
126
+ * with knowledge of native header insets (horizontal padding).
127
+ */
128
+ @interface RNSScreenStackHeaderConfigShadowView : RCTShadowView
129
+
130
+ @end
131
+ #endif
132
+
70
133
  @interface RCTConvert (RNSScreenStackHeader)
71
134
 
72
135
  + (UIBlurEffectStyle)UIBlurEffectStyle:(id)json;