UNPKG

@hypothesis/frontend-shared

Version:

Shared components, styles and utilities for Hypothesis projects

67 lines (64 loc) 2.2 kB
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * Return the event type that a listener will receive. * * For example `EventType<HTMLElement, 'keydown'>` evaluates to `KeyboardEvent`. * * The event type is extracted from the target's `on${Type}` property (eg. * `HTMLElement.onkeydown` here) If there is no such property, the type defaults * to `Event`. */ /** * Utility that provides a way to conveniently remove a set of DOM event * listeners when they are no longer needed. */ export class ListenerCollection { constructor() { _defineProperty(this, "_listeners", void 0); this._listeners = new Map(); } /** * Add a listener and return an ID that can be used to remove it later */ add(eventTarget, eventType, listener, options) { eventTarget.addEventListener(eventType, listener, options); const symbol = Symbol(); this._listeners.set(symbol, { eventTarget, eventType, listener, options }); return symbol; } /** * Remove a specific listener. */ remove(listenerId) { const event = this._listeners.get(listenerId); if (event) { const { eventTarget, eventType, listener, options } = event; eventTarget.removeEventListener(eventType, listener, options); this._listeners.delete(listenerId); } } removeAll() { this._listeners.forEach(({ eventTarget, eventType, listener, options }) => { eventTarget.removeEventListener(eventType, listener, options); }); this._listeners.clear(); } } //# sourceMappingURL=listener-collection.js.map