Skip to content

feat: 設定状態管理を選択購読型ストアへ再設計し、無関係なfeatureの再レンダリングを防ぐ - #41

Merged
ibukani merged 3 commits into
mainfrom
feature/issue-31-settings-store
Aug 2, 2026
Merged

ibukani merged 3 commits into
mainfrom
feature/issue-31-settings-store

Conversation

@ibukani

@ibukani ibukani commented Aug 2, 2026

Copy link
Copy Markdown
Owner

概要

Closes #31

設定状態を React 標準の useSyncExternalStore ベースの選択購読型ストアへ再設計し、feature A の設定変更で feature B や共通UIが不要に再レンダリングされないようにしました。

実装内容

  • 外部ストア (src/core/store/settingsStore.ts): 保存キュー、debounce、即時保存条件、sequence 制御、retry、settings-changed 外部イベント同期、window 破棄時の flush を維持した SettingsStore を新設
  • 選択購読 API (src/core/context/AppSettings.tsx): useSettingsSelector(useSyncExternalStore + equality メモ化)、useSettings / useSettingsLoading / useSettingsError / useSettingsSaveStatus / useShortcutError / useUpdateSettings などを提供。legacy useAppSettings 全体 Context 購読 API は削除
  • useFeatureSettings: selector 版へ移行し、feature slice 参照を維持
  • 保存状態UIの自己購読 leaf 化: SidebarSaveStatus / SettingsSaveStatusBar を新設し、AppContent は saveStatus を購読しない構成へ。保存状態の変化は保存状態UIだけへ通知される
  • 全コンシューマ移行: App, GeneralSettings, 各 feature settings, onboarding, cross-feature actions など
  • docs/architecture.md 更新: 設定ストアの購読モデルを追記

検証

  • npm run check:quick パス(tsc / biome / scripts / ai-context / ai-foundation / release-version / verify-architecture 311 checks)
  • vitest 全 512 テストパス
  • 回帰テスト:
    • src/core/store/settingsSelectors.test.tsx: feature A 変更時に feature B が再レンダリングされない / 保存状態変化で feature が再レンダリングされない / shortcutError の分離 / no-op 更新の抑制 / 外部 settings-changed payload 適用
    • src/App.saveStatus.test.tsx: App 実描画レベルで保存状態遷移中に feature 設定コンポーネントが再レンダリングされないことを render count で検証

受け入れ条件との対応

  • 時計設定変更時に無関係な feature 購読者が再レンダリングされない
  • 保存状態の変化で feature 設定コンポーネント全体が再レンダリングされない
  • feature 固有ショートカットエラーが該当 feature 以外を更新しない
  • テーマ変更がテーマ購読者へ正しく反映される
  • debounce・即時保存・queue・retry・sequence 制御の維持
  • no-op 更新では保存・通知・再レンダリングが発生しない
  • 別ウィンドウからの設定変更が反映される(pending 中のローカル変更は古い外部イベントで上書きされない)
  • ウィンドウ破棄時に event listener が残らない
  • TypeScript/Rust/mock 間の設定型同期の維持
  • legacy 全体 Context 購読 API の削除
  • 変更前後の render 回数比較がテストとして残る

@ibukani
ibukani merged commit 2233564 into main Aug 2, 2026
2 checks passed
@ibukani
ibukani deleted the feature/issue-31-settings-store branch August 2, 2026 07:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

設定状態管理を選択購読型へ再設計し、無関係なfeatureの再レンダリングを防ぐ

1 participant