@smui/common
Version:
Svelte Material UI - Common
68 lines • 2.23 kB
JavaScript
import { on } from 'svelte/events';
/**
* A way to keep track of things you've "on"ed so you can "off" them too.
*
* This is needed because Svelte doesn't have an "off" function, it returns
* unlisten functions from its "on" function.
*/
export class SvelteEventManager {
constructor() {
this.elementMap = new Map();
}
/**
* Listen to an event on an element.
*/
on(element, event, handler, options) {
if (!this.elementMap.has(element)) {
this.elementMap.set(element, {});
}
const eventMap = this.elementMap.get(element);
if (eventMap == null) {
throw new Error("Event map couldn't be created.");
}
if (!(event in eventMap)) {
eventMap[event] = new Map();
}
const handlerMap = eventMap[event];
handlerMap.set(handler, on(element, event, handler, options));
}
/**
* Unlisten to an event on an element.
*/
off(element, event, handler) {
const eventMap = this.elementMap.get(element);
if (eventMap == null || !(event in eventMap)) {
console.warn("Attempted to off an event that couldn't be found.", element, event);
return;
}
const handlerMap = eventMap[event];
const unlisten = handlerMap.get(handler);
if (unlisten != null) {
unlisten();
handlerMap.delete(handler);
if (handlerMap.size === 0) {
delete eventMap[event];
if (Object.keys(eventMap).length === 0) {
this.elementMap.delete(element);
}
}
}
else {
console.warn("Attempted to off an event that couldn't be found.", element, event);
}
}
/**
* Unlisten to all events managed by this instance.
*/
clear() {
this.elementMap.forEach((eventMaps, _element) => {
for (let [_event, eventMap] of Object.entries(eventMaps)) {
eventMap.forEach((unlisten, _handler) => {
unlisten();
});
}
});
this.elementMap.clear();
}
}
//# sourceMappingURL=SvelteEventManager.js.map