From 646bb372abed75d1e59c38000017873e2ad69729 Mon Sep 17 00:00:00 2001 From: Min Idzelis Date: Mon, 26 Jan 2026 10:34:26 -0500 Subject: [PATCH] feat: add onMany to BaseEventManager (#25492) Use a map of events instead of array of tuples for better ergonomics. --- web/src/lib/managers/upload-manager.svelte.ts | 6 ++++-- web/src/lib/stores/memory.store.svelte.ts | 6 ++++-- web/src/lib/stores/notification-manager.svelte.ts | 6 ++++-- web/src/lib/utils/base-event-manager.svelte.ts | 11 +++++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/web/src/lib/managers/upload-manager.svelte.ts b/web/src/lib/managers/upload-manager.svelte.ts index 1b5b73ecd9..031c43b8c4 100644 --- a/web/src/lib/managers/upload-manager.svelte.ts +++ b/web/src/lib/managers/upload-manager.svelte.ts @@ -6,8 +6,10 @@ class UploadManager { mediaTypes = $state({ image: [], sidecar: [], video: [] }); constructor() { - eventManager.on('AppInit', () => this.#loadExtensions()); - eventManager.on('AuthLogout', () => this.reset()); + eventManager.onMany({ + AppInit: () => this.#loadExtensions(), + AuthLogout: () => this.reset(), + }); } reset() { diff --git a/web/src/lib/stores/memory.store.svelte.ts b/web/src/lib/stores/memory.store.svelte.ts index 623de24598..f9bd15df2e 100644 --- a/web/src/lib/stores/memory.store.svelte.ts +++ b/web/src/lib/stores/memory.store.svelte.ts @@ -23,8 +23,10 @@ class MemoryStoreSvelte { #loading: Promise | undefined; constructor() { - eventManager.on('AuthLogout', () => this.clearCache()); - eventManager.on('AuthUserLoaded', () => this.initialize()); + eventManager.onMany({ + AuthLogout: () => this.clearCache(), + AuthUserLoaded: () => this.initialize(), + }); } ready() { diff --git a/web/src/lib/stores/notification-manager.svelte.ts b/web/src/lib/stores/notification-manager.svelte.ts index 03b160b989..9dc35a4ea6 100644 --- a/web/src/lib/stores/notification-manager.svelte.ts +++ b/web/src/lib/stores/notification-manager.svelte.ts @@ -8,8 +8,10 @@ class NotificationStore { notifications = $state([]); constructor() { - eventManager.on('AuthLogin', () => this.refresh()); - eventManager.on('AuthLogout', () => this.clear()); + eventManager.onMany({ + AuthLogin: () => this.refresh(), + AuthLogout: () => this.clear(), + }); } async refresh() { diff --git a/web/src/lib/utils/base-event-manager.svelte.ts b/web/src/lib/utils/base-event-manager.svelte.ts index 50fa29b776..89a5c7390e 100644 --- a/web/src/lib/utils/base-event-manager.svelte.ts +++ b/web/src/lib/utils/base-event-manager.svelte.ts @@ -30,6 +30,17 @@ export class BaseEventManager { }; } + onMany(subscriptions: { [T in keyof Events]?: EventCallback }) { + const cleanups = Object.entries(subscriptions).map(([event, callback]) => + this.on(event as keyof Events, callback as EventCallback), + ); + return () => { + for (const cleanup of cleanups) { + cleanup(); + } + }; + } + emit(event: T, ...params: Events[T]) { const listeners = this.getListeners(event); for (const listener of listeners) {