From aaeeec168c5ec87d763421167fabd4e4d833f550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Wed, 8 Jul 2026 12:30:12 +0200 Subject: [PATCH 1/6] Emit onDetentChange event on android --- .../formsheet/FormSheetBehaviorController.kt | 51 +++++++++++++++++++ .../formsheet/FormSheetDetentChangedEvent.kt | 33 ++++++++++++ .../formsheet/FormSheetDialogManager.kt | 5 +- .../gamma/modals/formsheet/FormSheetHost.kt | 1 + .../formsheet/FormSheetHostEventEmitter.kt | 6 +++ .../formsheet/FormSheetHostViewManager.kt | 1 + .../modals/form-sheet/FormSheet.types.ts | 2 - 7 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDetentChangedEvent.kt diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetBehaviorController.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetBehaviorController.kt index 9d535205f6..d994754cd8 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetBehaviorController.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetBehaviorController.kt @@ -1,13 +1,43 @@ package com.swmansion.rnscreens.gamma.modals.formsheet +import android.view.View import android.widget.FrameLayout import com.google.android.material.bottomsheet.BottomSheetBehavior internal class FormSheetBehaviorController( private val sheetView: FrameLayout, + private val onDetentChanged: ((index: Int) -> Unit)? = null, ) { private val behavior = BottomSheetBehavior.from(sheetView) + private var currentDetentsCount: Int = 1 + + private val bottomSheetCallback = + object : BottomSheetBehavior.BottomSheetCallback() { + override fun onStateChanged( + bottomSheet: View, + newState: Int, + ) { + val index = mapStateToDetentIndex(newState) + if (index != -1) { + onDetentChanged?.invoke(index) + } + } + + override fun onSlide( + bottomSheet: View, + slideOffset: Float, + ) = Unit + } + + internal fun setup() { + behavior.addBottomSheetCallback(bottomSheetCallback) + } + + internal fun destroy() { + behavior.removeBottomSheetCallback(bottomSheetCallback) + } + /** * @param detents - parsed detents configuration. * @param sheetAvailableSpace - the full window height that detent fractions are measured against. @@ -25,6 +55,8 @@ internal class FormSheetBehaviorController( contentHeightForFitToContents: Int = 0, nativeContainerPaddingBottom: Int = 0, ) { + currentDetentsCount = detents.count + if (sheetAvailableSpace <= 0) { return } @@ -95,4 +127,23 @@ internal class FormSheetBehaviorController( // TODO: @t0maboro - in v4 impl the state was passed as a param, consider the same approach state = BottomSheetBehavior.STATE_COLLAPSED } + + private fun mapStateToDetentIndex(state: Int): Int = + when (currentDetentsCount) { + 1 -> if (state == BottomSheetBehavior.STATE_EXPANDED) 0 else -1 + 2 -> + when (state) { + BottomSheetBehavior.STATE_COLLAPSED -> 0 + BottomSheetBehavior.STATE_EXPANDED -> 1 + else -> -1 + } + 3 -> + when (state) { + BottomSheetBehavior.STATE_COLLAPSED -> 0 + BottomSheetBehavior.STATE_HALF_EXPANDED -> 1 + BottomSheetBehavior.STATE_EXPANDED -> 2 + else -> -1 + } + else -> -1 + } } diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDetentChangedEvent.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDetentChangedEvent.kt new file mode 100644 index 0000000000..ca1d8dff29 --- /dev/null +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDetentChangedEvent.kt @@ -0,0 +1,33 @@ +package com.swmansion.rnscreens.gamma.modals.formsheet + +import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.WritableMap +import com.facebook.react.uimanager.events.Event +import com.swmansion.rnscreens.gamma.common.event.NamingAwareEventType + +class FormSheetDetentChangedEvent( + surfaceId: Int, + viewId: Int, + private val index: Int, +) : Event(surfaceId, viewId), + NamingAwareEventType { + override fun getEventName(): String = EVENT_NAME + + override fun getEventRegistrationName() = EVENT_REGISTRATION_NAME + + override fun getEventData(): WritableMap = + Arguments.createMap().apply { + putInt("index", index) + } + + override fun canCoalesce(): Boolean = false + + companion object : NamingAwareEventType { + const val EVENT_NAME = "topDetentChanged" + const val EVENT_REGISTRATION_NAME = "onDetentChanged" + + override fun getEventName() = EVENT_NAME + + override fun getEventRegistrationName() = EVENT_REGISTRATION_NAME + } +} diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt index d5fd725a06..d6636576cc 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt @@ -12,6 +12,7 @@ class FormSheetDialogManager( context: Context, private val contentView: View, private val onDismissRequest: () -> Unit, + private val onDetentChanged: ((index: Int) -> Unit)? = null, ) { private var formSheetConfig = FormSheetConfig() @@ -34,7 +35,7 @@ class FormSheetDialogManager( private val bottomSheetView = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet) private val behaviorController = - bottomSheetView?.let { FormSheetBehaviorController(it) } + bottomSheetView?.let { FormSheetBehaviorController(it, onDetentChanged) } private val dimmingManager = DimmingViewManager(context, dialog) @@ -62,6 +63,7 @@ class FormSheetDialogManager( init { presentationManager.setup() dimensionsCoordinator.setup() + behaviorController?.setup() } internal fun applyConfig(newConfig: FormSheetConfig) { @@ -104,6 +106,7 @@ class FormSheetDialogManager( } internal fun destroy() { + behaviorController?.destroy() presentationManager.destroy() dimensionsCoordinator.destroy() dialog.dismiss() diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHost.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHost.kt index 3f7903feaf..b2b75463f0 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHost.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHost.kt @@ -33,6 +33,7 @@ class FormSheetHost( context = context, contentView = sheetContentView, onDismissRequest = { eventEmitter.emitOnNativeDismissEvent() }, + onDetentChanged = { index -> eventEmitter.emitOnDetentChanged(index) }, ) init { diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostEventEmitter.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostEventEmitter.kt index 32d454c17f..c6ece9fccd 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostEventEmitter.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostEventEmitter.kt @@ -44,4 +44,10 @@ internal class FormSheetHostEventEmitter( FormSheetDidDisappearEvent(surfaceId, viewTag), ) } + + fun emitOnDetentChanged(index: Int) { + reactEventDispatcher.dispatchEvent( + FormSheetDetentChangedEvent(surfaceId, viewTag, index), + ) + } } diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostViewManager.kt index 7313d382a8..4a7ccffbee 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostViewManager.kt @@ -132,6 +132,7 @@ class FormSheetHostViewManager : makeEventRegistrationInfo(FormSheetDidAppearEvent), makeEventRegistrationInfo(FormSheetWillDisappearEvent), makeEventRegistrationInfo(FormSheetDidDisappearEvent), + makeEventRegistrationInfo(FormSheetDetentChangedEvent), ) override fun updateState( diff --git a/src/components/gamma/modals/form-sheet/FormSheet.types.ts b/src/components/gamma/modals/form-sheet/FormSheet.types.ts index 4422106326..ea4a71d134 100644 --- a/src/components/gamma/modals/form-sheet/FormSheet.types.ts +++ b/src/components/gamma/modals/form-sheet/FormSheet.types.ts @@ -195,8 +195,6 @@ export interface FormSheetProps { * @summary Called when the sheet settles at a new detent. * * Provides the `index` of the newly selected detent from the `detents` array. - * - * @platform ios */ onDetentChanged?: | FormSheetEventHandler From 416eb86fb47980f904d60ba74e254701984fd8fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Wed, 8 Jul 2026 12:31:32 +0200 Subject: [PATCH 2/6] Mark test as applicable on android --- .../tests/single-feature-tests/form-sheet/index.ts | 4 ++-- .../index.tsx | 11 +---------- .../scenario-description.ts | 11 +++++++++++ .../scenario.md | 0 4 files changed, 14 insertions(+), 12 deletions(-) rename apps/src/tests/single-feature-tests/form-sheet/{test-form-sheet-on-detent-changed-ios => test-form-sheet-on-detent-changed}/index.tsx (86%) create mode 100644 apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/scenario-description.ts rename apps/src/tests/single-feature-tests/form-sheet/{test-form-sheet-on-detent-changed-ios => test-form-sheet-on-detent-changed}/scenario.md (100%) diff --git a/apps/src/tests/single-feature-tests/form-sheet/index.ts b/apps/src/tests/single-feature-tests/form-sheet/index.ts index b047fe2e04..f509ccc688 100644 --- a/apps/src/tests/single-feature-tests/form-sheet/index.ts +++ b/apps/src/tests/single-feature-tests/form-sheet/index.ts @@ -11,7 +11,7 @@ import TestFormSheetInitialDetentIndex from './test-form-sheet-initial-detent-in import TestFormSheetLargestUndimmedDetentIndex from './test-form-sheet-largest-undimmed-detent-index-ios'; import TestFormSheetLifecycleEvents from './test-form-sheet-lifecycle-events'; import TestFormSheetNativeContainerStyle from './test-form-sheet-native-container-style-ios'; -import TestFormSheetOnDetentChanged from './test-form-sheet-on-detent-changed-ios'; +import TestFormSheetOnDetentChanged from './test-form-sheet-on-detent-changed'; import TestFormSheetPreferredCornerRadius from './test-form-sheet-preferred-corner-radius-ios'; import TestFormSheetPresentationState from './test-form-sheet-presentation-state'; import TestFormSheetPreventNativeDismiss from './test-form-sheet-prevent-native-dismiss-ios'; @@ -28,7 +28,7 @@ export { default as TestFormSheetInitialDetentIndex } from './test-form-sheet-in export { default as TestFormSheetLargestUndimmedDetentIndex } from './test-form-sheet-largest-undimmed-detent-index-ios'; export { default as TestFormSheetLifecycleEvents } from './test-form-sheet-lifecycle-events'; export { default as TestFormSheetNativeContainerStyle } from './test-form-sheet-native-container-style-ios'; -export { default as TestFormSheetOnDetentChanged } from './test-form-sheet-on-detent-changed-ios'; +export { default as TestFormSheetOnDetentChanged } from './test-form-sheet-on-detent-changed'; export { default as TestFormSheetPreferredCornerRadius } from './test-form-sheet-preferred-corner-radius-ios'; export { default as TestFormSheetPresentationState } from './test-form-sheet-presentation-state'; export { default as TestFormSheetPreventNativeDismiss } from './test-form-sheet-prevent-native-dismiss-ios'; diff --git a/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed-ios/index.tsx b/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/index.tsx similarity index 86% rename from apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed-ios/index.tsx rename to apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/index.tsx index 392aab6d9b..4bf9cf0a40 100644 --- a/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed-ios/index.tsx +++ b/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/index.tsx @@ -1,17 +1,9 @@ import React, { useState } from 'react'; import { Button, StyleSheet, Text, View } from 'react-native'; import { FormSheet } from 'react-native-screens/experimental'; -import type { ScenarioDescription } from '@apps/tests/shared/helpers'; import { createScenario } from '@apps/tests/shared/helpers'; import { Colors } from '@apps/shared/styling'; - -const scenarioDescription: ScenarioDescription = { - name: 'OnDetentChanged', - key: 'test-form-sheet-on-detent-changed-ios', - details: - 'Allows testing the onDetentChanged event, verifying that the correct detent index is reported when swiping.', - platforms: ['ios'], -}; +import { scenarioDescription } from './scenario-description'; function TestFormSheetOnDetentChanged() { const [isOpen, setIsOpen] = useState(false); @@ -77,7 +69,6 @@ const styles = StyleSheet.create({ flex: 1, backgroundColor: Colors.background, padding: 24, - justifyContent: 'center', alignItems: 'center', }, sheetTitle: { diff --git a/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/scenario-description.ts b/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/scenario-description.ts new file mode 100644 index 0000000000..6514d387a2 --- /dev/null +++ b/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/scenario-description.ts @@ -0,0 +1,11 @@ +import { ScenarioDescription } from '@apps/tests/shared/helpers'; + +export const scenarioDescription: ScenarioDescription = { + name: 'OnDetentChanged', + key: 'test-form-sheet-on-detent-changed', + details: + 'Allows testing the onDetentChanged event, verifying that the correct detent index is reported when swiping.', + platforms: ['android', 'ios'], + e2eCoverage: 'tbd', + smokeTest: false, +}; diff --git a/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed-ios/scenario.md b/apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/scenario.md similarity index 100% rename from apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed-ios/scenario.md rename to apps/src/tests/single-feature-tests/form-sheet/test-form-sheet-on-detent-changed/scenario.md From 1a9515004f9d3d0ba49ed73d4d9c537e559f8b5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Wed, 8 Jul 2026 12:44:05 +0200 Subject: [PATCH 3/6] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../gamma/modals/formsheet/FormSheetBehaviorController.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetBehaviorController.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetBehaviorController.kt index d994754cd8..5e5046cc2a 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetBehaviorController.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetBehaviorController.kt @@ -11,6 +11,7 @@ internal class FormSheetBehaviorController( private val behavior = BottomSheetBehavior.from(sheetView) private var currentDetentsCount: Int = 1 + private var lastEmittedDetentIndex: Int = -1 private val bottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() { @@ -19,7 +20,8 @@ internal class FormSheetBehaviorController( newState: Int, ) { val index = mapStateToDetentIndex(newState) - if (index != -1) { + if (index != -1 && index != lastEmittedDetentIndex) { + lastEmittedDetentIndex = index onDetentChanged?.invoke(index) } } From 95e032bccbed55a37e9c9502a532f332a45ea3a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Thu, 9 Jul 2026 16:46:44 +0200 Subject: [PATCH 4/6] Make general-purpose eventEmitter on dialog manager, attach react's one from Host --- .../formsheet/FormSheetDialogEventEmitter.kt | 9 +++++++++ .../modals/formsheet/FormSheetDialogManager.kt | 15 +++++++++------ .../gamma/modals/formsheet/FormSheetHost.kt | 4 +--- .../modals/formsheet/FormSheetHostEventEmitter.kt | 7 +++---- 4 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogEventEmitter.kt diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogEventEmitter.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogEventEmitter.kt new file mode 100644 index 0000000000..29d9c3e373 --- /dev/null +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogEventEmitter.kt @@ -0,0 +1,9 @@ +package com.swmansion.rnscreens.gamma.modals.formsheet + +import com.swmansion.rnscreens.gamma.common.event.ViewAppearanceEventEmitter + +internal interface FormSheetDialogEventEmitter : ViewAppearanceEventEmitter { + fun emitOnNativeDismissEvent() + + fun emitOnDetentChanged(index: Int) +} diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt index d6636576cc..91557c6c80 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt @@ -5,14 +5,11 @@ import android.util.Log import android.view.ContextThemeWrapper import android.view.View import android.widget.FrameLayout -import com.swmansion.rnscreens.gamma.common.event.ViewAppearanceEventEmitter import com.swmansion.rnscreens.gamma.modals.dimmingview.DimmingViewManager class FormSheetDialogManager( context: Context, private val contentView: View, - private val onDismissRequest: () -> Unit, - private val onDetentChanged: ((index: Int) -> Unit)? = null, ) { private var formSheetConfig = FormSheetConfig() @@ -35,7 +32,9 @@ class FormSheetDialogManager( private val bottomSheetView = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet) private val behaviorController = - bottomSheetView?.let { FormSheetBehaviorController(it, onDetentChanged) } + bottomSheetView?.let { + FormSheetBehaviorController(it) { index -> eventEmitter?.emitOnDetentChanged(index) } + } private val dimmingManager = DimmingViewManager(context, dialog) @@ -52,10 +51,14 @@ class FormSheetDialogManager( dialog = dialog, bottomSheetView = bottomSheetView, dimmingManager = dimmingManager, - onNativeDismiss = onDismissRequest, + onNativeDismiss = { eventEmitter?.emitOnNativeDismissEvent() }, ) - internal var appearanceEventEmitter: ViewAppearanceEventEmitter? by presentationManager::appearanceEventEmitter + internal var eventEmitter: FormSheetDialogEventEmitter? = null + set(value) { + field = value + presentationManager.appearanceEventEmitter = value + } internal val contentSizeChangeDelegate: FormSheetContentSizeChangeDelegate get() = dimensionsCoordinator diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHost.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHost.kt index b2b75463f0..11c1746d00 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHost.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHost.kt @@ -32,8 +32,6 @@ class FormSheetHost( FormSheetDialogManager( context = context, contentView = sheetContentView, - onDismissRequest = { eventEmitter.emitOnNativeDismissEvent() }, - onDetentChanged = { index -> eventEmitter.emitOnDetentChanged(index) }, ) init { @@ -79,7 +77,7 @@ class FormSheetHost( internal fun onViewManagerAddEventEmitters() { check(id != NO_ID) { "[RNScreens] FormSheetHost must have its tag set when registering event emitters" } eventEmitter = FormSheetHostEventEmitter(reactContext, id) - dialogManager.appearanceEventEmitter = eventEmitter + dialogManager.eventEmitter = eventEmitter } internal fun onAfterUpdateTransaction() { diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostEventEmitter.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostEventEmitter.kt index c6ece9fccd..d9b7b4b00e 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostEventEmitter.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetHostEventEmitter.kt @@ -2,14 +2,13 @@ package com.swmansion.rnscreens.gamma.modals.formsheet import com.facebook.react.bridge.ReactContext import com.swmansion.rnscreens.gamma.common.event.BaseEventEmitter -import com.swmansion.rnscreens.gamma.common.event.ViewAppearanceEventEmitter internal class FormSheetHostEventEmitter( reactContext: ReactContext, viewTag: Int, ) : BaseEventEmitter(reactContext, viewTag), - ViewAppearanceEventEmitter { - fun emitOnNativeDismissEvent() { + FormSheetDialogEventEmitter { + override fun emitOnNativeDismissEvent() { reactEventDispatcher.dispatchEvent( FormSheetNativeDismissEvent(surfaceId, viewTag), ) @@ -45,7 +44,7 @@ internal class FormSheetHostEventEmitter( ) } - fun emitOnDetentChanged(index: Int) { + override fun emitOnDetentChanged(index: Int) { reactEventDispatcher.dispatchEvent( FormSheetDetentChangedEvent(surfaceId, viewTag, index), ) From 49ce73467d3d5f277567743717ab5bb11003ad85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Thu, 9 Jul 2026 16:49:35 +0200 Subject: [PATCH 5/6] Cleanup --- .../gamma/modals/formsheet/FormSheetDialogManager.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt index 91557c6c80..818d78a117 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/modals/formsheet/FormSheetDialogManager.kt @@ -6,6 +6,7 @@ import android.view.ContextThemeWrapper import android.view.View import android.widget.FrameLayout import com.swmansion.rnscreens.gamma.modals.dimmingview.DimmingViewManager +import kotlin.properties.Delegates class FormSheetDialogManager( context: Context, @@ -54,11 +55,9 @@ class FormSheetDialogManager( onNativeDismiss = { eventEmitter?.emitOnNativeDismissEvent() }, ) - internal var eventEmitter: FormSheetDialogEventEmitter? = null - set(value) { - field = value - presentationManager.appearanceEventEmitter = value - } + internal var eventEmitter: FormSheetDialogEventEmitter? by Delegates.observable(null) { _, _, newValue -> + presentationManager.appearanceEventEmitter = newValue + } internal val contentSizeChangeDelegate: FormSheetContentSizeChangeDelegate get() = dimensionsCoordinator From 2f9d9ba0064081d7525b4200ac09011334461867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Thu, 9 Jul 2026 16:54:09 +0200 Subject: [PATCH 6/6] Restore platform annotation --- src/components/gamma/modals/form-sheet/FormSheet.types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/gamma/modals/form-sheet/FormSheet.types.ts b/src/components/gamma/modals/form-sheet/FormSheet.types.ts index ea4a71d134..f3f444c4d0 100644 --- a/src/components/gamma/modals/form-sheet/FormSheet.types.ts +++ b/src/components/gamma/modals/form-sheet/FormSheet.types.ts @@ -195,6 +195,8 @@ export interface FormSheetProps { * @summary Called when the sheet settles at a new detent. * * Provides the `index` of the newly selected detent from the `detents` array. + * + * @platform android, ios */ onDetentChanged?: | FormSheetEventHandler