// ============================================================ // Storage — localStorage 封装 // 职责:会话配置持久化 // ============================================================ import type { ChatMessage, SessionConfig, SessionSummary, Theme } from "../types"; const CONFIG_KEY = "camtalk:config"; const THEME_KEY = "camtalk:theme"; 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; return { ...DEFAULT_CONFIG, ...parsed }; } catch { return DEFAULT_CONFIG; } } /** 保存配置到 localStorage */ export function saveConfig(config: SessionConfig): void { try { localStorage.setItem(CONFIG_KEY, JSON.stringify(config)); // 派发自定义事件,通知 App 更新 locale window.dispatchEvent(new CustomEvent("camtalk-config-changed")); } catch { // localStorage 不可用时静默失败 } } /** 加载主题偏好 */ 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 */ } } // ---- 会话历史存储 ---- const SESSIONS_KEY = "camtalk:sessions"; const SESSION_MSG_PREFIX = "camtalk:session:"; /** 加载所有会话摘要(按 lastActiveAt 倒序) */ export function loadSessionSummaries(): SessionSummary[] { try { const raw = localStorage.getItem(SESSIONS_KEY); if (!raw) return []; return (JSON.parse(raw) as SessionSummary[]).sort((a, b) => b.lastActiveAt - a.lastActiveAt); } catch { return []; } } /** 保存会话摘要列表 */ export function saveSessionSummaries(sessions: SessionSummary[]): void { try { localStorage.setItem(SESSIONS_KEY, JSON.stringify(sessions)); } catch { /* ignore */ } } /** 加载单个会话的消息历史 */ export function loadSessionMessages(sessionId: string): ChatMessage[] { try { const raw = localStorage.getItem(SESSION_MSG_PREFIX + sessionId); if (!raw) return []; return JSON.parse(raw) as ChatMessage[]; } catch { return []; } } /** 保存单个会话的消息历史 */ export function saveSessionMessages(sessionId: string, messages: ChatMessage[]): void { try { localStorage.setItem(SESSION_MSG_PREFIX + sessionId, JSON.stringify(messages)); } catch { /* ignore */ } } /** 删除单个会话的消息历史 */ export function deleteSessionMessages(sessionId: string): void { try { localStorage.removeItem(SESSION_MSG_PREFIX + sessionId); } catch { /* ignore */ } }