import { EventContainer, EventHandlers } from "@commonmodule/ts";
import DomNode from "../dom/DomNode.js";
export default abstract class View
{
private eventListeners: Map, Map> =
new Map();
protected container!: CT;
public changeData(data: DT): void {}
protected addViewManagedEvent<
T extends EventContainer,
E extends EventHandlers,
K extends keyof E,
>(
target: T,
eventName: K,
listener: (E & { visible: () => void; remove: () => void })[K],
): this {
if (!this.eventListeners.has(target)) {
this.eventListeners.set(target, new Map());
}
const targetListeners = this.eventListeners.get(target)!;
targetListeners.set(eventName as string, listener);
target.on(eventName, listener);
return this;
}
private removeAllEvents(): void {
for (const [target, listeners] of this.eventListeners) {
for (const [eventName, listener] of listeners) {
target.off(eventName, listener);
}
}
this.eventListeners.clear();
}
public close(): void {
this.removeAllEvents();
this.container?.remove();
}
}