Skip to content

Commit 9a524e0

Browse files
committed
fix(bottomsheet,ios): allow to show bottomsheet on top of another one
1 parent 359e845 commit 9a524e0

File tree

1 file changed

+41
-16
lines changed

1 file changed

+41
-16
lines changed

src/bottomsheet/bottomsheet.ios.ts

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -350,16 +350,27 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
350350
bottomSheetController: MDCBottomSheetController;
351351
protected _showNativeBottomSheet(parent: View, options: BottomSheetOptions) {
352352
options.context = options.context || {};
353-
const parentWithController = IOSHelper.getParentWithViewController(parent);
354-
if (!parentWithController) {
355-
Trace.write(`Could not find parent with viewController for ${parent} while showing bottom sheet view.`, Trace.categories.ViewHierarchy, Trace.messageType.error);
356-
return;
353+
let rootView = Application.getRootView();
354+
if (rootView.parent) {
355+
rootView = rootView.parent as any;
357356
}
358-
359-
const parentController = parentWithController.viewController;
360-
if (parentController.presentedViewController) {
361-
Trace.write('Parent is already presenting view controller. Close the current bottom sheet page before showing another one!', Trace.categories.ViewHierarchy, Trace.messageType.error);
362-
return;
357+
let currentView = parent.page || rootView;
358+
currentView = currentView.modal || currentView;
359+
let parentController = currentView.viewController;
360+
if (!parentController.presentedViewController && rootView.viewController.presentedViewController) {
361+
parentController = rootView.viewController.presentedViewController;
362+
}
363+
while (parentController.presentedViewController) {
364+
while (parentController.presentedViewController instanceof UIAlertController ||
365+
(parentController.presentedViewController['isAlertController'] && parentController.presentedViewController.presentedViewController)) {
366+
parentController = parentController.presentedViewController;
367+
}
368+
if (parentController.presentedViewController instanceof UIAlertController || parentController.presentedViewController['isAlertController']) {
369+
break;
370+
}
371+
else {
372+
parentController = parentController.presentedViewController;
373+
}
363374
}
364375

365376
if (!parentController.view || !parentController.view.window) {
@@ -370,7 +381,7 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
370381
this.parent = Application.getRootView();
371382
this._setupAsRootView({});
372383

373-
this._commonShowNativeBottomSheet(parentWithController, options);
384+
this._commonShowNativeBottomSheet(currentView, options);
374385
let controller: IMDLayoutViewController = this.viewController;
375386
if (!controller) {
376387
const nativeView = this.ios || this.nativeViewProtected;
@@ -462,13 +473,27 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
462473
whenClosedCallback?.();
463474
return;
464475
}
465-
const parentWithController = IOSHelper.getParentWithViewController(parent);
466-
if (!parent || !parentWithController) {
467-
Trace.error('Trying to hide bottom-sheet view but no parent with viewController specified.');
468-
return;
476+
let rootView = Application.getRootView();
477+
if (rootView.parent) {
478+
rootView = rootView.parent as any;
479+
}
480+
let currentView = parent.modal || parent;
481+
let parentController = currentView.viewController;
482+
if (!parentController.presentedViewController && rootView.viewController.presentedViewController) {
483+
parentController = rootView.viewController.presentedViewController;
484+
}
485+
while (parentController.presentedViewController) {
486+
while (parentController.presentedViewController instanceof UIAlertController ||
487+
(parentController.presentedViewController['isAlertController'] && parentController.presentedViewController.presentedViewController)) {
488+
parentController = parentController.presentedViewController;
489+
}
490+
if (parentController.presentedViewController instanceof UIAlertController || parentController.presentedViewController['isAlertController']) {
491+
break;
492+
}
493+
else {
494+
parentController = parentController.presentedViewController;
495+
}
469496
}
470-
471-
const parentController = parentWithController.viewController;
472497
const animated = this.viewController.nsAnimated;
473498
parentController.dismissViewControllerAnimatedCompletion(animated, whenClosedCallback);
474499
}

0 commit comments

Comments
 (0)