react-native-screens 3.35.0-rc.0 → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/android/build.gradle +2 -2
  2. package/android/src/main/java/com/swmansion/rnscreens/InsetsObserverProxy.kt +67 -0
  3. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -0
  4. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +101 -4
  5. package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapper.kt +38 -0
  6. package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapperManager.kt +25 -0
  7. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooter.kt +287 -0
  8. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooterManager.kt +25 -0
  9. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +11 -19
  10. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +4 -0
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +281 -0
  12. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +62 -19
  13. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +403 -41
  14. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +2 -2
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +95 -11
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +39 -28
  18. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogRootView.kt +104 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogScreen.kt +26 -0
  20. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingFragment.kt +488 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +66 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt +24 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/SheetUtils.kt +127 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/events/SheetDetentChangedEvent.kt +27 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/ext/NumericExt.kt +12 -0
  26. package/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +32 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +45 -8
  28. package/android/src/main/res/base/drawable/rns_rounder_top_corners_shape.xml +8 -0
  29. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +25 -0
  30. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +16 -0
  31. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +25 -0
  32. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +16 -0
  33. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +9 -2
  34. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +5 -2
  35. package/ios/RNSConvert.h +5 -3
  36. package/ios/RNSConvert.mm +14 -20
  37. package/ios/RNSScreen.h +3 -2
  38. package/ios/RNSScreen.mm +433 -49
  39. package/ios/RNSScreenContentWrapper.h +44 -0
  40. package/ios/RNSScreenContentWrapper.mm +61 -0
  41. package/ios/RNSScreenFooter.h +30 -0
  42. package/ios/RNSScreenFooter.mm +137 -0
  43. package/lib/commonjs/components/Screen.js +6 -2
  44. package/lib/commonjs/components/Screen.js.map +1 -1
  45. package/lib/commonjs/components/ScreenContentWrapper.js +19 -0
  46. package/lib/commonjs/components/ScreenContentWrapper.js.map +1 -0
  47. package/lib/commonjs/components/ScreenFooter.js +23 -0
  48. package/lib/commonjs/components/ScreenFooter.js.map +1 -0
  49. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  50. package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js +10 -0
  51. package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
  52. package/lib/commonjs/fabric/ScreenFooterNativeComponent.js +10 -0
  53. package/lib/commonjs/fabric/ScreenFooterNativeComponent.js.map +1 -0
  54. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  55. package/lib/commonjs/index.js +30 -0
  56. package/lib/commonjs/index.js.map +1 -1
  57. package/lib/commonjs/native-stack/views/FooterComponent.js +18 -0
  58. package/lib/commonjs/native-stack/views/FooterComponent.js.map +1 -0
  59. package/lib/commonjs/native-stack/views/NativeStackView.js +59 -14
  60. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  61. package/lib/module/components/Screen.js +6 -2
  62. package/lib/module/components/Screen.js.map +1 -1
  63. package/lib/module/components/ScreenContentWrapper.js +12 -0
  64. package/lib/module/components/ScreenContentWrapper.js.map +1 -0
  65. package/lib/module/components/ScreenFooter.js +17 -0
  66. package/lib/module/components/ScreenFooter.js.map +1 -0
  67. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  68. package/lib/module/fabric/ScreenContentWrapperNativeComponent.js +3 -0
  69. package/lib/module/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
  70. package/lib/module/fabric/ScreenFooterNativeComponent.js +3 -0
  71. package/lib/module/fabric/ScreenFooterNativeComponent.js.map +1 -0
  72. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  73. package/lib/module/index.js +2 -0
  74. package/lib/module/index.js.map +1 -1
  75. package/lib/module/native-stack/views/FooterComponent.js +11 -0
  76. package/lib/module/native-stack/views/FooterComponent.js.map +1 -0
  77. package/lib/module/native-stack/views/NativeStackView.js +61 -15
  78. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  79. package/lib/typescript/components/Screen.d.ts.map +1 -1
  80. package/lib/typescript/components/ScreenContentWrapper.d.ts +6 -0
  81. package/lib/typescript/components/ScreenContentWrapper.d.ts.map +1 -0
  82. package/lib/typescript/components/ScreenFooter.d.ts +12 -0
  83. package/lib/typescript/components/ScreenFooter.d.ts.map +1 -0
  84. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +2 -3
  85. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  86. package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts +7 -0
  87. package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts.map +1 -0
  88. package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts +7 -0
  89. package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts.map +1 -0
  90. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +9 -3
  91. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  92. package/lib/typescript/index.d.ts +2 -0
  93. package/lib/typescript/index.d.ts.map +1 -1
  94. package/lib/typescript/native-stack/types.d.ts +63 -23
  95. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  96. package/lib/typescript/native-stack/views/FooterComponent.d.ts +7 -0
  97. package/lib/typescript/native-stack/views/FooterComponent.d.ts.map +1 -0
  98. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  99. package/lib/typescript/types.d.ts +42 -17
  100. package/lib/typescript/types.d.ts.map +1 -1
  101. package/native-stack/README.md +16 -14
  102. package/package.json +1 -1
  103. package/react-native.config.js +18 -16
  104. package/src/components/Screen.tsx +6 -2
  105. package/src/components/ScreenContentWrapper.tsx +12 -0
  106. package/src/components/ScreenFooter.tsx +18 -0
  107. package/src/fabric/ModalScreenNativeComponent.ts +2 -4
  108. package/src/fabric/ScreenContentWrapperNativeComponent.ts +9 -0
  109. package/src/fabric/ScreenFooterNativeComponent.ts +6 -0
  110. package/src/fabric/ScreenNativeComponent.ts +10 -4
  111. package/src/index.tsx +10 -0
  112. package/src/native-stack/types.tsx +57 -23
  113. package/src/native-stack/views/FooterComponent.tsx +10 -0
  114. package/src/native-stack/views/NativeStackView.tsx +74 -11
  115. package/src/types.tsx +41 -16
@@ -0,0 +1,27 @@
1
+ package com.swmansion.rnscreens.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class SheetDetentChangedEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ val index: Int,
11
+ val isStable: Boolean,
12
+ ) : Event<SheetDetentChangedEvent>(surfaceId, viewId) {
13
+ override fun getEventName() = EVENT_NAME
14
+
15
+ // All events for a given view can be coalesced.
16
+ override fun getCoalescingKey(): Short = 0
17
+
18
+ override fun getEventData(): WritableMap? =
19
+ Arguments.createMap().apply {
20
+ putInt("index", index)
21
+ putBoolean("isStable", isStable)
22
+ }
23
+
24
+ companion object {
25
+ const val EVENT_NAME = "topSheetDetentChanged"
26
+ }
27
+ }
@@ -0,0 +1,12 @@
1
+ package com.swmansion.rnscreens.ext
2
+
3
+ import kotlin.math.abs
4
+
5
+ /**
6
+ * 1e-4 should be a reasonable default value for graphic-related use cases.
7
+ * You should always make sure that it is feasible in your particular use case.
8
+ */
9
+ internal fun Float.equalWithRespectToEps(
10
+ other: Float,
11
+ eps: Float = 1e-4F,
12
+ ) = abs(this - other) <= eps
@@ -0,0 +1,32 @@
1
+ package com.swmansion.rnscreens.ext
2
+
3
+ import android.graphics.drawable.ColorDrawable
4
+ import android.view.View
5
+ import android.view.ViewGroup
6
+
7
+ internal fun View.parentAsView() = this.parent as? View
8
+
9
+ internal fun View.parentAsViewGroup() = this.parent as? ViewGroup
10
+
11
+ internal fun View.recycle(): View {
12
+ // screen fragments reuse view instances instead of creating new ones. In order to reuse a given
13
+ // view it needs to be detached from the view hierarchy to allow the fragment to attach it back.
14
+ this.parentAsViewGroup()?.let { parent ->
15
+ parent.endViewTransition(this)
16
+ parent.removeView(this)
17
+ }
18
+
19
+ // view detached from fragment manager get their visibility changed to GONE after their state is
20
+ // dumped. Since we don't restore the state but want to reuse the view we need to change
21
+ // visibility back to VISIBLE in order for the fragment manager to animate in the view.
22
+ this.visibility = View.VISIBLE
23
+ return this
24
+ }
25
+
26
+ internal fun View.maybeBgColor(): Int? {
27
+ val bgDrawable = this.background
28
+ if (bgDrawable is ColorDrawable) {
29
+ return bgDrawable.color
30
+ }
31
+ return null
32
+ }
@@ -1,10 +1,12 @@
1
1
  package com.swmansion.rnscreens.utils
2
2
 
3
3
  import android.app.Activity
4
+ import android.content.Context
4
5
  import android.util.Log
5
6
  import android.view.View
6
7
  import androidx.appcompat.widget.Toolbar
7
8
  import androidx.coordinatorlayout.widget.CoordinatorLayout
9
+ import com.facebook.jni.annotations.DoNotStrip
8
10
  import com.facebook.react.bridge.LifecycleEventListener
9
11
  import com.facebook.react.bridge.ReactApplicationContext
10
12
  import com.facebook.react.uimanager.PixelUtil
@@ -18,6 +20,7 @@ import java.lang.ref.WeakReference
18
20
  * See https://github.com/software-mansion/react-native-screens/pull/2169
19
21
  * for more detailed description of the issue this code solves.
20
22
  */
23
+ @DoNotStrip
21
24
  internal class ScreenDummyLayoutHelper(
22
25
  reactContext: ReactApplicationContext,
23
26
  ) : LifecycleEventListener {
@@ -46,7 +49,7 @@ internal class ScreenDummyLayoutHelper(
46
49
  try {
47
50
  System.loadLibrary(LIBRARY_NAME)
48
51
  } catch (e: UnsatisfiedLinkError) {
49
- Log.w(TAG, "Failed to load $LIBRARY_NAME")
52
+ Log.w(TAG, "[RNScreens] Failed to load $LIBRARY_NAME library.")
50
53
  }
51
54
 
52
55
  weakInstance = WeakReference(this)
@@ -57,9 +60,13 @@ internal class ScreenDummyLayoutHelper(
57
60
  }
58
61
 
59
62
  /**
60
- * Initializes dummy view hierarchy with CoordinatorLayout, AppBarLayout and dummy View.
63
+ * Tries to initialize dummy view hierarchy with CoordinatorLayout, AppBarLayout and dummy View.
61
64
  * We utilize this to compute header height (app bar layout height) from C++ layer when its needed.
62
65
  *
66
+ * This method might fail in case there is activity attached to the react context.
67
+ *
68
+ * This method is called from various threads!
69
+ *
63
70
  * @return boolean whether the layout was initialised or not
64
71
  */
65
72
  private fun maybeInitDummyLayoutWithHeader(reactContext: ReactApplicationContext): Boolean {
@@ -67,6 +74,7 @@ internal class ScreenDummyLayoutHelper(
67
74
  return true
68
75
  }
69
76
 
77
+ // Possible data race here - activity is injected into context on UI thread.
70
78
  if (!reactContext.hasCurrentActivity()) {
71
79
  return false
72
80
  }
@@ -74,8 +82,25 @@ internal class ScreenDummyLayoutHelper(
74
82
  // We need to use activity here, as react context does not have theme attributes required by
75
83
  // AppBarLayout attached leading to crash.
76
84
  val contextWithTheme =
77
- requireNotNull(reactContext.currentActivity) { "[RNScreens] Attempt to use context detached from activity" }
85
+ requireNotNull(reactContext.currentActivity) { "[RNScreens] Attempt to use context detached from activity. This could happen only due to race-condition." }
86
+
87
+ synchronized(this) {
88
+ // The layout could have been initialised when this thread waited for access to critical section.
89
+ if (isLayoutInitialized) {
90
+ return true
91
+ }
92
+ initDummyLayoutWithHeader(contextWithTheme)
93
+ }
94
+ return true
95
+ }
78
96
 
97
+ /**
98
+ * Initialises the dummy layout. This method is **not** thread-safe.
99
+ *
100
+ * @param contextWithTheme this function expects the context to have theme attributes required
101
+ * to initialize the AppBarLayout.
102
+ */
103
+ private fun initDummyLayoutWithHeader(contextWithTheme: Context) {
79
104
  coordinatorLayout = CoordinatorLayout(contextWithTheme)
80
105
 
81
106
  appBarLayout =
@@ -119,7 +144,6 @@ internal class ScreenDummyLayoutHelper(
119
144
  }
120
145
 
121
146
  isLayoutInitialized = true
122
- return true
123
147
  }
124
148
 
125
149
  /**
@@ -129,6 +153,7 @@ internal class ScreenDummyLayoutHelper(
129
153
  * @param fontSize font size value as passed from JS
130
154
  * @return header height in dp as consumed by Yoga
131
155
  */
156
+ @DoNotStrip
132
157
  private fun computeDummyLayout(
133
158
  fontSize: Int,
134
159
  isTitleEmpty: Boolean,
@@ -141,7 +166,7 @@ internal class ScreenDummyLayoutHelper(
141
166
  // is still null at this execution point. We don't wanna crash in such case, thus returning zeroed height.
142
167
  Log.e(
143
168
  TAG,
144
- "[RNScreens] Failed to late-init layout while computing header height. This is a race-condition-bug in react-native-screens, please file an issue at https://github.com/software-mansion/react-native-screens/issues"
169
+ "[RNScreens] Failed to late-init layout while computing header height. This is most likely a race-condition-bug in react-native-screens, please file an issue at https://github.com/software-mansion/react-native-screens/issues"
145
170
  )
146
171
  return 0.0f
147
172
  }
@@ -210,22 +235,34 @@ internal class ScreenDummyLayoutHelper(
210
235
  // dummy view hierarchy.
211
236
  private var weakInstance = WeakReference<ScreenDummyLayoutHelper>(null)
212
237
 
238
+ @DoNotStrip
213
239
  @JvmStatic
214
240
  fun getInstance(): ScreenDummyLayoutHelper? = weakInstance.get()
215
241
  }
216
242
 
243
+ // This value is fetched / stored from UI and background thread. Volatile here ensures
244
+ // that updates are visible to the other thread.
245
+ @Volatile
217
246
  private var isLayoutInitialized = false
218
247
 
219
248
  override fun onHostResume() {
220
249
  // This is the earliest we have guarantee that the context has a reference to an activity.
221
250
  val reactContext = requireReactContext { "[RNScreens] ReactContext missing in onHostResume! This should not happen." }
222
- check(maybeInitDummyLayoutWithHeader(reactContext)) { "[RNScreens] Failed to initialise dummy layout in onHostResume. This is not expected."}
223
- reactContext.removeLifecycleEventListener(this)
251
+
252
+ // There are some exotic edge cases where activity might not be present in context
253
+ // at this point, e.g. when reloading RN in development after an error was reported with redbox.
254
+ if (maybeInitDummyLayoutWithHeader(reactContext)) {
255
+ reactContext.removeLifecycleEventListener(this)
256
+ } else {
257
+ Log.w(TAG, "[RNScreens] Failed to initialise dummy layout in onHostResume.")
258
+ }
224
259
  }
225
260
 
226
261
  override fun onHostPause() = Unit
227
262
 
228
- override fun onHostDestroy() = Unit
263
+ override fun onHostDestroy() {
264
+ reactContextRef.get()?.removeLifecycleEventListener(this)
265
+ }
229
266
  }
230
267
 
231
268
  private data class CacheKey(
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="rectangle">
4
+ <corners
5
+ android:topLeftRadius="8dp"
6
+ android:topRightRadius="8dp"/>
7
+ <solid android:color="#ffffff"/>
8
+ </shape>
@@ -0,0 +1,25 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaDelegate.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import androidx.annotation.Nullable;
14
+ import com.facebook.react.uimanager.BaseViewManagerDelegate;
15
+ import com.facebook.react.uimanager.BaseViewManagerInterface;
16
+
17
+ public class RNSScreenContentWrapperManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenContentWrapperManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
+ public RNSScreenContentWrapperManagerDelegate(U viewManager) {
19
+ super(viewManager);
20
+ }
21
+ @Override
22
+ public void setProperty(T view, String propName, @Nullable Object value) {
23
+ super.setProperty(view, propName, value);
24
+ }
25
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaInterface.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+
14
+ public interface RNSScreenContentWrapperManagerInterface<T extends View> {
15
+ // No props
16
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaDelegate.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import androidx.annotation.Nullable;
14
+ import com.facebook.react.uimanager.BaseViewManagerDelegate;
15
+ import com.facebook.react.uimanager.BaseViewManagerInterface;
16
+
17
+ public class RNSScreenFooterManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenFooterManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
+ public RNSScreenFooterManagerDelegate(U viewManager) {
19
+ super(viewManager);
20
+ }
21
+ @Override
22
+ public void setProperty(T view, String propName, @Nullable Object value) {
23
+ super.setProperty(view, propName, value);
24
+ }
25
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaInterface.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+
14
+ public interface RNSScreenFooterManagerInterface<T extends View> {
15
+ // No props
16
+ }
@@ -12,6 +12,7 @@ package com.facebook.react.viewmanagers;
12
12
  import android.view.View;
13
13
  import androidx.annotation.Nullable;
14
14
  import com.facebook.react.bridge.ColorPropConverter;
15
+ import com.facebook.react.bridge.ReadableArray;
15
16
  import com.facebook.react.bridge.ReadableMap;
16
17
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
17
18
  import com.facebook.react.uimanager.BaseViewManagerInterface;
@@ -24,10 +25,10 @@ public class RNSScreenManagerDelegate<T extends View, U extends BaseViewManagerI
24
25
  public void setProperty(T view, String propName, @Nullable Object value) {
25
26
  switch (propName) {
26
27
  case "sheetAllowedDetents":
27
- mViewManager.setSheetAllowedDetents(view, (String) value);
28
+ mViewManager.setSheetAllowedDetents(view, (ReadableArray) value);
28
29
  break;
29
30
  case "sheetLargestUndimmedDetent":
30
- mViewManager.setSheetLargestUndimmedDetent(view, (String) value);
31
+ mViewManager.setSheetLargestUndimmedDetent(view, value == null ? -1 : ((Double) value).intValue());
31
32
  break;
32
33
  case "sheetGrabberVisible":
33
34
  mViewManager.setSheetGrabberVisible(view, value == null ? false : (boolean) value);
@@ -38,6 +39,12 @@ public class RNSScreenManagerDelegate<T extends View, U extends BaseViewManagerI
38
39
  case "sheetExpandsWhenScrolledToEdge":
39
40
  mViewManager.setSheetExpandsWhenScrolledToEdge(view, value == null ? false : (boolean) value);
40
41
  break;
42
+ case "sheetInitialDetent":
43
+ mViewManager.setSheetInitialDetent(view, value == null ? 0 : ((Double) value).intValue());
44
+ break;
45
+ case "sheetElevation":
46
+ mViewManager.setSheetElevation(view, value == null ? 24 : ((Double) value).intValue());
47
+ break;
41
48
  case "customAnimationOnSwipe":
42
49
  mViewManager.setCustomAnimationOnSwipe(view, value == null ? false : (boolean) value);
43
50
  break;
@@ -11,14 +11,17 @@ package com.facebook.react.viewmanagers;
11
11
 
12
12
  import android.view.View;
13
13
  import androidx.annotation.Nullable;
14
+ import com.facebook.react.bridge.ReadableArray;
14
15
  import com.facebook.react.bridge.ReadableMap;
15
16
 
16
17
  public interface RNSScreenManagerInterface<T extends View> {
17
- void setSheetAllowedDetents(T view, @Nullable String value);
18
- void setSheetLargestUndimmedDetent(T view, @Nullable String value);
18
+ void setSheetAllowedDetents(T view, @Nullable ReadableArray value);
19
+ void setSheetLargestUndimmedDetent(T view, int value);
19
20
  void setSheetGrabberVisible(T view, boolean value);
20
21
  void setSheetCornerRadius(T view, float value);
21
22
  void setSheetExpandsWhenScrolledToEdge(T view, boolean value);
23
+ void setSheetInitialDetent(T view, int value);
24
+ void setSheetElevation(T view, int value);
22
25
  void setCustomAnimationOnSwipe(T view, boolean value);
23
26
  void setFullScreenSwipeEnabled(T view, boolean value);
24
27
  void setFullScreenSwipeShadowEnabled(T view, boolean value);
package/ios/RNSConvert.h CHANGED
@@ -26,9 +26,7 @@ namespace react = facebook::react;
26
26
 
27
27
  + (RNSScreenSwipeDirection)RNSScreenSwipeDirectionFromCppEquivalent:(react::RNSScreenSwipeDirection)swipeDirection;
28
28
 
29
- + (RNSScreenDetentType)RNSScreenDetentTypeFromAllowedDetents:(react::RNSScreenSheetAllowedDetents)allowedDetents;
30
-
31
- + (RNSScreenDetentType)RNSScreenDetentTypeFromLargestUndimmedDetent:(react::RNSScreenSheetLargestUndimmedDetent)detent;
29
+ + (NSArray<NSNumber *> *)detentFractionsArrayFromVector:(const std::vector<react::Float> &)detents;
32
30
 
33
31
  + (NSDictionary *)gestureResponseDistanceDictFromCppStruct:
34
32
  (const react::RNSScreenGestureResponseDistanceStruct &)gestureResponseDistance;
@@ -40,6 +38,10 @@ namespace react = facebook::react;
40
38
 
41
39
  + (RNSSearchBarPlacement)RNSScreenSearchBarPlacementFromCppEquivalent:(react::RNSSearchBarPlacement)placement;
42
40
 
41
+ + (NSMutableArray<NSNumber *> *)NSNumberMutableArrayFromFloatVector:(const std::vector<CGFloat> &)vector;
42
+
43
+ + (NSMutableArray<NSNumber *> *)arrayFromVector:(const std::vector<CGFloat> &)vector;
44
+
43
45
  + (UIBlurEffectStyle)UIBlurEffectStyleFromCppEquivalent:(react::RNSScreenStackHeaderConfigBlurEffect)blurEffect;
44
46
 
45
47
  @end
package/ios/RNSConvert.mm CHANGED
@@ -113,28 +113,13 @@
113
113
  }
114
114
  }
115
115
 
116
- + (RNSScreenDetentType)RNSScreenDetentTypeFromAllowedDetents:(react::RNSScreenSheetAllowedDetents)allowedDetents
116
+ + (NSArray<NSNumber *> *)detentFractionsArrayFromVector:(const std::vector<react::Float> &)detents
117
117
  {
118
- switch (allowedDetents) {
119
- case react::RNSScreenSheetAllowedDetents::All:
120
- return RNSScreenDetentTypeAll;
121
- case react::RNSScreenSheetAllowedDetents::Large:
122
- return RNSScreenDetentTypeLarge;
123
- case react::RNSScreenSheetAllowedDetents::Medium:
124
- return RNSScreenDetentTypeMedium;
125
- }
126
- }
127
-
128
- + (RNSScreenDetentType)RNSScreenDetentTypeFromLargestUndimmedDetent:(react::RNSScreenSheetLargestUndimmedDetent)detent
129
- {
130
- switch (detent) {
131
- case react::RNSScreenSheetLargestUndimmedDetent::All:
132
- return RNSScreenDetentTypeAll;
133
- case react::RNSScreenSheetLargestUndimmedDetent::Large:
134
- return RNSScreenDetentTypeLarge;
135
- case react::RNSScreenSheetLargestUndimmedDetent::Medium:
136
- return RNSScreenDetentTypeMedium;
118
+ auto array = [NSMutableArray<NSNumber *> arrayWithCapacity:detents.size()];
119
+ for (const react::Float value : detents) {
120
+ [array addObject:[NSNumber numberWithFloat:value]];
137
121
  }
122
+ return array;
138
123
  }
139
124
 
140
125
  + (NSDictionary *)gestureResponseDistanceDictFromCppStruct:
@@ -177,6 +162,15 @@
177
162
  }
178
163
  }
179
164
 
165
+ + (NSMutableArray<NSNumber *> *)arrayFromVector:(const std::vector<CGFloat> &)vector
166
+ {
167
+ NSMutableArray *array = [NSMutableArray arrayWithCapacity:vector.size()];
168
+ for (CGFloat val : vector) {
169
+ [array addObject:[NSNumber numberWithFloat:val]];
170
+ }
171
+ return array;
172
+ }
173
+
180
174
  + (UIBlurEffectStyle)UIBlurEffectStyleFromCppEquivalent:(react::RNSScreenStackHeaderConfigBlurEffect)blurEffect
181
175
  {
182
176
  #if !TARGET_OS_TV && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
package/ios/RNSScreen.h CHANGED
@@ -86,8 +86,8 @@ namespace react = facebook::react;
86
86
  @property (nonatomic) BOOL homeIndicatorHidden;
87
87
 
88
88
  // Props controlling UISheetPresentationController
89
- @property (nonatomic) RNSScreenDetentType sheetAllowedDetents;
90
- @property (nonatomic) RNSScreenDetentType sheetLargestUndimmedDetent;
89
+ @property (nonatomic) NSArray<NSNumber *> *sheetAllowedDetents;
90
+ @property (nonatomic) NSNumber *sheetLargestUndimmedDetent;
91
91
  @property (nonatomic) BOOL sheetGrabberVisible;
92
92
  @property (nonatomic) CGFloat sheetCornerRadius;
93
93
  @property (nonatomic) BOOL sheetExpandsWhenScrolledToEdge;
@@ -109,6 +109,7 @@ namespace react = facebook::react;
109
109
  @property (nonatomic, copy) RCTDirectEventBlock onNativeDismissCancelled;
110
110
  @property (nonatomic, copy) RCTDirectEventBlock onTransitionProgress;
111
111
  @property (nonatomic, copy) RCTDirectEventBlock onGestureCancel;
112
+ @property (nonatomic, copy) RCTDirectEventBlock onSheetDetentChanged;
112
113
  #endif // RCT_NEW_ARCH_ENABLED
113
114
 
114
115
  - (void)notifyFinishTransitioning;