diff --git a/core/src/components/router/readme.md b/core/src/components/router/readme.md index e84892ac255..f6980b04fa5 100644 --- a/core/src/components/router/readme.md +++ b/core/src/components/router/readme.md @@ -38,6 +38,7 @@ If you're using Angular, please see [ion-router-outlet](../router-outlet) instea | Method | Description | | ------------ | ----------------------------- | +| `goBack` | | | `navChanged` | | | `printDebug` | | | `push` | Navigate to the specified URL | diff --git a/core/src/interface.d.ts b/core/src/interface.d.ts index 679fb8e456b..447e7270f18 100644 --- a/core/src/interface.d.ts +++ b/core/src/interface.d.ts @@ -41,7 +41,7 @@ export type ComponentRef = Function | HTMLElement | string; export type ComponentProps = T extends ComponentTags ? StencilIntrinsicElements[T] : {[key: string]: any}; export type CssClassMap = { [className: string]: boolean }; export type BackButtonEvent = CustomEvent<{ - register(priority: number, handler: () => Promise | void): void; + register(priority: number, handler: () => Promise | void): void; }> declare global { diff --git a/core/src/utils/hardware-back-button.ts b/core/src/utils/hardware-back-button.ts index 53ad518ac19..beec2dfb91d 100644 --- a/core/src/utils/hardware-back-button.ts +++ b/core/src/utils/hardware-back-button.ts @@ -1,6 +1,6 @@ import { BackButtonEvent } from '../interface'; -type Handler = () => Promise | void; +type Handler = () => Promise | void; interface HandlerRegister { priority: number; diff --git a/core/src/utils/overlays.ts b/core/src/utils/overlays.ts index a49b3fc7000..22b514f4401 100644 --- a/core/src/utils/overlays.ts +++ b/core/src/utils/overlays.ts @@ -1,4 +1,4 @@ -import { AnimationBuilder, HTMLIonOverlayElement, IonicConfig, OverlayInterface } from '../interface'; +import { AnimationBuilder, HTMLIonOverlayElement, IonicConfig, OverlayInterface, BackButtonEvent } from '../interface'; let lastId = 0; @@ -19,19 +19,28 @@ export function createOverlay(element: T, opts: // append the overlay element to the document body getAppRoot(doc).appendChild(element); + doc.body.addEventListener('ionBackButton', ev => { + (ev as BackButtonEvent).detail.register(100, () => closeTopOverlay(doc)); + }); + doc.body.addEventListener('keyup', ev => { if (ev.key === 'Escape') { - const lastOverlay = getOverlay(doc); - if (lastOverlay && lastOverlay.backdropDismiss) { - // tslint:disable-next-line:no-floating-promises - lastOverlay.dismiss(null, BACKDROP); - } + // tslint:disable-next-line:no-floating-promises + closeTopOverlay(doc); } }); return element.componentOnReady(); } +function closeTopOverlay(doc: Document) { + const lastOverlay = getOverlay(doc); + if (lastOverlay && lastOverlay.backdropDismiss) { + return lastOverlay.dismiss(null, BACKDROP); + } + return Promise.resolve(); +} + export function connectListeners(doc: Document) { if (lastId === 0) { lastId = 1;