feat(memoir): persist chapter reading prefs globally

Share font size, font family, and background across all memoir chapters via MemoirReadingSettingsProvider and SecureStore (same app-settings pattern). Add parse/merge helpers and unit tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin
2026-05-15 17:23:02 +08:00
parent c4d2a38b09
commit 6f41574bda
7 changed files with 322 additions and 24 deletions

View File

@@ -10,11 +10,18 @@ import { supportedLanguages, type AppLanguage } from '@/i18n/resources';
import { THEME_NAMES, type ThemeName } from '@/constants/theme-bridge';
import {
mergeMemoirReadingPreferences,
parseMemoirReadingPreferences,
type MemoirReadingPreferences,
} from './memoir-reading-settings';
const KEY_LANGUAGE = 'app_settings_language';
const KEY_LARGE_TEXT = 'app_settings_large_text';
const KEY_DARK_MODE = 'app_settings_dark_mode';
const KEY_THEME_NAME = 'app_settings_theme_name';
const KEY_TTS_SPEAK_DEFAULT = 'app_settings_tts_speak_default';
const KEY_MEMOIR_READING = 'app_settings_memoir_reading';
const webFallback: Record<string, string> = {};
@@ -95,5 +102,20 @@ export async function setTtsSpeakDefault(value: boolean): Promise<void> {
await setStored(KEY_TTS_SPEAK_DEFAULT, value ? 'true' : 'false');
}
export async function getMemoirReadingPreferences(): Promise<MemoirReadingPreferences> {
const raw = await getStored(KEY_MEMOIR_READING);
return parseMemoirReadingPreferences(raw);
}
export async function setMemoirReadingPreferences(
patch: Partial<MemoirReadingPreferences>,
): Promise<void> {
const raw = await getStored(KEY_MEMOIR_READING);
const current = parseMemoirReadingPreferences(raw);
const next = mergeMemoirReadingPreferences(current, patch);
await setStored(KEY_MEMOIR_READING, JSON.stringify(next));
}
export { supportedLanguages, THEME_NAMES };
export type { AppLanguage, ThemeName };
export type { MemoirReadingPreferences } from './memoir-reading-settings';