Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 0 additions & 22 deletions ios/gamma/modals/form-sheet/RNSFormSheetAppearanceApplicator.h

This file was deleted.

19 changes: 0 additions & 19 deletions ios/gamma/modals/form-sheet/RNSFormSheetAppearanceCoordinator.h

This file was deleted.

37 changes: 0 additions & 37 deletions ios/gamma/modals/form-sheet/RNSFormSheetAppearanceCoordinator.mm

This file was deleted.

11 changes: 0 additions & 11 deletions ios/gamma/modals/form-sheet/RNSFormSheetAppearanceUpdateFlags.h

This file was deleted.

22 changes: 22 additions & 0 deletions ios/gamma/modals/form-sheet/RNSFormSheetConfigurationApplicator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#import <Foundation/Foundation.h>
#import "RNSFormSheetProviders.h"

@class RNSFormSheetUpdateCoordinator;
@class RNSFormSheetContentController;

NS_ASSUME_NONNULL_BEGIN

@interface RNSFormSheetConfigurationApplicator : NSObject

- (void)applyConfigurationIfNeededWithAppearanceProvider:(id<RNSFormSheetAppearanceProvider>)appearanceProvider
behaviorProvider:(id<RNSFormSheetBehaviorProvider>)behaviorProvider
controller:(RNSFormSheetContentController *)controller
coordinator:(RNSFormSheetUpdateCoordinator *)coordinator;

- (void)resetInitialDetent;

@end

NS_ASSUME_NONNULL_END
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
#import "RNSFormSheetAppearanceApplicator.h"
#import "RNSFormSheetConfigurationApplicator.h"

#import <React/RCTAssert.h>

#import "RNSFormSheetAppearanceCoordinator.h"
#import "RNSFormSheetAppearanceUpdateFlags.h"
#import "RNSFormSheetContentController.h"
#import "RNSFormSheetDetentResolver.h"
#import "RNSFormSheetUpdateCoordinator.h"
#import "RNSFormSheetUpdateFlags.h"

@implementation RNSFormSheetAppearanceApplicator {
@implementation RNSFormSheetConfigurationApplicator {
BOOL _initialDetentApplied;
}

Expand All @@ -24,31 +24,35 @@ - (void)resetInitialDetent
_initialDetentApplied = NO;
}

- (void)updateAppearanceIfNeededWithAppearanceProvider:(id<RNSFormSheetAppearanceProvider>)appearanceProvider
behaviorProvider:(id<RNSFormSheetBehaviorProvider>)behaviorProvider
controller:(RNSFormSheetContentController *)controller
coordinator:(RNSFormSheetAppearanceCoordinator *)coordinator
- (void)applyConfigurationIfNeededWithAppearanceProvider:(id<RNSFormSheetAppearanceProvider>)appearanceProvider
behaviorProvider:(id<RNSFormSheetBehaviorProvider>)behaviorProvider
controller:(RNSFormSheetContentController *)controller
coordinator:(RNSFormSheetUpdateCoordinator *)coordinator
{
[coordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration
performOperations:^{
[self updateSheetConfigurationForAppearanceProvider:appearanceProvider
behaviorProvider:behaviorProvider
controller:controller];
}];
RNSFormSheetUpdateFlags configFlags = RNSFormSheetUpdateFlagsAppearance | RNSFormSheetUpdateFlagsBehavior;

[coordinator updateIfAnyNeeded:configFlags
performOperations:^{
[self applyConfigurationWithAppearanceProvider:appearanceProvider
behaviorProvider:behaviorProvider
controller:controller];
}];
}

#pragma mark - Updaters

- (void)updateSheetConfigurationForAppearanceProvider:(id<RNSFormSheetAppearanceProvider>)appearanceProvider
behaviorProvider:(id<RNSFormSheetBehaviorProvider>)behaviorProvider
controller:(RNSFormSheetContentController *)controller
- (void)applyConfigurationWithAppearanceProvider:(id<RNSFormSheetAppearanceProvider>)appearanceProvider
behaviorProvider:(id<RNSFormSheetBehaviorProvider>)behaviorProvider
controller:(RNSFormSheetContentController *)controller
Comment on lines +44 to +46

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess that in the future we can split this to appearance and behavior (but still do it in one animateChanges block) but for now, there is just no need to do so, right?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup it makes sense, and we might consider that as a follow-up: https://github.com/software-mansion/react-native-screens-labs/issues/1501

{
#if !TARGET_OS_TV
UISheetPresentationController *sheet = controller.sheetPresentationController;
RCTAssert(
sheet != nil,
@"[RNScreens] sheetPresentationController is nil. Ensure modalPresentationStyle is set to UIModalPresentationFormSheet.");

// Behavior data

NSArray<UISheetPresentationControllerDetent *> *nativeDetents =
[RNSFormSheetDetentResolver buildSheetDetentsForFractions:behaviorProvider.detents];

Expand All @@ -60,26 +64,30 @@ - (void)updateSheetConfigurationForAppearanceProvider:(id<RNSFormSheetAppearance
_initialDetentApplied = YES;
}

UISheetPresentationControllerDetentIdentifier largestUndimmedDetentIdentifier = [RNSFormSheetDetentResolver
largestUndimmedDetentIdentifierForDetents:nativeDetents
atRequestedIndex:appearanceProvider.largestUndimmedDetentIndex];
BOOL prefersScrollingExpands = behaviorProvider.prefersScrollingExpandsWhenScrolledToEdge;

// Appearance data

BOOL prefersGrabberVisible = appearanceProvider.prefersGrabberVisible;
CGFloat preferredCornerRadius = appearanceProvider.preferredCornerRadius;
BOOL prefersScrollingExpandsWhenScrolledToEdge = behaviorProvider.prefersScrollingExpandsWhenScrolledToEdge;

UISheetPresentationControllerDetentIdentifier largestUndimmedDetentIdentifier = [RNSFormSheetDetentResolver
largestUndimmedDetentIdentifierForDetents:nativeDetents
atRequestedIndex:appearanceProvider.largestUndimmedDetentIndex];

// Sheet updates
[sheet animateChanges:^{
// Behavior updates
sheet.detents = nativeDetents;
sheet.prefersScrollingExpandsWhenScrolledToEdge = prefersScrollingExpands;
if (initialDetentIdentifier != nil) {
sheet.selectedDetentIdentifier = initialDetentIdentifier;
}
// Appearance updates
sheet.prefersGrabberVisible = prefersGrabberVisible;
sheet.preferredCornerRadius =
preferredCornerRadius < 0 ? UISheetPresentationControllerAutomaticDimension : preferredCornerRadius;
sheet.largestUndimmedDetentIdentifier = largestUndimmedDetentIdentifier;

if (initialDetentIdentifier != nil) {
sheet.selectedDetentIdentifier = initialDetentIdentifier;
}

sheet.prefersScrollingExpandsWhenScrolledToEdge = prefersScrollingExpandsWhenScrolledToEdge;
}];
#endif // !TARGET_OS_TV
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Signals

- (void)setNeedsPresentationUpdate;
- (void)setNeedsBehaviorUpdate;
- (void)setNeedsAppearanceUpdate;
- (void)setNeedsInitialDetentReset;

Expand Down
57 changes: 32 additions & 25 deletions ios/gamma/modals/form-sheet/RNSFormSheetContentController.mm
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#import "RNSFormSheetContentController.h"
#import "RNSFormSheetAppearanceApplicator.h"
#import "RNSFormSheetAppearanceCoordinator.h"
#import "RNSFormSheetAppearanceUpdateFlags.h"
#import "RNSFormSheetConfigurationApplicator.h"
#import "RNSFormSheetContentView.h"
#import "RNSFormSheetUpdateCoordinator.h"
#import "RNSFormSheetUpdateFlags.h"
#import "RNSPresentationSourceProvider.h"

#import <React/RCTAssert.h>
Expand All @@ -17,8 +17,8 @@ @interface RNSFormSheetContentController () <UIAdaptivePresentationControllerDel
@end

@implementation RNSFormSheetContentController {
RNSFormSheetAppearanceCoordinator *_Nonnull _appearanceCoordinator;
RNSFormSheetAppearanceApplicator *_Nonnull _appearanceApplicator;
RNSFormSheetUpdateCoordinator *_Nonnull _updateCoordinator;
RNSFormSheetConfigurationApplicator *_Nonnull _configurationApplicator;

BOOL _needsInitialDetentReset;
}
Expand All @@ -28,8 +28,8 @@ - (instancetype)init
if (self = [super init]) {
self.modalPresentationStyle = UIModalPresentationFormSheet;

_appearanceCoordinator = [RNSFormSheetAppearanceCoordinator new];
_appearanceApplicator = [RNSFormSheetAppearanceApplicator new];
_updateCoordinator = [RNSFormSheetUpdateCoordinator new];
_configurationApplicator = [RNSFormSheetConfigurationApplicator new];

_needsInitialDetentReset = NO;
}
Expand Down Expand Up @@ -59,6 +59,14 @@ - (void)viewDidLayoutSubviews

#pragma mark - Presentation

- (void)updatePresentationIfNeeded
{
[_updateCoordinator updateIfNeeded:RNSFormSheetUpdateFlagsPresentation
performOperations:^{
[self updatePresentationState];
}];
}

- (void)updatePresentationState
{
id<RNSFormSheetPresentationProvider> presentationProvider = self.presentationProvider;
Expand Down Expand Up @@ -122,48 +130,46 @@ - (void)dismissIfNeeded
[self dismissViewControllerAnimated:YES completion:nil];
}

#pragma mark - Appearance
#pragma mark - Sheet Configuration

- (void)updateAppearanceIfNeeded
- (void)updateConfigurationIfNeeded
{
id<RNSFormSheetAppearanceProvider> appearanceProvider = self.appearanceProvider;
id<RNSFormSheetBehaviorProvider> 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.");
RCTAssert(behaviorProvider != nil, @"[RNScreens] Behavior provider must be set before updating behavior.");

Comment thread
t0maboro marked this conversation as resolved.
if (appearanceProvider == nil || behaviorProvider == nil) {
return;
}

if (_needsInitialDetentReset) {
_needsInitialDetentReset = NO;
[_appearanceApplicator resetInitialDetent];
[_configurationApplicator resetInitialDetent];
}

[_appearanceApplicator updateAppearanceIfNeededWithAppearanceProvider:appearanceProvider
behaviorProvider:behaviorProvider
controller:self
coordinator:_appearanceCoordinator];

// TODO: @t0maboro - decouple presentation logic from AppearanceCoordinator
[_appearanceCoordinator updateIfNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation
performOperations:^{
[self updatePresentationState];
}];
[_configurationApplicator applyConfigurationIfNeededWithAppearanceProvider:appearanceProvider
behaviorProvider:behaviorProvider
controller:self
coordinator:_updateCoordinator];
}

#pragma mark - Signals

- (void)setNeedsPresentationUpdate
{
[_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsPresentation];
[_updateCoordinator setNeeds:RNSFormSheetUpdateFlagsPresentation];
}

- (void)setNeedsAppearanceUpdate
{
[_appearanceCoordinator setNeeds:RNSFormSheetAppearanceUpdateFlagsConfiguration];
[_updateCoordinator setNeeds:RNSFormSheetUpdateFlagsAppearance];
}

- (void)setNeedsBehaviorUpdate
{
[_updateCoordinator setNeeds:RNSFormSheetUpdateFlagsBehavior];
}

- (void)setNeedsInitialDetentReset
Expand All @@ -175,7 +181,8 @@ - (void)setNeedsInitialDetentReset

- (void)flushPendingUpdates
{
[self updateAppearanceIfNeeded];
[self updateConfigurationIfNeeded];
[self updatePresentationIfNeeded];
}

#pragma mark - UIAdaptivePresentationControllerDelegate
Expand Down
17 changes: 9 additions & 8 deletions ios/gamma/modals/form-sheet/RNSFormSheetHostComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props
// ALWAYS refresh the sheet configuration when reopening,
// because UIKit destroys the presentationController after the modal is dismissed.
[_controller setNeedsAppearanceUpdate];
[_controller setNeedsBehaviorUpdate];
// Reset the initial-detent applied flag when reopening so the
// configured initialDetentIndex can be applied again.
[_controller setNeedsInitialDetentReset];
Expand All @@ -185,7 +186,14 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props

if (oldComponentProps.detents != newComponentProps.detents) {
_detents = newComponentProps.detents;
[_controller setNeedsAppearanceUpdate];
[_controller setNeedsBehaviorUpdate];
}

if (oldComponentProps.prefersScrollingExpandsWhenScrolledToEdge !=
newComponentProps.prefersScrollingExpandsWhenScrolledToEdge) {
_prefersScrollingExpandsWhenScrolledToEdge =
static_cast<BOOL>(newComponentProps.prefersScrollingExpandsWhenScrolledToEdge);
[_controller setNeedsBehaviorUpdate];
}

if (oldComponentProps.prefersGrabberVisible != newComponentProps.prefersGrabberVisible) {
Expand All @@ -207,13 +215,6 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props
_initialDetentIndex = newComponentProps.initialDetentIndex;
}

if (oldComponentProps.prefersScrollingExpandsWhenScrolledToEdge !=
newComponentProps.prefersScrollingExpandsWhenScrolledToEdge) {
_prefersScrollingExpandsWhenScrolledToEdge =
static_cast<BOOL>(newComponentProps.prefersScrollingExpandsWhenScrolledToEdge);
[_controller setNeedsAppearanceUpdate];
}

[super updateProps:props oldProps:oldProps];
}

Expand Down
Loading
Loading