From f1c02f17669800522355c11a4d9ab60cc6f18ee1 Mon Sep 17 00:00:00 2001 From: Mees Frensel <33722705+meesfrensel@users.noreply.github.com> Date: Tue, 13 Oct 2026 15:40:09 +0200 Subject: [PATCH] fix(web): event manager forgetting subscribed callbacks (#32217) * fix(web): event manager forgetting subscribed callbacks * fix: asset viewer manager * fix PR feedback (cherry picked from commit 60c5aa1f252c97d3d40cf21ee7e017072d005b32) --- web/src/lib/utils/base-event-manager.svelte.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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); }