UNPKG

@sandlada/vue-mdc

Version:

![Vue MDC Logo](https://raw.githubusercontent.com/sandlada/vue-mdc/refs/heads/main/docs/vue-mdc-cover.png)

62 lines (61 loc) 1.89 kB
/** * @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