mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-18 03:00:58 +08:00
56 lines
1.2 KiB
TypeScript
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);
|
|
}
|
|
}
|