From 2ee04860fb7cdd09801dc96bf2bc561c4de00d9b Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:52:46 +0900 Subject: enhance(frontend): preferenceのタブ間同期にBroadcast Channelを使用するように (#16819) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(frontend): preferenceのタブ間同期にBroadcast Channelを使用するように * fix * refactor: EventEmitterをextendする形に変更 --- packages/frontend/src/preferences/manager.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'packages/frontend/src/preferences') diff --git a/packages/frontend/src/preferences/manager.ts b/packages/frontend/src/preferences/manager.ts index b6d3d55a5f..5949ee71eb 100644 --- a/packages/frontend/src/preferences/manager.ts +++ b/packages/frontend/src/preferences/manager.ts @@ -4,6 +4,7 @@ */ import { computed, onUnmounted, ref, watch } from 'vue'; +import { EventEmitter } from 'eventemitter3'; import { host, version } from '@@/js/config.js'; import { PREF_DEF } from './def.js'; import type { Ref, WritableComputedRef } from 'vue'; @@ -100,6 +101,14 @@ type PreferencesDefinitionRecord export type PreferencesDefinition = Record>; +type PreferencesManagerEvents = { + 'committed': (ctx: { + key: K; + value: ValueOf; + oldValue: ValueOf; + }) => void; +}; + export function definePreferences>(x: { [K in keyof T]: PreferencesDefinitionRecord }): { @@ -180,7 +189,7 @@ function normalizePreferences(preferences: PossiblyNonNormalizedPreferencesProfi // TODO: PreferencesManagerForGuest のような非ログイン専用のクラスを分離すればthis.currentAccountのnullチェックやaccountがnullであるスコープのレコード挿入などが不要になり綺麗になるかもしれない // と思ったけど操作アカウントが存在しない場合も考慮する現在の設計の方が汎用的かつ堅牢かもしれない // NOTE: accountDependentな設定は初期状態であってもアカウントごとのスコープでレコードを作成しておかないと、サーバー同期する際に正しく動作しなくなる -export class PreferencesManager { +export class PreferencesManager extends EventEmitter { private io: StorageProvider; private currentAccount: { id: string } | null; public profile: PreferencesProfile; @@ -201,6 +210,8 @@ export class PreferencesManager { }; constructor(io: StorageProvider, currentAccount: { id: string } | null) { + super(); + this.io = io; this.currentAccount = currentAccount; @@ -246,6 +257,12 @@ export class PreferencesManager { this.rewriteRawState(key, v); + this.emit('committed', { + key, + value: v, + oldValue: this.s[key], + }); + const record = this.getMatchedRecordOf(key); if (parseScope(record[0]).account == null && isAccountDependentKey(key) && currentAccount != null) { -- cgit v1.2.3-freya