diff --git a/web/src/lib/utils/base-event-manager.svelte.ts b/web/src/lib/utils/base-event-manager.svelte.ts index 511207698..8a17a3402 100644 --- a/web/src/lib/utils/base-event-manager.svelte.ts +++ b/web/src/lib/utils/base-event-manager.svelte.ts @@ -15,7 +15,8 @@ const nextId = () => count++; const noop = () => {}; export class BaseEventManager { - #callbacks: EventItem[] = $state.raw([]); + #callbacks: EventItem[] = []; + #changeCount = $state(0); // make hasListeners reactive while keeping #callbacks plain JS on(subscriptions: EventMap): () => void { const cleanups = Object.entries(subscriptions).map(([event, callback]) => @@ -36,13 +37,19 @@ export class BaseEventManager { // eslint-disable-next-line @typescript-eslint/no-explicit-any const item = { id: nextId(), event, callback } as EventItem; - this.#callbacks = [...this.#callbacks, item]; + this.#callbacks.push(item); + this.markChanged(); return () => { this.#callbacks = this.#callbacks.filter((current) => current.id !== item.id); + this.markChanged(); }; } + private markChanged() { + this.#changeCount++; + } + emit(event: T, ...params: Events[T]) { const listeners = this.getListeners(event); for (const listener of listeners) { @@ -51,6 +58,8 @@ export class BaseEventManager { } hasListeners(event: T) { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + this.#changeCount; return this.#callbacks.some((item) => item.event === event); }