Files
CamTalk/frontend/src/lib/storage.ts

103 lines
2.9 KiB
TypeScript
Raw Normal View History

// ============================================================
// 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<SessionConfig>;
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 */ }
}