@lodev09/react-native-true-sheet 3.0.0-beta.9 → 3.0.1

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 (101) hide show
  1. package/README.md +16 -6
  2. package/android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt +29 -33
  3. package/android/src/main/java/com/lodev09/truesheet/TrueSheetModule.kt +3 -1
  4. package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +53 -43
  5. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +390 -89
  6. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +42 -4
  7. package/android/src/main/java/com/lodev09/truesheet/core/RNScreensFragmentObserver.kt +0 -5
  8. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDialogObserver.kt +67 -0
  9. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetGrabberView.kt +70 -0
  10. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetDragEvents.kt +71 -0
  11. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetFocusEvents.kt +65 -0
  12. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetLifecycleEvents.kt +94 -0
  13. package/android/src/main/java/com/lodev09/truesheet/events/TrueSheetStateEvents.kt +56 -0
  14. package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +37 -33
  15. package/android/src/main/res/anim/true_sheet_slide_in.xml +13 -0
  16. package/android/src/main/res/anim/true_sheet_slide_out.xml +13 -0
  17. package/android/src/main/res/values/styles.xml +13 -1
  18. package/common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetViewShadowNode.cpp +5 -3
  19. package/ios/TrueSheetContainerView.mm +4 -0
  20. package/ios/TrueSheetContentView.h +2 -1
  21. package/ios/TrueSheetContentView.mm +91 -11
  22. package/ios/TrueSheetView.mm +94 -41
  23. package/ios/TrueSheetViewController.h +22 -10
  24. package/ios/TrueSheetViewController.mm +360 -173
  25. package/ios/core/TrueSheetBlurView.h +26 -0
  26. package/ios/{utils/ConversionUtil.mm → core/TrueSheetBlurView.mm} +64 -3
  27. package/ios/core/TrueSheetGrabberView.h +42 -0
  28. package/ios/core/TrueSheetGrabberView.mm +107 -0
  29. package/ios/events/TrueSheetDragEvents.h +39 -0
  30. package/ios/events/TrueSheetDragEvents.mm +62 -0
  31. package/ios/events/{OnPositionChangeEvent.h → TrueSheetFocusEvents.h} +8 -5
  32. package/ios/events/TrueSheetFocusEvents.mm +49 -0
  33. package/ios/events/TrueSheetLifecycleEvents.h +40 -0
  34. package/ios/events/TrueSheetLifecycleEvents.mm +71 -0
  35. package/ios/events/TrueSheetStateEvents.h +35 -0
  36. package/ios/events/TrueSheetStateEvents.mm +49 -0
  37. package/ios/utils/GestureUtil.h +7 -0
  38. package/ios/utils/GestureUtil.mm +12 -0
  39. package/lib/module/TrueSheet.js +72 -12
  40. package/lib/module/TrueSheet.js.map +1 -1
  41. package/lib/module/fabric/TrueSheetViewNativeComponent.ts +28 -5
  42. package/lib/module/index.js +0 -1
  43. package/lib/module/index.js.map +1 -1
  44. package/lib/module/reanimated/ReanimatedTrueSheet.js +13 -7
  45. package/lib/module/reanimated/ReanimatedTrueSheet.js.map +1 -1
  46. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js +4 -2
  47. package/lib/module/reanimated/ReanimatedTrueSheetProvider.js.map +1 -1
  48. package/lib/typescript/src/TrueSheet.d.ts +4 -0
  49. package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
  50. package/lib/typescript/src/TrueSheet.types.d.ts +105 -6
  51. package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
  52. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +25 -5
  53. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
  54. package/lib/typescript/src/index.d.ts +0 -1
  55. package/lib/typescript/src/index.d.ts.map +1 -1
  56. package/lib/typescript/src/reanimated/ReanimatedTrueSheet.d.ts.map +1 -1
  57. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts +8 -2
  58. package/lib/typescript/src/reanimated/ReanimatedTrueSheetProvider.d.ts.map +1 -1
  59. package/package.json +8 -2
  60. package/src/TrueSheet.tsx +87 -10
  61. package/src/TrueSheet.types.ts +114 -6
  62. package/src/__mocks__/index.js +0 -5
  63. package/src/fabric/TrueSheetViewNativeComponent.ts +28 -5
  64. package/src/index.ts +0 -1
  65. package/src/reanimated/ReanimatedTrueSheet.tsx +12 -7
  66. package/src/reanimated/ReanimatedTrueSheetProvider.tsx +11 -3
  67. package/android/src/main/java/com/lodev09/truesheet/events/DetentChangeEvent.kt +0 -26
  68. package/android/src/main/java/com/lodev09/truesheet/events/DidDismissEvent.kt +0 -20
  69. package/android/src/main/java/com/lodev09/truesheet/events/DidPresentEvent.kt +0 -26
  70. package/android/src/main/java/com/lodev09/truesheet/events/DragBeginEvent.kt +0 -26
  71. package/android/src/main/java/com/lodev09/truesheet/events/DragChangeEvent.kt +0 -26
  72. package/android/src/main/java/com/lodev09/truesheet/events/DragEndEvent.kt +0 -26
  73. package/android/src/main/java/com/lodev09/truesheet/events/MountEvent.kt +0 -20
  74. package/android/src/main/java/com/lodev09/truesheet/events/PositionChangeEvent.kt +0 -32
  75. package/android/src/main/java/com/lodev09/truesheet/events/WillDismissEvent.kt +0 -20
  76. package/android/src/main/java/com/lodev09/truesheet/events/WillPresentEvent.kt +0 -26
  77. package/ios/events/OnDetentChangeEvent.h +0 -28
  78. package/ios/events/OnDetentChangeEvent.mm +0 -30
  79. package/ios/events/OnDidDismissEvent.h +0 -26
  80. package/ios/events/OnDidDismissEvent.mm +0 -25
  81. package/ios/events/OnDidPresentEvent.h +0 -28
  82. package/ios/events/OnDidPresentEvent.mm +0 -30
  83. package/ios/events/OnDragBeginEvent.h +0 -28
  84. package/ios/events/OnDragBeginEvent.mm +0 -30
  85. package/ios/events/OnDragChangeEvent.h +0 -28
  86. package/ios/events/OnDragChangeEvent.mm +0 -30
  87. package/ios/events/OnDragEndEvent.h +0 -28
  88. package/ios/events/OnDragEndEvent.mm +0 -30
  89. package/ios/events/OnMountEvent.h +0 -26
  90. package/ios/events/OnMountEvent.mm +0 -25
  91. package/ios/events/OnPositionChangeEvent.mm +0 -32
  92. package/ios/events/OnWillDismissEvent.h +0 -26
  93. package/ios/events/OnWillDismissEvent.mm +0 -25
  94. package/ios/events/OnWillPresentEvent.h +0 -28
  95. package/ios/events/OnWillPresentEvent.mm +0 -30
  96. package/ios/utils/ConversionUtil.h +0 -24
  97. package/lib/module/TrueSheetGrabber.js +0 -51
  98. package/lib/module/TrueSheetGrabber.js.map +0 -1
  99. package/lib/typescript/src/TrueSheetGrabber.d.ts +0 -39
  100. package/lib/typescript/src/TrueSheetGrabber.d.ts.map +0 -1
  101. package/src/TrueSheetGrabber.tsx +0 -82
package/README.md CHANGED
@@ -3,6 +3,9 @@
3
3
  [![CI](https://github.com/lodev09/react-native-true-sheet/actions/workflows/ci.yml/badge.svg)](https://github.com/lodev09/react-native-true-sheet/actions/workflows/ci.yml)
4
4
  [![NPM Downloads](https://img.shields.io/npm/d18m/%40lodev09%2Freact-native-true-sheet)](https://www.npmjs.com/package/@lodev09/react-native-true-sheet)
5
5
 
6
+ > [!NOTE]
7
+ > 🎉 **Version 3.0 is here!** Completely rebuilt for Fabric with new features like automatic ScrollView detection, native headers/footers, sheet stacking, and more. [Read the announcement](https://sheet.lodev09.com/blog/release-3-0)
8
+
6
9
  The true native bottom sheet experience for your React Native Apps. 💩
7
10
 
8
11
  <img alt="React Native True Sheet - IOS" src="docs/static/img/preview-ios.gif" width="300" height="600" /><img alt="React Native True Sheet - Android" src="docs/static/img/preview-android.gif" width="300" height="600" />
@@ -10,11 +13,11 @@ The true native bottom sheet experience for your React Native Apps. 💩
10
13
  ## Features
11
14
 
12
15
  * ⚡ **Powered by Fabric** - Built on React Native's new architecture for maximum performance
16
+ * 🚀 **Native** - Implemented in the native realm
13
17
  * 🎯 **Type-safe** - Full TypeScript support with Codegen-generated native interfaces
14
- * 🚀 **Blazing fast** - Direct C++ communication, no bridge overhead
15
- * 🎨 **Native** - Implemented in the native realm
16
18
  * ♿ **Accessible** - Native accessibility and screen reader support out of the box
17
- * 🔄 **Imperative API** - Asynchronus `ref` [methods](https://sheet.lodev09.com/reference/methods#ref-methods)
19
+ * 🔄 **Flexible API** - Use [imperative methods](https://sheet.lodev09.com/reference/methods#ref-methods) or [lifecycle events](https://sheet.lodev09.com/reference/props#events)
20
+ * 🪟 **Liquid Glass** - iOS 26+ Liquid Glass support out of the box. Featured in [Expo Blog](https://expo.dev/blog/how-to-create-apple-maps-style-liquid-glass-sheets)
18
21
 
19
22
  ## Installation
20
23
 
@@ -24,13 +27,20 @@ The true native bottom sheet experience for your React Native Apps. 💩
24
27
 
25
28
  ### Prerequisites
26
29
 
27
- - React Native >= 0.81
28
- - New Architecture enabled (`RCT_NEW_ARCH_ENABLED=1` for iOS, `newArchEnabled=true` for Android)
30
+ - React Native >= 0.76 (Expo SDK 52+)
31
+ - New Architecture enabled (default in RN 0.76+)
32
+
33
+ ### Expo
34
+
35
+ ```sh
36
+ npx expo install @lodev09/react-native-true-sheet
37
+ ```
29
38
 
30
- ### Install
39
+ ### Bare React Native
31
40
 
32
41
  ```sh
33
42
  yarn add @lodev09/react-native-true-sheet
43
+ cd ios && pod install
34
44
  ```
35
45
 
36
46
  ## Documentation
@@ -2,7 +2,6 @@ package com.lodev09.truesheet
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.view.View
5
- import androidx.core.view.isNotEmpty
6
5
  import com.facebook.react.uimanager.ThemedReactContext
7
6
  import com.facebook.react.views.view.ReactViewGroup
8
7
 
@@ -25,30 +24,9 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
25
24
 
26
25
  var delegate: TrueSheetContainerViewDelegate? = null
27
26
 
28
- val contentView: TrueSheetContentView?
29
- get() = if (isNotEmpty() && getChildAt(0) is TrueSheetContentView) {
30
- getChildAt(0) as TrueSheetContentView
31
- } else {
32
- null
33
- }
34
-
35
- val headerView: TrueSheetHeaderView?
36
- get() {
37
- for (i in 0 until childCount) {
38
- val child = getChildAt(i)
39
- if (child is TrueSheetHeaderView) return child
40
- }
41
- return null
42
- }
43
-
44
- val footerView: TrueSheetFooterView?
45
- get() {
46
- for (i in 0 until childCount) {
47
- val child = getChildAt(i)
48
- if (child is TrueSheetFooterView) return child
49
- }
50
- return null
51
- }
27
+ var contentView: TrueSheetContentView? = null
28
+ var headerView: TrueSheetHeaderView? = null
29
+ var footerView: TrueSheetFooterView? = null
52
30
 
53
31
  var contentHeight: Int = 0
54
32
  var headerHeight: Int = 0
@@ -64,24 +42,42 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
64
42
  super.addView(child, index)
65
43
 
66
44
  when (child) {
67
- is TrueSheetContentView -> child.delegate = this
68
- is TrueSheetHeaderView -> child.delegate = this
69
- is TrueSheetFooterView -> child.delegate = this
45
+ is TrueSheetContentView -> {
46
+ child.delegate = this
47
+ contentView = child
48
+ }
49
+
50
+ is TrueSheetHeaderView -> {
51
+ child.delegate = this
52
+ headerView = child
53
+ }
54
+
55
+ is TrueSheetFooterView -> {
56
+ child.delegate = this
57
+ footerView = child
58
+ }
70
59
  }
71
60
  }
72
61
 
73
62
  override fun removeViewAt(index: Int) {
74
- val view = getChildAt(index)
75
-
76
- when (view) {
77
- is TrueSheetContentView -> view.delegate = null
63
+ when (val view = getChildAt(index)) {
64
+ is TrueSheetContentView -> {
65
+ view.delegate = null
66
+ contentView = null
67
+ contentViewDidChangeSize(0, 0)
68
+ }
78
69
 
79
70
  is TrueSheetHeaderView -> {
80
71
  view.delegate = null
72
+ headerView = null
81
73
  headerViewDidChangeSize(0, 0)
82
74
  }
83
75
 
84
- is TrueSheetFooterView -> view.delegate = null
76
+ is TrueSheetFooterView -> {
77
+ view.delegate = null
78
+ footerView = null
79
+ footerViewDidChangeSize(0, 0)
80
+ }
85
81
  }
86
82
 
87
83
  super.removeViewAt(index)
@@ -8,6 +8,7 @@ import com.facebook.react.bridge.ReactMethod
8
8
  import com.facebook.react.module.annotations.ReactModule
9
9
  import com.facebook.react.turbomodule.core.interfaces.TurboModule
10
10
  import com.facebook.react.uimanager.UIManagerHelper
11
+ import com.lodev09.truesheet.core.TrueSheetDialogObserver
11
12
  import java.util.concurrent.ConcurrentHashMap
12
13
 
13
14
  /**
@@ -27,10 +28,11 @@ class TrueSheetModule(reactContext: ReactApplicationContext) :
27
28
 
28
29
  override fun invalidate() {
29
30
  super.invalidate()
30
- // Clear all registered views on module invalidation
31
+ // Clear all registered views and observer on module invalidation
31
32
  synchronized(viewRegistry) {
32
33
  viewRegistry.clear()
33
34
  }
35
+ TrueSheetDialogObserver.clear()
34
36
  }
35
37
 
36
38
  /**
@@ -13,16 +13,9 @@ import com.facebook.react.uimanager.ThemedReactContext
13
13
  import com.facebook.react.uimanager.UIManagerHelper
14
14
  import com.facebook.react.uimanager.events.EventDispatcher
15
15
  import com.facebook.react.views.view.ReactViewGroup
16
- import com.lodev09.truesheet.events.DetentChangeEvent
17
- import com.lodev09.truesheet.events.DidDismissEvent
18
- import com.lodev09.truesheet.events.DidPresentEvent
19
- import com.lodev09.truesheet.events.DragBeginEvent
20
- import com.lodev09.truesheet.events.DragChangeEvent
21
- import com.lodev09.truesheet.events.DragEndEvent
22
- import com.lodev09.truesheet.events.MountEvent
23
- import com.lodev09.truesheet.events.PositionChangeEvent
24
- import com.lodev09.truesheet.events.WillDismissEvent
25
- import com.lodev09.truesheet.events.WillPresentEvent
16
+ import com.lodev09.truesheet.core.GrabberOptions
17
+ import com.lodev09.truesheet.core.TrueSheetDialogObserver
18
+ import com.lodev09.truesheet.events.*
26
19
 
27
20
  /**
28
21
  * Main TrueSheet host view that manages the sheet dialog and dispatches events to JavaScript.
@@ -35,7 +28,7 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
35
28
  TrueSheetViewControllerDelegate,
36
29
  TrueSheetContainerViewDelegate {
37
30
 
38
- private val viewController: TrueSheetViewController = TrueSheetViewController(reactContext)
31
+ internal val viewController: TrueSheetViewController = TrueSheetViewController(reactContext)
39
32
 
40
33
  private val containerView: TrueSheetContainerView?
41
34
  get() = viewController.getChildAt(0) as? TrueSheetContainerView
@@ -90,17 +83,6 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
90
83
  TrueSheetModule.registerView(this, id)
91
84
  }
92
85
 
93
- override fun onDetachedFromWindow() {
94
- super.onDetachedFromWindow()
95
-
96
- // Don't unregister if we have active modals - we need the view for recovery
97
- if (viewController.hasActiveModals()) {
98
- return
99
- }
100
-
101
- onDropInstance()
102
- }
103
-
104
86
  /**
105
87
  * Called by the manager after all properties are set.
106
88
  * Reconfigures the sheet if it's currently presented.
@@ -151,6 +133,7 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
151
133
  fun onDropInstance() {
152
134
  reactContext.removeLifecycleEventListener(this)
153
135
  TrueSheetModule.unregisterView(id)
136
+ TrueSheetDialogObserver.removeSheet(this)
154
137
 
155
138
  if (viewController.isPresented) {
156
139
  viewController.dismiss()
@@ -171,14 +154,14 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
171
154
 
172
155
  // ==================== TrueSheetViewControllerDelegate Implementation ====================
173
156
 
174
- override fun viewControllerWillPresent(index: Int, position: Float) {
157
+ override fun viewControllerWillPresent(index: Int, position: Float, detent: Float) {
175
158
  val surfaceId = UIManagerHelper.getSurfaceId(this)
176
- eventDispatcher?.dispatchEvent(WillPresentEvent(surfaceId, id, index, position))
159
+ eventDispatcher?.dispatchEvent(WillPresentEvent(surfaceId, id, index, position, detent))
177
160
  }
178
161
 
179
- override fun viewControllerDidPresent(index: Int, position: Float) {
162
+ override fun viewControllerDidPresent(index: Int, position: Float, detent: Float) {
180
163
  val surfaceId = UIManagerHelper.getSurfaceId(this)
181
- eventDispatcher?.dispatchEvent(DidPresentEvent(surfaceId, id, index, position))
164
+ eventDispatcher?.dispatchEvent(DidPresentEvent(surfaceId, id, index, position, detent))
182
165
 
183
166
  // Enable touch event dispatching to React Native
184
167
  viewController.eventDispatcher = eventDispatcher
@@ -194,40 +177,62 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
194
177
  containerView?.footerView?.eventDispatcher = null
195
178
  }
196
179
 
197
- override fun viewControllerDidDismiss() {
180
+ override fun viewControllerDidDismiss(hadParent: Boolean) {
198
181
  val surfaceId = UIManagerHelper.getSurfaceId(this)
199
182
  eventDispatcher?.dispatchEvent(DidDismissEvent(surfaceId, id))
183
+
184
+ TrueSheetDialogObserver.onSheetDidDismiss(this, hadParent)
200
185
  }
201
186
 
202
- override fun viewControllerDidChangeDetent(index: Int, position: Float) {
187
+ override fun viewControllerDidChangeDetent(index: Int, position: Float, detent: Float) {
203
188
  val surfaceId = UIManagerHelper.getSurfaceId(this)
204
- eventDispatcher?.dispatchEvent(DetentChangeEvent(surfaceId, id, index, position))
189
+ eventDispatcher?.dispatchEvent(DetentChangeEvent(surfaceId, id, index, position, detent))
205
190
  }
206
191
 
207
- override fun viewControllerDidDragBegin(index: Int, position: Float) {
192
+ override fun viewControllerDidDragBegin(index: Int, position: Float, detent: Float) {
208
193
  val surfaceId = UIManagerHelper.getSurfaceId(this)
209
- eventDispatcher?.dispatchEvent(DragBeginEvent(surfaceId, id, index, position))
194
+ eventDispatcher?.dispatchEvent(DragBeginEvent(surfaceId, id, index, position, detent))
210
195
  }
211
196
 
212
- override fun viewControllerDidDragChange(index: Int, position: Float) {
197
+ override fun viewControllerDidDragChange(index: Int, position: Float, detent: Float) {
213
198
  val surfaceId = UIManagerHelper.getSurfaceId(this)
214
- eventDispatcher?.dispatchEvent(DragChangeEvent(surfaceId, id, index, position))
199
+ eventDispatcher?.dispatchEvent(DragChangeEvent(surfaceId, id, index, position, detent))
215
200
  }
216
201
 
217
- override fun viewControllerDidDragEnd(index: Int, position: Float) {
202
+ override fun viewControllerDidDragEnd(index: Int, position: Float, detent: Float) {
218
203
  val surfaceId = UIManagerHelper.getSurfaceId(this)
219
- eventDispatcher?.dispatchEvent(DragEndEvent(surfaceId, id, index, position))
204
+ eventDispatcher?.dispatchEvent(DragEndEvent(surfaceId, id, index, position, detent))
220
205
  }
221
206
 
222
- override fun viewControllerDidChangePosition(index: Int, position: Float, transitioning: Boolean) {
207
+ override fun viewControllerDidChangePosition(index: Float, position: Float, detent: Float, realtime: Boolean) {
223
208
  val surfaceId = UIManagerHelper.getSurfaceId(this)
224
- eventDispatcher?.dispatchEvent(PositionChangeEvent(surfaceId, id, index, position, transitioning))
209
+ eventDispatcher?.dispatchEvent(PositionChangeEvent(surfaceId, id, index, position, detent, realtime))
225
210
  }
226
211
 
227
212
  override fun viewControllerDidChangeSize(width: Int, height: Int) {
228
213
  updateState(width, height)
229
214
  }
230
215
 
216
+ override fun viewControllerWillFocus() {
217
+ val surfaceId = UIManagerHelper.getSurfaceId(this)
218
+ eventDispatcher?.dispatchEvent(WillFocusEvent(surfaceId, id))
219
+ }
220
+
221
+ override fun viewControllerDidFocus() {
222
+ val surfaceId = UIManagerHelper.getSurfaceId(this)
223
+ eventDispatcher?.dispatchEvent(FocusEvent(surfaceId, id))
224
+ }
225
+
226
+ override fun viewControllerWillBlur() {
227
+ val surfaceId = UIManagerHelper.getSurfaceId(this)
228
+ eventDispatcher?.dispatchEvent(WillBlurEvent(surfaceId, id))
229
+ }
230
+
231
+ override fun viewControllerDidBlur() {
232
+ val surfaceId = UIManagerHelper.getSurfaceId(this)
233
+ eventDispatcher?.dispatchEvent(BlurEvent(surfaceId, id))
234
+ }
235
+
231
236
  // ==================== Property Setters (forward to controller) ====================
232
237
 
233
238
  fun setMaxHeight(height: Int) {
@@ -269,16 +274,21 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
269
274
  viewController.dismissible = dismissible
270
275
  }
271
276
 
277
+ fun setDraggable(draggable: Boolean) {
278
+ viewController.draggable = draggable
279
+ }
280
+
272
281
  fun setGrabber(grabber: Boolean) {
273
282
  viewController.grabber = grabber
274
283
  }
275
284
 
285
+ fun setGrabberOptions(options: GrabberOptions?) {
286
+ viewController.grabberOptions = options
287
+ }
288
+
276
289
  fun setDetents(newDetents: MutableList<Double>) {
277
290
  viewController.detents = newDetents
278
291
  }
279
-
280
- fun setBlurTint(tint: String?) {}
281
-
282
292
  fun setEdgeToEdgeFullScreen(edgeToEdgeFullScreen: Boolean) {
283
293
  viewController.edgeToEdgeFullScreen = edgeToEdgeFullScreen
284
294
  }
@@ -303,6 +313,9 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
303
313
 
304
314
  @UiThread
305
315
  fun present(detentIndex: Int, animated: Boolean = true, promiseCallback: () -> Unit) {
316
+ if (!viewController.isPresented) {
317
+ viewController.parentSheetView = TrueSheetDialogObserver.onSheetWillPresent(this, detentIndex)
318
+ }
306
319
  viewController.presentPromise = promiseCallback
307
320
  viewController.present(detentIndex, animated)
308
321
  }
@@ -336,9 +349,6 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
336
349
 
337
350
  override fun containerViewHeaderDidChangeSize(width: Int, height: Int) {
338
351
  updateSheetIfNeeded()
339
- // Update state for scroll view behavior to work correctly with header
340
- val sheetHeight = TrueSheetViewController.getEffectiveSheetHeight(viewController.height, height)
341
- updateState(viewController.width, sheetHeight)
342
352
  }
343
353
 
344
354
  override fun containerViewFooterDidChangeSize(width: Int, height: Int) {