Files
ionic-framework/core/src/utils/hardware-back-button.ts
2018-09-14 18:47:00 +02:00

56 lines
1.2 KiB
TypeScript

import { BackButtonEvent } from '../interface';
type Handler = () => Promise<any> | void | null;
interface HandlerRegister {
priority: number;
handler: Handler;
}
export function startHardwareBackButton(win: Window) {
let busy = false;
win.document.addEventListener('backbutton', () => {
if (busy) {
return;
}
const handlers: HandlerRegister[] = [];
const ev: BackButtonEvent = new CustomEvent('ionBackButton', {
bubbles: false,
detail: {
register(priority: number, handler: Handler) {
handlers.push({ priority, handler });
}
}
});
win.document.dispatchEvent(ev);
if (handlers.length > 0) {
let selectedPriority = Number.MIN_SAFE_INTEGER;
let handler: Handler | undefined;
handlers.forEach(h => {
if (h.priority >= selectedPriority) {
selectedPriority = h.priority;
handler = h.handler;
}
});
busy = true;
executeAction(handler).then(() => busy = false);
}
});
}
async function executeAction(handler: Handler | undefined) {
try {
if (handler) {
const result = handler();
if (result != null) {
await result;
}
}
} catch (e) {
console.error(e);
}
}