Skip to content

Commit

Permalink
fix(menu): wait until all menus are ready
Browse files Browse the repository at this point in the history
fixes #15727
  • Loading branch information
manucorporat committed Oct 1, 2018
1 parent e916500 commit a5c2cc1
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 8 deletions.
25 changes: 19 additions & 6 deletions core/src/components/menu-controller/menu-controller.ts
Expand Up @@ -16,6 +16,7 @@ export class MenuController implements MenuControllerI {
private menuAnimations = new Map<string, AnimationBuilder>();

@Prop({ connect: 'ion-animation-controller' }) animationCtrl!: HTMLIonAnimationControllerElement;
@Prop({ context: 'document' }) doc!: Document;

constructor() {
this.registerAnimation('reveal', menuRevealAnimation);
Expand Down Expand Up @@ -134,6 +135,8 @@ export class MenuController implements MenuControllerI {
return undefined;
}
}
await this.waitUntilReady();

if (menuId === 'start' || menuId === 'end') {
// there could be more than one menu on the same side
// so first try to get the enabled one
Expand Down Expand Up @@ -166,24 +169,27 @@ export class MenuController implements MenuControllerI {
* Returns the instance of the menu already opened, otherwise `null`.
*/
@Method()
getOpen(): Promise<HTMLIonMenuElement | undefined> {
return Promise.resolve(this.getOpenSync());
async getOpen(): Promise<HTMLIonMenuElement | undefined> {
await this.waitUntilReady();
return this.getOpenSync();
}

/**
* Returns an array of all menu instances.
*/
@Method()
getMenus(): Promise<HTMLIonMenuElement[]> {
return Promise.resolve(this.getMenusSync());
async getMenus(): Promise<HTMLIonMenuElement[]> {
await this.waitUntilReady();
return this.getMenusSync();
}

/**
* Returns true if any menu is currently animating.
*/
@Method()
isAnimating(): Promise<boolean> {
return Promise.resolve(this.isAnimatingSync());
async isAnimating(): Promise<boolean> {
await this.waitUntilReady();
return this.isAnimatingSync();
}

@Method()
Expand Down Expand Up @@ -264,4 +270,11 @@ export class MenuController implements MenuControllerI {
}
return undefined;
}

private waitUntilReady() {
return Promise.all(
Array.from(this.doc.querySelectorAll('ion-menu'))
.map(menu => menu.componentOnReady())
);
}
}
2 changes: 1 addition & 1 deletion core/src/components/menu/menu-interface.ts
Expand Up @@ -31,7 +31,7 @@ export interface MenuControllerI {
_unregister(menu: MenuI): void;
_setActiveMenu(menu: MenuI): void;

getMenusSync(): HTMLIonMenuElement[];
getMenus(): Promise<HTMLIonMenuElement[]>;
getOpenSync(): HTMLIonMenuElement | undefined;
}

Expand Down
2 changes: 1 addition & 1 deletion core/src/components/menu/menu.tsx
Expand Up @@ -168,7 +168,7 @@ export class Menu implements ComponentInterface, MenuI {

let isEnabled = !this.disabled;
if (isEnabled) {
const menus = this.menuCtrl!.getMenusSync();
const menus = await this.menuCtrl!.getMenus();
isEnabled = !menus.some((m: any) => {
return m.side === this.side && !m.disabled;
});
Expand Down

0 comments on commit a5c2cc1

Please sign in to comment.