From 6aad11766abbc3d08724fd8b6f8c218024df89b8 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Sat, 25 Jul 2026 19:51:02 +0900 Subject: [PATCH] wip --- packages/frontend/docs/preferences.md | 41 +++++++++++++++++++- packages/frontend/src/preferences/manager.ts | 2 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/frontend/docs/preferences.md b/packages/frontend/docs/preferences.md index f36fd1ceeb..aadabd38bd 100644 --- a/packages/frontend/docs/preferences.md +++ b/packages/frontend/docs/preferences.md @@ -1,6 +1,45 @@ # Preferences system -## ユースケース +ユーザーの環境設定を管理するシステム。 + +## 指針 + +実装上のミスで、**設定値が意図せず失われる(古い値で上書きされる)ことが絶対にあってはならない。** + +設定値が失われる、考えられるシナリオの例: + +- 複数のタブでMisskeyを開いていて、タブAで設定を編集した後、タブBを開いたところ、タブBの古い状態の内容で設定が保存され、タブAで行った編集が巻き戻ってしまった。 +- プロファイルの同期機能をオンにしたところ、サーバーに保存されていた古い設定でローカルが上書きされてしまった。 + +上記のシナリオが絶対に発生しない設計・実装にしなければならない。 + +上記以外にも考えられるシナリオがあれば、必ず適切な対処を行う設計・実装にしなければならない。 + +## 仕様 + +### タブ間同期 + +ブラウザで複数タブを開いているとき、あるタブで変更した設定が他のタブでも反映されるようにし、UXを向上させ、古い設定情報が上書き保存されることを防ぐ。 + +### 自動バックアップ(cloudBackup) + +定期的、または特定のタイミングなどで、プロファイルをサーバーに自動的にアップロードする。 + +### 自動同期(cloudSync) + +定期的、または特定のタイミングなどで、サーバーにアップロードされたプロファイルをダウンロードし、ローカルに適用する。 + +### 設定項目: デバイス間で同期(syncBetweenDevices, ValueMeta.sync) + +デバイス間・プロファイル横断でその設定項目の設定値を同期する。 + +当オプションを有効にするかどうかは設定項目ごとに設定可能。 + +## ユーザーストーリー(ユースケース) + +### 同じプロファイルを複数のデバイスで使いたい(同期したい) + +自動バックアップと自動同期をオンにする。 ### (新しいデバイスなどで)既存のプロファイルを継承した新しいプロファイルを作りたい diff --git a/packages/frontend/src/preferences/manager.ts b/packages/frontend/src/preferences/manager.ts index 4f33993800..6373a2c308 100644 --- a/packages/frontend/src/preferences/manager.ts +++ b/packages/frontend/src/preferences/manager.ts @@ -75,7 +75,7 @@ export type PreferencesProfile = { id: string; version: string; type: 'main'; - modifiedAt: number; // 仕様が若干直感的ではない(syncされた値が降ってきたときは更新されないなど)ため、一応残してはいるが積極的な利用はしない方が無難 + modifiedAt: number; // 仕様が若干直感的ではない(syncされた値が降ってきたときは更新されないなど)ため、一応残してはいるが積極的な利用はしない方が無難。設定値の新旧比較が必要なら項目ごとのmodifiedAtを使うべし name: string; preferences: { [K in keyof PREF]: PrefRecord[];