|
11 | 11 | #import "RCTModalManager.h"
|
12 | 12 | #import "RCTModalHostViewManager.h"
|
13 | 13 |
|
14 |
| -@interface RCTModalHostViewImprovedManager () <RCTModalHostViewInteractorImproved> |
| 14 | +@interface RCTModalHostViewImprovedManager () <RCTModalHostViewImprovedInteractor> |
15 | 15 |
|
16 | 16 | @end
|
17 | 17 |
|
@@ -47,32 +47,81 @@ - (void)presentModalHostView:(RCTModalHostViewImproved *)modalHostView
|
47 | 47 | if (self.presentationBlock) {
|
48 | 48 | self.presentationBlock([modalHostView reactViewController], viewController, animated, completionBlock);
|
49 | 49 | } else {
|
50 |
| - [[modalHostView reactViewController] presentViewController:viewController |
| 50 | + /* |
| 51 | + [[modalHostView reactViewController] presentViewController:viewController |
51 | 52 | animated:animated
|
52 | 53 | 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]; |
53 | 75 | }
|
54 | 76 | });
|
55 | 77 | }
|
56 | 78 |
|
57 |
| -- (void)dismissModalHostView:(RCTModalHostViewImproved *)modalHostView |
| 79 | +- (void)dismissModalHostViewWithCompletion:(RCTModalHostViewImproved *)modalHostView |
58 | 80 | withViewController:(RCTModalHostViewControllerImproved *)viewController
|
59 | 81 | animated:(BOOL)animated
|
| 82 | + completion:(void (^)(void))completion |
60 | 83 | {
|
61 | 84 | dispatch_block_t completionBlock = ^{
|
62 | 85 | if (modalHostView.identifier) {
|
63 | 86 | [[self.bridge moduleForClass:[RCTModalManager class]] modalDismissed:modalHostView.identifier];
|
64 | 87 | }
|
65 | 88 | };
|
66 | 89 |
|
| 90 | + if (completion) { |
| 91 | + completion(); |
| 92 | + } |
| 93 | + modalHostView.modalWindow = nil; |
| 94 | + |
67 | 95 | dispatch_async(dispatch_get_main_queue(), ^{
|
68 | 96 | if (self.dismissalBlock) {
|
69 | 97 | self.dismissalBlock([modalHostView reactViewController], viewController, animated, completionBlock);
|
70 | 98 | } 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 | + } |
72 | 114 | }
|
73 | 115 | });
|
74 | 116 | }
|
75 | 117 |
|
| 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 | + |
76 | 125 | - (void)invalidate
|
77 | 126 | {
|
78 | 127 | for (RCTModalHostView *hostView in _hostViews) {
|
|
0 commit comments