import { BackButtonEvent } from '../interface'; type Handler = () => Promise | 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); } }