From 8742fffd5c20f9d5b63ccb125a0b1ce480ec52bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Thu, 21 May 2026 11:39:29 +0200 Subject: [PATCH 01/18] Move AppearanceCoordinator/Applicator to ContentController --- .../RNSFormSheetContentController.h | 15 ++- .../RNSFormSheetContentController.mm | 76 ++++++++++++++- .../RNSFormSheetHostComponentView.h | 1 + .../RNSFormSheetHostComponentView.mm | 92 ++++++++++++------- 4 files changed, 146 insertions(+), 38 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h index ae48ae2e95..521b7d0934 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h @@ -6,6 +6,7 @@ NS_ASSUME_NONNULL_BEGIN @class RNSFormSheetContentView; @class RNSFormSheetContentController; +@class RNSFormSheetHostComponentView; @protocol RNSFormSheetContentControllerDelegate - (void)sheetControllerDidNativeDismiss:(RNSFormSheetContentController *)controller; @@ -20,10 +21,20 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, weak, nullable) id delegate; +@property (nonatomic, weak, nullable) RNSFormSheetHostComponentView *hostComponentView; + @property (nonatomic, readonly, nonnull) RNSFormSheetContentView *contentView; -- (void)presentFromWindowIfNeeded:(nonnull UIWindow *)window; -- (void)dismissIfNeeded; +#pragma mark - Signals + +- (void)setNeedsPresentationUpdate; +- (void)setNeedsAppearanceUpdate; +- (void)setNeedsInitialDetentReset; + +#pragma mark - Mounting transaction signals + +- (void)reactMountingTransactionWillMount; +- (void)reactMountingTransactionDidMount; @end diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index 129c3fca5d..b40c59d085 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -1,5 +1,9 @@ #import "RNSFormSheetContentController.h" +#import "RNSFormSheetAppearanceApplicator.h" +#import "RNSFormSheetAppearanceCoordinator.h" +#import "RNSFormSheetAppearanceUpdateFlags.h" #import "RNSFormSheetContentView.h" +#import "RNSFormSheetHostComponentView.h" #import "RNSPresentationSourceProvider.h" #import @@ -13,12 +17,22 @@ @interface RNSFormSheetContentController () @end -@implementation RNSFormSheetContentController +@implementation RNSFormSheetContentController { + RNSFormSheetAppearanceCoordinator *_Nonnull _appearanceCoordinator; + RNSFormSheetAppearanceApplicator *_Nonnull _appearanceApplicator; + + BOOL _needsInitialDetentReset; +} - (instancetype)init { if (self = [super init]) { self.modalPresentationStyle = UIModalPresentationFormSheet; + + _appearanceCoordinator = [RNSFormSheetAppearanceCoordinator new]; + _appearanceApplicator = [RNSFormSheetAppearanceApplicator new]; + + _needsInitialDetentReset = NO; } return self; } @@ -46,6 +60,17 @@ - (void)viewDidLayoutSubviews #pragma mark - Presentation +- (void)updatePresentationStateForHost:(nonnull RNSFormSheetHostComponentView *)host +{ + if (host.isOpen) { + if (host.window != nil) { + [self presentFromWindowIfNeeded:host.window]; + } + } else { + [self dismissIfNeeded]; + } +} + - (void)prepareForPresentation { // The presentation controller is recreated by UIKit on every present/dismiss cycle. @@ -88,6 +113,55 @@ - (void)dismissIfNeeded [self dismissViewControllerAnimated:YES completion:nil]; } +#pragma mark - Appearance + +- (void)updateAppearanceIfNeededForHost:(nonnull RNSFormSheetHostComponentView *)host +{ + if (_needsInitialDetentReset) { + _needsInitialDetentReset = NO; + [_appearanceApplicator resetInitialDetent]; + } + + [_appearanceApplicator updateAppearanceIfNeededForHost:host controller:self coordinator:_appearanceCoordinator]; + + // TODO: @t0maboro - move presentation logic to dedicated presentationCoordinator with 4-state logic + [_appearanceCoordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation + performOperations:^{ + [self updatePresentationStateForHost:host]; + }]; +} + +#pragma mark - Signals + +- (void)setNeedsPresentationUpdate +{ + [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation]; +} + +- (void)setNeedsAppearanceUpdate +{ + [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration]; +} + +- (void)setNeedsInitialDetentReset +{ + _needsInitialDetentReset = YES; +} + +#pragma mark - Mounting transaction signals + +- (void)reactMountingTransactionWillMount +{ + // noop +} + +- (void)reactMountingTransactionDidMount +{ + RNSFormSheetHostComponentView *host = self.hostComponentView; + RCTAssert(host != nil, @"[RNScreens] hostComponentView must be set before mounting transactions are observed"); + [self updateAppearanceIfNeededForHost:host]; +} + #pragma mark - UIAdaptivePresentationControllerDelegate - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h index dcd05051e1..2f9853382c 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h @@ -20,6 +20,7 @@ NS_ASSUME_NONNULL_BEGIN - (const std::vector &)detents; #endif +@property (nonatomic, readonly) BOOL isOpen; @property (nonatomic, readonly) BOOL prefersGrabberVisible; @property (nonatomic, readonly) CGFloat preferredCornerRadius; @property (nonatomic, readonly) NSInteger largestUndimmedDetentIndex; diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index e93235f2a4..13610e6809 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -1,13 +1,12 @@ #import "RNSFormSheetHostComponentView.h" #import "RNSDefines.h" -#import "RNSFormSheetAppearanceApplicator.h" -#import "RNSFormSheetAppearanceCoordinator.h" #import "RNSFormSheetContentController.h" #import "RNSFormSheetContentView.h" #import "RNSFormSheetDetentResolver.h" #import "RNSFormSheetHostEventEmitter.h" #import "RNSFormSheetHostShadowStateProxy.h" +#import #import #import #import @@ -15,20 +14,22 @@ namespace react = facebook::react; -@interface RNSFormSheetHostComponentView () +@interface RNSFormSheetHostComponentView () @end @implementation RNSFormSheetHostComponentView { RNSFormSheetHostEventEmitter *_Nonnull _reactEventEmitter; RNSFormSheetHostShadowStateProxy *_Nonnull _shadowStateProxy; - RNSFormSheetAppearanceCoordinator *_Nonnull _appearanceCoordinator; - RNSFormSheetAppearanceApplicator *_Nonnull _appearanceApplicator; RNSFormSheetContentController *_Nullable _controller; RCTSurfaceTouchHandler *_Nullable _touchHandler; + // Invalidation flags + BOOL _needsPresentationUpdate; + BOOL _needsAppearanceUpdate; + BOOL _needsInitialDetentReset; + // Props - BOOL _isOpen; std::vector _detents; } @@ -47,8 +48,10 @@ - (void)initState _reactEventEmitter = [RNSFormSheetHostEventEmitter new]; _shadowStateProxy = [RNSFormSheetHostShadowStateProxy new]; - _appearanceCoordinator = [RNSFormSheetAppearanceCoordinator new]; - _appearanceApplicator = [RNSFormSheetAppearanceApplicator new]; + + _needsPresentationUpdate = NO; + _needsAppearanceUpdate = NO; + _needsInitialDetentReset = NO; } - (void)resetProps @@ -74,23 +77,14 @@ - (void)setupController { _controller = [RNSFormSheetContentController new]; _controller.delegate = self; -} - -- (void)updatePresentationState -{ - if (_isOpen) { - if (self.window != nil) { - [_controller presentFromWindowIfNeeded:self.window]; - } - } else { - [_controller dismissIfNeeded]; - } + _controller.hostComponentView = self; } - (void)didMoveToWindow { [super didMoveToWindow]; - [self updatePresentationState]; + _needsPresentationUpdate = YES; + [self requestContentControllerForUpdates]; } #pragma mark - RNSFormSheetContentControllerDelegate @@ -161,36 +155,36 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props if (oldComponentProps.isOpen != newComponentProps.isOpen) { _isOpen = static_cast(newComponentProps.isOpen); - [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation]; + _needsPresentationUpdate = YES; if (_isOpen) { // ALWAYS refresh the sheet configuration when reopening, // because UIKit destroys the presentationController after the modal is dismissed. - [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration]; + _needsAppearanceUpdate = YES; // Reset the initial-detent applied flag when reopening so the // configured initialDetentIndex can be applied again. - [_appearanceApplicator resetInitialDetent]; + _needsInitialDetentReset = YES; } } if (oldComponentProps.detents != newComponentProps.detents) { _detents = newComponentProps.detents; - [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration]; + _needsAppearanceUpdate = YES; } if (oldComponentProps.prefersGrabberVisible != newComponentProps.prefersGrabberVisible) { _prefersGrabberVisible = newComponentProps.prefersGrabberVisible; - [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration]; + _needsAppearanceUpdate = YES; } if (oldComponentProps.preferredCornerRadius != newComponentProps.preferredCornerRadius) { _preferredCornerRadius = newComponentProps.preferredCornerRadius; - [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration]; + _needsAppearanceUpdate = YES; } if (oldComponentProps.largestUndimmedDetentIndex != newComponentProps.largestUndimmedDetentIndex) { _largestUndimmedDetentIndex = newComponentProps.largestUndimmedDetentIndex; - [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration]; + _needsAppearanceUpdate = YES; } if (oldComponentProps.initialDetentIndex != newComponentProps.initialDetentIndex) { @@ -201,7 +195,7 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props newComponentProps.prefersScrollingExpandsWhenScrolledToEdge) { _prefersScrollingExpandsWhenScrolledToEdge = static_cast(newComponentProps.prefersScrollingExpandsWhenScrolledToEdge); - [_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration]; + _needsAppearanceUpdate = YES; } [super updateProps:props oldProps:oldProps]; @@ -209,16 +203,30 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props - (void)finalizeUpdates:(RNComponentViewUpdateMask)updateMask { + [self requestContentControllerForUpdates]; [super finalizeUpdates:updateMask]; +} - [_appearanceApplicator updateAppearanceIfNeededForHost:self - controller:_controller - coordinator:_appearanceCoordinator]; +- (void)requestContentControllerForUpdates +{ + if (_controller == nil) { + return; + } - [_appearanceCoordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation - performOperations:^{ - [self updatePresentationState]; - }]; + if (_needsPresentationUpdate) { + _needsPresentationUpdate = NO; + [_controller setNeedsPresentationUpdate]; + } + + if (_needsAppearanceUpdate) { + _needsAppearanceUpdate = NO; + [_controller setNeedsAppearanceUpdate]; + } + + if (_needsInitialDetentReset) { + _needsInitialDetentReset = NO; + [_controller setNeedsInitialDetentReset]; + } } - (void)invalidate @@ -236,6 +244,20 @@ - (void)invalidate } } +#pragma mark - RCTMountingTransactionObserving + +- (void)mountingTransactionWillMount:(const facebook::react::MountingTransaction &)transaction + withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry +{ + [_controller reactMountingTransactionWillMount]; +} + +- (void)mountingTransactionDidMount:(const facebook::react::MountingTransaction &)transaction + withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry +{ + [_controller reactMountingTransactionDidMount]; +} + #pragma mark - Layout helpers - (void)syncShadowNodeState From 529e7b105720a469490f3b43d1797fe09661a72e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 10:03:25 +0200 Subject: [PATCH 02/18] Define FormSheetProviders --- .../modals/form-sheet/RNSFormSheetProviders.h | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 ios/gamma/modals/form-sheet/RNSFormSheetProviders.h diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetProviders.h b/ios/gamma/modals/form-sheet/RNSFormSheetProviders.h new file mode 100644 index 0000000000..f005af4b90 --- /dev/null +++ b/ios/gamma/modals/form-sheet/RNSFormSheetProviders.h @@ -0,0 +1,36 @@ +#pragma once + +#import + +#ifdef __cplusplus +#include +#endif + +NS_ASSUME_NONNULL_BEGIN + +@protocol RNSFormSheetPresentationProvider + +- (BOOL)isOpen; +- (nullable UIWindow *)hostWindow; + +@end + +@protocol RNSFormSheetAppearanceProvider + +- (BOOL)prefersGrabberVisible; +- (CGFloat)preferredCornerRadius; +- (NSInteger)largestUndimmedDetentIndex; + +@end + +@protocol RNSFormSheetBehaviorProvider + +#ifdef __cplusplus +- (const std::vector &)detents; +#endif +- (NSInteger)initialDetentIndex; +- (BOOL)prefersScrollingExpandsWhenScrolledToEdge; + +@end + +NS_ASSUME_NONNULL_END From 06be498fc40e80d8d1c8e822a65d13d0052c3ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 10:09:11 +0200 Subject: [PATCH 03/18] Decouple host from controller --- .../RNSFormSheetAppearanceApplicator.h | 8 +++-- .../RNSFormSheetAppearanceApplicator.mm | 36 ++++++++++--------- .../RNSFormSheetContentController.h | 5 ++- .../RNSFormSheetContentController.mm | 25 +++++++------ .../RNSFormSheetHostComponentView.mm | 3 +- 5 files changed, 45 insertions(+), 32 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h index 727d909554..b75ae9a35e 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h @@ -1,6 +1,7 @@ #pragma once #import +#import "RNSFormSheetProviders.h" @class RNSFormSheetAppearanceCoordinator; @class RNSFormSheetContentController; @@ -10,9 +11,10 @@ NS_ASSUME_NONNULL_BEGIN @interface RNSFormSheetAppearanceApplicator : NSObject -- (void)updateAppearanceIfNeededForHost:(RNSFormSheetHostComponentView *)host - controller:(RNSFormSheetContentController *)controller - coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator; +- (void)updateAppearanceIfNeededForAppearanceProvider:(id)appearanceProvider + behaviorProvider:(id)behaviorProvider + controller:(RNSFormSheetContentController *)controller + coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator; - (void)resetInitialDetent; diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.mm b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.mm index 5da37e5d7b..a7adb07fb5 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.mm @@ -6,7 +6,6 @@ #import "RNSFormSheetAppearanceUpdateFlags.h" #import "RNSFormSheetContentController.h" #import "RNSFormSheetDetentResolver.h" -#import "RNSFormSheetHostComponentView.h" @implementation RNSFormSheetAppearanceApplicator { BOOL _initialDetentApplied; @@ -25,20 +24,24 @@ - (void)resetInitialDetent _initialDetentApplied = NO; } -- (void)updateAppearanceIfNeededForHost:(RNSFormSheetHostComponentView *)host - controller:(RNSFormSheetContentController *)controller - coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator +- (void)updateAppearanceIfNeededForAppearanceProvider:(id)appearanceProvider + behaviorProvider:(id)behaviorProvider + controller:(RNSFormSheetContentController *)controller + coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator { [coordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration performOperations:^{ - [self updateSheetConfigurationForHost:host controller:controller]; + [self updateSheetConfigurationForAppearanceProvider:appearanceProvider + behaviorProvider:behaviorProvider + controller:controller]; }]; } #pragma mark - Updaters -- (void)updateSheetConfigurationForHost:(RNSFormSheetHostComponentView *)host - controller:(RNSFormSheetContentController *)controller +- (void)updateSheetConfigurationForAppearanceProvider:(id)appearanceProvider + behaviorProvider:(id)behaviorProvider + controller:(RNSFormSheetContentController *)controller { #if !TARGET_OS_TV UISheetPresentationController *sheet = controller.sheetPresentationController; @@ -47,22 +50,23 @@ - (void)updateSheetConfigurationForHost:(RNSFormSheetHostComponentView *)host @"[RNScreens] sheetPresentationController is nil. Ensure modalPresentationStyle is set to UIModalPresentationFormSheet."); NSArray *nativeDetents = - [RNSFormSheetDetentResolver buildSheetDetentsForFractions:host.detents]; + [RNSFormSheetDetentResolver buildSheetDetentsForFractions:behaviorProvider.detents]; UISheetPresentationControllerDetentIdentifier initialDetentIdentifier = nil; if (!_initialDetentApplied) { - initialDetentIdentifier = [RNSFormSheetDetentResolver initialDetentIdentifierForDetents:nativeDetents - atRequestedIndex:host.initialDetentIndex]; + initialDetentIdentifier = + [RNSFormSheetDetentResolver initialDetentIdentifierForDetents:nativeDetents + atRequestedIndex:behaviorProvider.initialDetentIndex]; _initialDetentApplied = YES; } - UISheetPresentationControllerDetentIdentifier largestUndimmedDetentIdentifier = - [RNSFormSheetDetentResolver largestUndimmedDetentIdentifierForDetents:nativeDetents - atRequestedIndex:host.largestUndimmedDetentIndex]; + UISheetPresentationControllerDetentIdentifier largestUndimmedDetentIdentifier = [RNSFormSheetDetentResolver + largestUndimmedDetentIdentifierForDetents:nativeDetents + atRequestedIndex:appearanceProvider.largestUndimmedDetentIndex]; - BOOL prefersGrabberVisible = host.prefersGrabberVisible; - CGFloat preferredCornerRadius = host.preferredCornerRadius; - BOOL prefersScrollingExpandsWhenScrolledToEdge = host.prefersScrollingExpandsWhenScrolledToEdge; + BOOL prefersGrabberVisible = appearanceProvider.prefersGrabberVisible; + CGFloat preferredCornerRadius = appearanceProvider.preferredCornerRadius; + BOOL prefersScrollingExpandsWhenScrolledToEdge = behaviorProvider.prefersScrollingExpandsWhenScrolledToEdge; [sheet animateChanges:^{ sheet.detents = nativeDetents; diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h index 521b7d0934..b3565453bb 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h @@ -1,6 +1,7 @@ #pragma once #import +#import "RNSFormSheetProviders.h" NS_ASSUME_NONNULL_BEGIN @@ -21,7 +22,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, weak, nullable) id delegate; -@property (nonatomic, weak, nullable) RNSFormSheetHostComponentView *hostComponentView; +@property (nonatomic, weak, nullable) id presentationProvider; +@property (nonatomic, weak, nullable) id appearanceProvider; +@property (nonatomic, weak, nullable) id behaviorProvider; @property (nonatomic, readonly, nonnull) RNSFormSheetContentView *contentView; diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index b40c59d085..c269d4052b 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -60,11 +60,12 @@ - (void)viewDidLayoutSubviews #pragma mark - Presentation -- (void)updatePresentationStateForHost:(nonnull RNSFormSheetHostComponentView *)host +- (void)updatePresentationState { - if (host.isOpen) { - if (host.window != nil) { - [self presentFromWindowIfNeeded:host.window]; + if (self.presentationProvider.isOpen) { + UIWindow *window = self.presentationProvider.hostWindow; + if (window != nil) { + [self presentFromWindowIfNeeded:window]; } } else { [self dismissIfNeeded]; @@ -115,19 +116,21 @@ - (void)dismissIfNeeded #pragma mark - Appearance -- (void)updateAppearanceIfNeededForHost:(nonnull RNSFormSheetHostComponentView *)host +- (void)updateAppearanceIfNeeded { if (_needsInitialDetentReset) { _needsInitialDetentReset = NO; [_appearanceApplicator resetInitialDetent]; } - [_appearanceApplicator updateAppearanceIfNeededForHost:host controller:self coordinator:_appearanceCoordinator]; + [_appearanceApplicator updateAppearanceIfNeededForAppearanceProvider:self.appearanceProvider + behaviorProvider:self.behaviorProvider + controller:self + coordinator:_appearanceCoordinator]; - // TODO: @t0maboro - move presentation logic to dedicated presentationCoordinator with 4-state logic [_appearanceCoordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation performOperations:^{ - [self updatePresentationStateForHost:host]; + [self updatePresentationState]; }]; } @@ -157,9 +160,9 @@ - (void)reactMountingTransactionWillMount - (void)reactMountingTransactionDidMount { - RNSFormSheetHostComponentView *host = self.hostComponentView; - RCTAssert(host != nil, @"[RNScreens] hostComponentView must be set before mounting transactions are observed"); - [self updateAppearanceIfNeededForHost:host]; + RCTAssert(self.presentationProvider != nil, + @"[RNScreens] presentationProvider must be set before mounting transactions are observed"); + [self updateAppearanceIfNeeded]; } #pragma mark - UIAdaptivePresentationControllerDelegate diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index 13610e6809..64f956a22b 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -77,7 +77,8 @@ - (void)setupController { _controller = [RNSFormSheetContentController new]; _controller.delegate = self; - _controller.hostComponentView = self; + // TODO: @t0maboro - migrate + // _controller.hostComponentView = self; } - (void)didMoveToWindow From 33ede2c645b9e249b3c2699a04cccf1a2430df3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 10:17:43 +0200 Subject: [PATCH 04/18] Implement protocols on Host --- .../RNSFormSheetContentController.h | 5 +- .../RNSFormSheetContentController.mm | 9 +-- .../RNSFormSheetHostComponentView.mm | 78 +++++++++++++++---- 3 files changed, 67 insertions(+), 25 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h index b3565453bb..b475f740b7 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h @@ -34,10 +34,9 @@ NS_ASSUME_NONNULL_BEGIN - (void)setNeedsAppearanceUpdate; - (void)setNeedsInitialDetentReset; -#pragma mark - Mounting transaction signals +#pragma mark - Updating -- (void)reactMountingTransactionWillMount; -- (void)reactMountingTransactionDidMount; +- (void)flushPendingUpdates; @end diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index c269d4052b..fd17379f20 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -151,14 +151,9 @@ - (void)setNeedsInitialDetentReset _needsInitialDetentReset = YES; } -#pragma mark - Mounting transaction signals +#pragma mark - Updating -- (void)reactMountingTransactionWillMount -{ - // noop -} - -- (void)reactMountingTransactionDidMount +- (void)flushPendingUpdates { RCTAssert(self.presentationProvider != nil, @"[RNScreens] presentationProvider must be set before mounting transactions are observed"); diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index 64f956a22b..d19a744041 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -5,6 +5,7 @@ #import "RNSFormSheetDetentResolver.h" #import "RNSFormSheetHostEventEmitter.h" #import "RNSFormSheetHostShadowStateProxy.h" +#import "RNSFormSheetProviders.h" #import #import @@ -14,7 +15,11 @@ namespace react = facebook::react; -@interface RNSFormSheetHostComponentView () +@interface RNSFormSheetHostComponentView () @end @implementation RNSFormSheetHostComponentView { @@ -30,7 +35,13 @@ @implementation RNSFormSheetHostComponentView { BOOL _needsInitialDetentReset; // Props + BOOL _isOpen; std::vector _detents; + BOOL _prefersGrabberVisible; + CGFloat _preferredCornerRadius; + NSInteger _largestUndimmedDetentIndex; + NSInteger _initialDetentIndex; + BOOL _prefersScrollingExpandsWhenScrolledToEdge; } - (instancetype)initWithFrame:(CGRect)frame @@ -68,17 +79,14 @@ - (void)resetProps _prefersScrollingExpandsWhenScrolledToEdge = YES; } -- (const std::vector &)detents -{ - return _detents; -} - - (void)setupController { _controller = [RNSFormSheetContentController new]; _controller.delegate = self; - // TODO: @t0maboro - migrate - // _controller.hostComponentView = self; + + _controller.presentationProvider = self; + _controller.appearanceProvider = self; + _controller.behaviorProvider = self; } - (void)didMoveToWindow @@ -88,6 +96,52 @@ - (void)didMoveToWindow [self requestContentControllerForUpdates]; } +#pragma mark - RNSFormSheetPresentationProvider + +- (BOOL)isOpen +{ + return _isOpen; +} + +- (UIWindow *)hostWindow +{ + return self.window; +} + +#pragma mark - RNSFormSheetAppearanceProvider + +- (BOOL)prefersGrabberVisible +{ + return _prefersGrabberVisible; +} + +- (CGFloat)preferredCornerRadius +{ + return _preferredCornerRadius; +} + +- (NSInteger)largestUndimmedDetentIndex +{ + return _largestUndimmedDetentIndex; +} + +#pragma mark - RNSFormSheetBehaviorProvider + +- (const std::vector &)detents +{ + return _detents; +} + +- (NSInteger)initialDetentIndex +{ + return _initialDetentIndex; +} + +- (BOOL)prefersScrollingExpandsWhenScrolledToEdge +{ + return _prefersScrollingExpandsWhenScrolledToEdge; +} + #pragma mark - RNSFormSheetContentControllerDelegate - (void)sheetControllerDidNativeDismiss:(RNSFormSheetContentController *)controller @@ -247,16 +301,10 @@ - (void)invalidate #pragma mark - RCTMountingTransactionObserving -- (void)mountingTransactionWillMount:(const facebook::react::MountingTransaction &)transaction - withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry -{ - [_controller reactMountingTransactionWillMount]; -} - - (void)mountingTransactionDidMount:(const facebook::react::MountingTransaction &)transaction withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry { - [_controller reactMountingTransactionDidMount]; + [_controller flushPendingUpdates]; } #pragma mark - Layout helpers From c6b9efeffd6c65045451eb864e8398dcdabcc7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 10:23:10 +0200 Subject: [PATCH 05/18] Drop invalidation flags from Host --- .../RNSFormSheetContentController.mm | 2 - .../RNSFormSheetHostComponentView.mm | 55 +++---------------- 2 files changed, 8 insertions(+), 49 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index fd17379f20..dff7e7737f 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -155,8 +155,6 @@ - (void)setNeedsInitialDetentReset - (void)flushPendingUpdates { - RCTAssert(self.presentationProvider != nil, - @"[RNScreens] presentationProvider must be set before mounting transactions are observed"); [self updateAppearanceIfNeeded]; } diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index d19a744041..2197b50ef1 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -29,11 +29,6 @@ @implementation RNSFormSheetHostComponentView { RNSFormSheetContentController *_Nullable _controller; RCTSurfaceTouchHandler *_Nullable _touchHandler; - // Invalidation flags - BOOL _needsPresentationUpdate; - BOOL _needsAppearanceUpdate; - BOOL _needsInitialDetentReset; - // Props BOOL _isOpen; std::vector _detents; @@ -59,10 +54,6 @@ - (void)initState _reactEventEmitter = [RNSFormSheetHostEventEmitter new]; _shadowStateProxy = [RNSFormSheetHostShadowStateProxy new]; - - _needsPresentationUpdate = NO; - _needsAppearanceUpdate = NO; - _needsInitialDetentReset = NO; } - (void)resetProps @@ -92,8 +83,6 @@ - (void)setupController - (void)didMoveToWindow { [super didMoveToWindow]; - _needsPresentationUpdate = YES; - [self requestContentControllerForUpdates]; } #pragma mark - RNSFormSheetPresentationProvider @@ -210,36 +199,36 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props if (oldComponentProps.isOpen != newComponentProps.isOpen) { _isOpen = static_cast(newComponentProps.isOpen); - _needsPresentationUpdate = YES; + [_controller setNeedsPresentationUpdate]; if (_isOpen) { // ALWAYS refresh the sheet configuration when reopening, // because UIKit destroys the presentationController after the modal is dismissed. - _needsAppearanceUpdate = YES; + [_controller setNeedsAppearanceUpdate]; // Reset the initial-detent applied flag when reopening so the // configured initialDetentIndex can be applied again. - _needsInitialDetentReset = YES; + [_controller setNeedsInitialDetentReset]; } } if (oldComponentProps.detents != newComponentProps.detents) { _detents = newComponentProps.detents; - _needsAppearanceUpdate = YES; + [_controller setNeedsAppearanceUpdate]; } if (oldComponentProps.prefersGrabberVisible != newComponentProps.prefersGrabberVisible) { _prefersGrabberVisible = newComponentProps.prefersGrabberVisible; - _needsAppearanceUpdate = YES; + [_controller setNeedsAppearanceUpdate]; } if (oldComponentProps.preferredCornerRadius != newComponentProps.preferredCornerRadius) { _preferredCornerRadius = newComponentProps.preferredCornerRadius; - _needsAppearanceUpdate = YES; + [_controller setNeedsAppearanceUpdate]; } if (oldComponentProps.largestUndimmedDetentIndex != newComponentProps.largestUndimmedDetentIndex) { _largestUndimmedDetentIndex = newComponentProps.largestUndimmedDetentIndex; - _needsAppearanceUpdate = YES; + [_controller setNeedsAppearanceUpdate]; } if (oldComponentProps.initialDetentIndex != newComponentProps.initialDetentIndex) { @@ -250,38 +239,10 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props newComponentProps.prefersScrollingExpandsWhenScrolledToEdge) { _prefersScrollingExpandsWhenScrolledToEdge = static_cast(newComponentProps.prefersScrollingExpandsWhenScrolledToEdge); - _needsAppearanceUpdate = YES; - } - - [super updateProps:props oldProps:oldProps]; -} - -- (void)finalizeUpdates:(RNComponentViewUpdateMask)updateMask -{ - [self requestContentControllerForUpdates]; - [super finalizeUpdates:updateMask]; -} - -- (void)requestContentControllerForUpdates -{ - if (_controller == nil) { - return; - } - - if (_needsPresentationUpdate) { - _needsPresentationUpdate = NO; - [_controller setNeedsPresentationUpdate]; - } - - if (_needsAppearanceUpdate) { - _needsAppearanceUpdate = NO; [_controller setNeedsAppearanceUpdate]; } - if (_needsInitialDetentReset) { - _needsInitialDetentReset = NO; - [_controller setNeedsInitialDetentReset]; - } + [super updateProps:props oldProps:oldProps]; } - (void)invalidate From 414255ebe3a9199dd5667dcf40c970ecbad5ded2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 10:27:02 +0200 Subject: [PATCH 06/18] Fix broken didMoveToWindow after refactor --- ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index 2197b50ef1..49bb603932 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -83,6 +83,11 @@ - (void)setupController - (void)didMoveToWindow { [super didMoveToWindow]; + + if (self.window != nil) { + [_controller setNeedsPresentationUpdate]; + [_controller flushPendingUpdates]; + } } #pragma mark - RNSFormSheetPresentationProvider From 9022290ae68410dbb8d249469f21d4089808fcf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 11:20:59 +0200 Subject: [PATCH 07/18] Fix signature --- ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index 49bb603932..54e18d645e 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -97,7 +97,7 @@ - (BOOL)isOpen return _isOpen; } -- (UIWindow *)hostWindow +- (nullable UIWindow *)hostWindow; { return self.window; } From 1fb8840dfb9bf44bd78b3b4e9eeb52a9cf531773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 11:25:41 +0200 Subject: [PATCH 08/18] Remove forward declararion from controller --- ios/gamma/modals/form-sheet/RNSFormSheetContentController.h | 1 - 1 file changed, 1 deletion(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h index b475f740b7..d3f9f11d1d 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h @@ -7,7 +7,6 @@ NS_ASSUME_NONNULL_BEGIN @class RNSFormSheetContentView; @class RNSFormSheetContentController; -@class RNSFormSheetHostComponentView; @protocol RNSFormSheetContentControllerDelegate - (void)sheetControllerDidNativeDismiss:(RNSFormSheetContentController *)controller; From e6c5928af1be7ad2e1f4922f0ea2f22d923f1d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 11:28:45 +0200 Subject: [PATCH 09/18] Add guards for providers --- .../RNSFormSheetContentController.mm | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index dff7e7737f..7753a6de8b 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -62,8 +62,17 @@ - (void)viewDidLayoutSubviews - (void)updatePresentationState { - if (self.presentationProvider.isOpen) { - UIWindow *window = self.presentationProvider.hostWindow; + id presentationProvider = self.presentationProvider; + + RCTAssert(presentationProvider != nil, + @"[RNScreens] Presentation provider must be set before updating presentation state."); + + if (presentationProvider == nil) { + return; + } + + if (presentationProvider.isOpen) { + UIWindow *window = presentationProvider.hostWindow; if (window != nil) { [self presentFromWindowIfNeeded:window]; } @@ -118,13 +127,24 @@ - (void)dismissIfNeeded - (void)updateAppearanceIfNeeded { + id appearanceProvider = self.appearanceProvider; + id behaviorProvider = self.behaviorProvider; + + RCTAssert(appearanceProvider != nil, @"[RNScreens] Appearance provider must be set before updating appearance."); + + RCTAssert(behaviorProvider != nil, @"[RNScreens] Behavior provider must be set before updating appearance."); + + if (appearanceProvider == nil || behaviorProvider == nil) { + return; + } + if (_needsInitialDetentReset) { _needsInitialDetentReset = NO; [_appearanceApplicator resetInitialDetent]; } - [_appearanceApplicator updateAppearanceIfNeededForAppearanceProvider:self.appearanceProvider - behaviorProvider:self.behaviorProvider + [_appearanceApplicator updateAppearanceIfNeededForAppearanceProvider:appearanceProvider + behaviorProvider:behaviorProvider controller:self coordinator:_appearanceCoordinator]; From abbef2dfb9611fba1a4010c1c8ff2ec86d0b0ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 11:34:24 +0200 Subject: [PATCH 10/18] Add TODO --- ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index 7753a6de8b..e51578d9f5 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -148,6 +148,7 @@ - (void)updateAppearanceIfNeeded controller:self coordinator:_appearanceCoordinator]; + // TODO: @t0maboro - decouple presentation logic from AppearanceCoordinator [_appearanceCoordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation performOperations:^{ [self updatePresentationState]; From c56b89c73230f69d41b13a74c79cfbb1924d8832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 11:38:35 +0200 Subject: [PATCH 11/18] Minor cleanups --- ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm | 1 - ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm | 1 - 2 files changed, 2 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index e51578d9f5..c27acd5ee6 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -3,7 +3,6 @@ #import "RNSFormSheetAppearanceCoordinator.h" #import "RNSFormSheetAppearanceUpdateFlags.h" #import "RNSFormSheetContentView.h" -#import "RNSFormSheetHostComponentView.h" #import "RNSPresentationSourceProvider.h" #import diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index 54e18d645e..19af0d9eb7 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -1,5 +1,4 @@ #import "RNSFormSheetHostComponentView.h" -#import "RNSDefines.h" #import "RNSFormSheetContentController.h" #import "RNSFormSheetContentView.h" #import "RNSFormSheetDetentResolver.h" From fa5861af51d332fc397e3f91e956630c047be8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 11:40:48 +0200 Subject: [PATCH 12/18] Remove forward declaration --- ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h | 1 - 1 file changed, 1 deletion(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h index b75ae9a35e..9138e242bb 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h @@ -5,7 +5,6 @@ @class RNSFormSheetAppearanceCoordinator; @class RNSFormSheetContentController; -@class RNSFormSheetHostComponentView; NS_ASSUME_NONNULL_BEGIN From 579fffb19abec86b0f9682e21233d029d6b38ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 11:42:45 +0200 Subject: [PATCH 13/18] Wording --- ios/gamma/modals/form-sheet/RNSFormSheetContentController.h | 2 +- ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h index d3f9f11d1d..07c6aae481 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.h @@ -33,7 +33,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)setNeedsAppearanceUpdate; - (void)setNeedsInitialDetentReset; -#pragma mark - Updating +#pragma mark - Updates - (void)flushPendingUpdates; diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index c27acd5ee6..ac4de6c920 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -171,7 +171,7 @@ - (void)setNeedsInitialDetentReset _needsInitialDetentReset = YES; } -#pragma mark - Updating +#pragma mark - Updates - (void)flushPendingUpdates { From c18345fca58117ce71b2e8d48231181f6a7bf845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 11:44:14 +0200 Subject: [PATCH 14/18] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index 19af0d9eb7..dab5f343b5 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -96,7 +96,7 @@ - (BOOL)isOpen return _isOpen; } -- (nullable UIWindow *)hostWindow; +- (nullable UIWindow *)hostWindow { return self.window; } From c5473d9333235625ac8436e42c00c191d1b0bf66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 13:02:32 +0200 Subject: [PATCH 15/18] Rename --- .../modals/form-sheet/RNSFormSheetAppearanceApplicator.h | 8 ++++---- .../modals/form-sheet/RNSFormSheetAppearanceApplicator.mm | 8 ++++---- .../modals/form-sheet/RNSFormSheetContentController.mm | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h index 9138e242bb..d1ae624dfb 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h @@ -10,10 +10,10 @@ NS_ASSUME_NONNULL_BEGIN @interface RNSFormSheetAppearanceApplicator : NSObject -- (void)updateAppearanceIfNeededForAppearanceProvider:(id)appearanceProvider - behaviorProvider:(id)behaviorProvider - controller:(RNSFormSheetContentController *)controller - coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator; +- (void)updateAppearanceIfNeededWithAppearanceProvider:(id)appearanceProvider + behaviorProvider:(id)behaviorProvider + controller:(RNSFormSheetContentController *)controller + coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator; - (void)resetInitialDetent; diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.mm b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.mm index a7adb07fb5..1d948d2765 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.mm @@ -24,10 +24,10 @@ - (void)resetInitialDetent _initialDetentApplied = NO; } -- (void)updateAppearanceIfNeededForAppearanceProvider:(id)appearanceProvider - behaviorProvider:(id)behaviorProvider - controller:(RNSFormSheetContentController *)controller - coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator +- (void)updateAppearanceIfNeededWithAppearanceProvider:(id)appearanceProvider + behaviorProvider:(id)behaviorProvider + controller:(RNSFormSheetContentController *)controller + coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator { [coordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration performOperations:^{ diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm index ac4de6c920..db6ec60ed2 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm @@ -142,10 +142,10 @@ - (void)updateAppearanceIfNeeded [_appearanceApplicator resetInitialDetent]; } - [_appearanceApplicator updateAppearanceIfNeededForAppearanceProvider:appearanceProvider - behaviorProvider:behaviorProvider - controller:self - coordinator:_appearanceCoordinator]; + [_appearanceApplicator updateAppearanceIfNeededWithAppearanceProvider:appearanceProvider + behaviorProvider:behaviorProvider + controller:self + coordinator:_appearanceCoordinator]; // TODO: @t0maboro - decouple presentation logic from AppearanceCoordinator [_appearanceCoordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation From dc3f9ac3a6fd02d193cdb927a0bbbe8bbaa04011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 13:14:21 +0200 Subject: [PATCH 16/18] Expose via providers, drop properties --- .../modals/form-sheet/RNSFormSheetHostComponentView.h | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h index 2f9853382c..fe72407978 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h @@ -16,17 +16,6 @@ NS_ASSUME_NONNULL_BEGIN @interface RNSFormSheetHostComponentView () -#if defined(__cplusplus) -- (const std::vector &)detents; -#endif - -@property (nonatomic, readonly) BOOL isOpen; -@property (nonatomic, readonly) BOOL prefersGrabberVisible; -@property (nonatomic, readonly) CGFloat preferredCornerRadius; -@property (nonatomic, readonly) NSInteger largestUndimmedDetentIndex; -@property (nonatomic, readonly) NSInteger initialDetentIndex; -@property (nonatomic, readonly) BOOL prefersScrollingExpandsWhenScrolledToEdge; - @end NS_ASSUME_NONNULL_END From a8a43b2a087f96ffbc3a22abf7b709d6be1d11b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 13:56:39 +0200 Subject: [PATCH 17/18] Revert "Expose via providers, drop properties" This reverts commit dc3f9ac3a6fd02d193cdb927a0bbbe8bbaa04011. --- .../modals/form-sheet/RNSFormSheetHostComponentView.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h index fe72407978..2f9853382c 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.h @@ -16,6 +16,17 @@ NS_ASSUME_NONNULL_BEGIN @interface RNSFormSheetHostComponentView () +#if defined(__cplusplus) +- (const std::vector &)detents; +#endif + +@property (nonatomic, readonly) BOOL isOpen; +@property (nonatomic, readonly) BOOL prefersGrabberVisible; +@property (nonatomic, readonly) CGFloat preferredCornerRadius; +@property (nonatomic, readonly) NSInteger largestUndimmedDetentIndex; +@property (nonatomic, readonly) NSInteger initialDetentIndex; +@property (nonatomic, readonly) BOOL prefersScrollingExpandsWhenScrolledToEdge; + @end NS_ASSUME_NONNULL_END From 6fd75c09f63a46c0fb425bd2253dd07596c80490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Boro=C5=84?= Date: Fri, 22 May 2026 13:58:43 +0200 Subject: [PATCH 18/18] Drop redundant getters --- .../RNSFormSheetHostComponentView.mm | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm index dab5f343b5..a9763f4e0c 100644 --- a/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm +++ b/ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm @@ -91,33 +91,11 @@ - (void)didMoveToWindow #pragma mark - RNSFormSheetPresentationProvider -- (BOOL)isOpen -{ - return _isOpen; -} - - (nullable UIWindow *)hostWindow { return self.window; } -#pragma mark - RNSFormSheetAppearanceProvider - -- (BOOL)prefersGrabberVisible -{ - return _prefersGrabberVisible; -} - -- (CGFloat)preferredCornerRadius -{ - return _preferredCornerRadius; -} - -- (NSInteger)largestUndimmedDetentIndex -{ - return _largestUndimmedDetentIndex; -} - #pragma mark - RNSFormSheetBehaviorProvider - (const std::vector &)detents @@ -125,16 +103,6 @@ - (NSInteger)largestUndimmedDetentIndex return _detents; } -- (NSInteger)initialDetentIndex -{ - return _initialDetentIndex; -} - -- (BOOL)prefersScrollingExpandsWhenScrolledToEdge -{ - return _prefersScrollingExpandsWhenScrolledToEdge; -} - #pragma mark - RNSFormSheetContentControllerDelegate - (void)sheetControllerDidNativeDismiss:(RNSFormSheetContentController *)controller