50 lines
1.6 KiB
JavaScript
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, "");
|
|
}
|