Files
v10/dist/dev/dom/ui/dismiss-layer.js

63 lines
1.7 KiB
JavaScript

import { listen } from "@videojs/utils/dom";
//#region src/dom/ui/dismiss-layer.ts
function createDismissLayer(options) {
const { transition } = options;
const state = transition.state;
const abort = new AbortController();
let docAbort = null;
function open() {
if (abort.signal.aborted) return null;
const { active, status } = state.current;
if (active && status !== "ending") return null;
if (status === "ending") transition.cancel();
return transition.open();
}
function close(element) {
const { active, status } = state.current;
if (abort.signal.aborted || !active || status === "ending") return null;
return transition.close(element);
}
function setupDocumentListeners() {
cleanupDocumentListeners();
if (typeof document === "undefined") return;
docAbort = new AbortController();
const { signal } = docAbort;
listen(document, "keydown", handleKeydown, { signal });
options.onDocumentActive?.(signal);
}
function cleanupDocumentListeners() {
docAbort?.abort();
docAbort = null;
}
function handleKeydown(event) {
if (event.key !== "Escape") return;
if (event.defaultPrevented) return;
if (!state.current.active) return;
if (!(options.closeOnEscape?.() ?? true)) return;
options.onEscapeDismiss(event);
}
const unsubscribe = state.subscribe(() => {
if (state.current.active) setupDocumentListeners();
else cleanupDocumentListeners();
});
abort.signal.addEventListener("abort", () => {
unsubscribe();
transition.destroy();
cleanupDocumentListeners();
});
function destroy() {
if (abort.signal.aborted) return;
abort.abort();
}
return {
input: state,
open,
close,
signal: abort.signal,
destroy
};
}
//#endregion
export { createDismissLayer };
//# sourceMappingURL=dismiss-layer.js.map