2026-06-13 14:19:47 +08:00
|
|
|
// ============================================================
|
|
|
|
|
// Storage — localStorage 封装
|
|
|
|
|
// 职责:会话配置持久化
|
|
|
|
|
// ============================================================
|
|
|
|
|
|
2026-06-13 17:08:56 +08:00
|
|
|
import type { SessionConfig, Theme } from "../types";
|
2026-06-13 14:19:47 +08:00
|
|
|
|
|
|
|
|
const CONFIG_KEY = "camtalk:config";
|
2026-06-13 17:08:56 +08:00
|
|
|
const THEME_KEY = "camtalk:theme";
|
2026-06-13 14:19:47 +08:00
|
|
|
|
|
|
|
|
const DEFAULT_CONFIG: SessionConfig = {
|
|
|
|
|
ttsEnabled: true,
|
|
|
|
|
detailLevel: "low",
|
|
|
|
|
language: "zh-CN",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 加载配置,无存储时返回默认值 */
|
|
|
|
|
export function loadConfig(): SessionConfig {
|
|
|
|
|
try {
|
|
|
|
|
const raw = localStorage.getItem(CONFIG_KEY);
|
|
|
|
|
if (!raw) return DEFAULT_CONFIG;
|
|
|
|
|
const parsed = JSON.parse(raw) as Partial<SessionConfig>;
|
|
|
|
|
return { ...DEFAULT_CONFIG, ...parsed };
|
|
|
|
|
} catch {
|
|
|
|
|
return DEFAULT_CONFIG;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 保存配置到 localStorage */
|
|
|
|
|
export function saveConfig(config: SessionConfig): void {
|
|
|
|
|
try {
|
|
|
|
|
localStorage.setItem(CONFIG_KEY, JSON.stringify(config));
|
|
|
|
|
} catch {
|
|
|
|
|
// localStorage 不可用时静默失败
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-06-13 17:08:56 +08:00
|
|
|
|
|
|
|
|
/** 加载主题偏好 */
|
|
|
|
|
export function loadTheme(): Theme {
|
|
|
|
|
try {
|
|
|
|
|
const raw = localStorage.getItem(THEME_KEY);
|
|
|
|
|
if (raw === "light" || raw === "dark") return raw;
|
|
|
|
|
} catch { /* ignore */ }
|
|
|
|
|
return "dark";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 保存主题偏好 */
|
|
|
|
|
export function saveTheme(theme: Theme): void {
|
|
|
|
|
try {
|
|
|
|
|
localStorage.setItem(THEME_KEY, theme);
|
|
|
|
|
} catch { /* ignore */ }
|
|
|
|
|
}
|