Skip to content
This repository was archived by the owner on Jan 30, 2025. It is now read-only.

Commit 4c60e16

Browse files
authored
apply changes from PR - multiple modal on iOS #31498 (#29)
* remove RCTTextView patch * rename RCTModalHostViewInteractor * implementing pr 31498 diff (modal works) * nested modal example * remove nested modal example
1 parent 5229b2b commit 4c60e16

File tree

5 files changed

+72
-290
lines changed

5 files changed

+72
-290
lines changed

ios/Views/RCTModalHostViewControllerImproved.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@
1010

1111
@interface RCTModalHostViewControllerImproved : RCTModalHostViewController
1212

13+
@property RCTModalHostViewImproved* modalHostView;
14+
1315
@end

ios/Views/RCTModalHostViewImproved.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@
1111

1212
NS_ASSUME_NONNULL_BEGIN
1313

14-
@protocol RCTModalHostViewInteractorImproved;
14+
@protocol RCTModalHostViewImprovedInteractor;
1515

1616
@interface RCTModalHostViewImproved : RCTModalHostView
1717

18-
@property (nonatomic, weak) id<RCTModalHostViewInteractorImproved> delegate;
18+
@property (nonatomic, weak) id<RCTModalHostViewImprovedInteractor> delegate;
1919
@property (nonatomic, strong) UIWindow *modalWindow;
2020

2121
- (void)dismissModalViewControllerWithCompletion:(void (^)(void))completion;
2222

2323
@end
2424

25-
@protocol RCTModalHostViewInteractorImproved <NSObject>
25+
@protocol RCTModalHostViewImprovedInteractor <NSObject>
2626

2727
- (void)presentModalHostView:(RCTModalHostView *)modalHostView
2828
withViewController:(RCTModalHostViewController *)viewController
@@ -32,7 +32,8 @@ NS_ASSUME_NONNULL_BEGIN
3232
animated:(BOOL)animated;
3333
- (void)dismissModalHostViewWithCompletion:(RCTModalHostViewImproved *)modalHostView
3434
withViewController:(RCTModalHostViewController *)viewController
35-
animated:(BOOL)animated completion: (void (^)(void))completion;
35+
animated:(BOOL)animated
36+
completion: (void (^)(void))completion;
3637

3738
@end
3839

ios/Views/RCTModalHostViewImproved.m

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
@implementation RCTModalHostViewImproved {
1919
__weak RCTBridge *_bridge;
2020
BOOL _isPresented;
21-
RCTModalHostViewController *_modalViewController;
21+
RCTModalHostViewControllerImproved *_modalViewController;
2222
RCTTouchHandler *_touchHandler;
2323
UIView *_reactSubview;
2424
UIInterfaceOrientation _lastKnownOrientation;
@@ -31,12 +31,13 @@ @implementation RCTModalHostViewImproved {
3131
- (instancetype)initWithBridge:(RCTBridge *)bridge
3232
{
3333
self = [super initWithBridge:bridge];
34-
_modalViewController = [RCTModalHostViewController new];
34+
_modalViewController = [RCTModalHostViewControllerImproved new];
3535
UIView *containerView = [UIView new];
3636
containerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
3737
_modalViewController.view = containerView;
3838
_touchHandler = [[RCTTouchHandler alloc] initWithBridge:bridge];
3939
_isPresented = NO;
40+
_modalViewController.modalHostView = self;
4041

4142
return self;
4243
}
@@ -101,9 +102,17 @@ - (UIInterfaceOrientationMask)supportedOrientationsMask
101102
}
102103

103104
- (void)dismissModalViewController
105+
{
106+
[self dismissModalViewControllerWithCompletion: nil];
107+
}
108+
109+
- (void)dismissModalViewControllerWithCompletion:(void (^)(void))completion
104110
{
105111
if (_isPresented) {
106-
[self.delegate dismissModalHostView:self withViewController:_modalViewController animated:[self hasAnimationType]];
112+
[self.delegate dismissModalHostViewWithCompletion:self
113+
withViewController:_modalViewController
114+
animated:[self hasAnimationType]
115+
completion: completion];
107116
_isPresented = NO;
108117
}
109118
}

ios/Views/RCTModalHostViewImprovedManager.m

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#import "RCTModalManager.h"
1212
#import "RCTModalHostViewManager.h"
1313

14-
@interface RCTModalHostViewImprovedManager () <RCTModalHostViewInteractorImproved>
14+
@interface RCTModalHostViewImprovedManager () <RCTModalHostViewImprovedInteractor>
1515

1616
@end
1717

@@ -47,32 +47,81 @@ - (void)presentModalHostView:(RCTModalHostViewImproved *)modalHostView
4747
if (self.presentationBlock) {
4848
self.presentationBlock([modalHostView reactViewController], viewController, animated, completionBlock);
4949
} else {
50-
[[modalHostView reactViewController] presentViewController:viewController
50+
/*
51+
[[modalHostView reactViewController] presentViewController:viewController
5152
animated:animated
5253
completion:completionBlock];
54+
*/
55+
UIViewController* presentingViewController;
56+
// pageSheet and formSheet presentation style animate the presented view so we need to use the last presented view controller
57+
// For other presentation styles we use the new window
58+
if (modalHostView.presentationStyle == UIModalPresentationPageSheet || modalHostView.presentationStyle == UIModalPresentationFormSheet) {
59+
UIViewController *lastPresentedViewController = RCTKeyWindow().rootViewController;
60+
UIViewController *presentedViewController = nil;
61+
while (lastPresentedViewController != nil) {
62+
presentedViewController = lastPresentedViewController;
63+
lastPresentedViewController = lastPresentedViewController.presentedViewController;
64+
}
65+
presentingViewController = presentedViewController;
66+
} else {
67+
modalHostView.modalWindow = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
68+
modalHostView.modalWindow.windowLevel = UIWindowLevelAlert;
69+
UIViewController *newViewController = [[UIViewController alloc] init];
70+
modalHostView.modalWindow.rootViewController = newViewController;
71+
[modalHostView.modalWindow makeKeyAndVisible];
72+
presentingViewController = newViewController;
73+
}
74+
[presentingViewController presentViewController:viewController animated:animated completion:completionBlock];
5375
}
5476
});
5577
}
5678

57-
- (void)dismissModalHostView:(RCTModalHostViewImproved *)modalHostView
79+
- (void)dismissModalHostViewWithCompletion:(RCTModalHostViewImproved *)modalHostView
5880
withViewController:(RCTModalHostViewControllerImproved *)viewController
5981
animated:(BOOL)animated
82+
completion:(void (^)(void))completion
6083
{
6184
dispatch_block_t completionBlock = ^{
6285
if (modalHostView.identifier) {
6386
[[self.bridge moduleForClass:[RCTModalManager class]] modalDismissed:modalHostView.identifier];
6487
}
6588
};
6689

90+
if (completion) {
91+
completion();
92+
}
93+
modalHostView.modalWindow = nil;
94+
6795
dispatch_async(dispatch_get_main_queue(), ^{
6896
if (self.dismissalBlock) {
6997
self.dismissalBlock([modalHostView reactViewController], viewController, animated, completionBlock);
7098
} else {
71-
[viewController.presentingViewController dismissViewControllerAnimated:animated completion:completionBlock];
99+
/*
100+
[viewController.presentingViewController dismissViewControllerAnimated:animated completion:completionBlock];
101+
*/
102+
// Will be true for pageSheet and formSheet presentation styles
103+
// We dismiss the nested modal and then dismiss the current modal
104+
if (viewController.presentedViewController != nil && [viewController.presentedViewController isKindOfClass:[RCTModalHostViewController class]]) {
105+
RCTModalHostViewControllerImproved* presentedModalViewController = (RCTModalHostViewControllerImproved *)viewController.presentedViewController;
106+
dispatch_block_t childModalCompletionBlock = ^{
107+
[viewController.presentingViewController dismissViewControllerAnimated:animated completion:completionBlock];
108+
};
109+
110+
[presentedModalViewController.modalHostView dismissModalViewControllerWithCompletion: childModalCompletionBlock];
111+
} else {
112+
[viewController.presentingViewController dismissViewControllerAnimated:animated completion:completionBlock];
113+
}
72114
}
73115
});
74116
}
75117

118+
- (void)dismissModalHostView:(RCTModalHostViewImproved *)modalHostView
119+
withViewController:(RCTModalHostViewControllerImproved *)viewController
120+
animated:(BOOL)animated
121+
{
122+
[self dismissModalHostViewWithCompletion:modalHostView withViewController:viewController animated:animated completion:nil];
123+
}
124+
76125
- (void)invalidate
77126
{
78127
for (RCTModalHostView *hostView in _hostViews) {

0 commit comments

Comments
 (0)