zcbot/web/static/js/chat_drafts.js

50 lines
1.6 KiB
JavaScript

// 对话输入草稿的 localStorage 封装。按用户隔离、按 task 保存;特殊 key
// "__new__" 表示尚未创建 task 的“新对话”入口。
export const NEW_CHAT_DRAFT_ID = "__new__";
const STORAGE_PREFIX = "zcbot.chat-drafts.v1.";
const MAX_DRAFTS = 50;
export function chatDraftStorageKey(userId) {
return userId ? STORAGE_PREFIX + userId : "";
}
function readAll(storage, userId) {
const key = chatDraftStorageKey(userId);
if (!key) return {};
try {
const parsed = JSON.parse(storage.getItem(key) || "{}");
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
} catch (_) {
return {};
}
}
export function readChatDraft(storage, userId, draftId) {
const item = readAll(storage, userId)[draftId];
return item && typeof item.text === "string" ? item.text : "";
}
export function writeChatDraft(storage, userId, draftId, text, now = Date.now()) {
const key = chatDraftStorageKey(userId);
if (!key || !draftId) return;
const drafts = readAll(storage, userId);
if (!text || !text.trim()) {
delete drafts[draftId];
} else {
drafts[draftId] = { text, updatedAt: now };
}
const entries = Object.entries(drafts)
.sort((a, b) => Number(b[1]?.updatedAt || 0) - Number(a[1]?.updatedAt || 0))
.slice(0, MAX_DRAFTS);
try {
if (entries.length) storage.setItem(key, JSON.stringify(Object.fromEntries(entries)));
else storage.removeItem(key);
} catch (_) {
// 隐私模式、WebView 禁用存储或 quota 满时静默跳过持久化,不阻断输入。
}
}
export function clearChatDraft(storage, userId, draftId) {
writeChatDraft(storage, userId, draftId, "");
}