@sandlada/vue-mdc
Version:

62 lines (61 loc) • 1.89 kB
JavaScript
/**
* @license
* Copyright 2023 Google LLC
* SPDX-License-Identifier: Apache-2.0
*
* @link
* https://github.com/material-components/material-web/blob/main/internal/events/dispatch-hooks.ts
*
*/
const dispatchHooks = Symbol("dispatchHooks");
function afterDispatch(event, callback) {
const hooks = event[dispatchHooks];
if (!hooks) {
throw new Error(`'${event.type}' event needs setupDispatchHooks().`);
}
hooks.addEventListener("after", callback);
}
const ELEMENT_DISPATCH_HOOK_TYPES = /* @__PURE__ */ new WeakMap();
function setupDispatchHooks(element, ...eventTypes) {
let typesAlreadySetUp = ELEMENT_DISPATCH_HOOK_TYPES.get(element);
if (!typesAlreadySetUp) {
typesAlreadySetUp = /* @__PURE__ */ new Set();
ELEMENT_DISPATCH_HOOK_TYPES.set(element, typesAlreadySetUp);
}
for (const eventType of eventTypes) {
if (typesAlreadySetUp.has(eventType)) {
continue;
}
let isRedispatching = false;
element.addEventListener(eventType, (event) => {
if (isRedispatching) {
return;
}
event.stopImmediatePropagation();
const eventCopy = Reflect.construct(event.constructor, [
event.type,
event
]);
const hooks = new EventTarget();
eventCopy[dispatchHooks] = hooks;
isRedispatching = true;
const dispatched = element.dispatchEvent(eventCopy);
isRedispatching = false;
if (!dispatched) {
event.preventDefault();
}
hooks.dispatchEvent(new Event("after"));
}, {
// Ensure this listener runs before other listeners.
// `setupDispatchHooks()` should be called in constructors to also
// ensure they run before any other externally-added capture listeners.
capture: true
});
typesAlreadySetUp.add(eventType);
}
}
export {
afterDispatch,
setupDispatchHooks
};
//# sourceMappingURL=dispatch-hooks.js.map