notes / src /data /state-utils.mjs
bot
add paste image support
2f60066
Raw
History Blame Contribute Delete
2.32 kB
export const maxNoteBodyLength = 10 * 1024 * 1024;
export function createSeedState(now = Date.now()) {
return {
folders: [
{
id: "notes",
name: "备忘录",
createdAt: now,
updatedAt: now
}
],
notes: [
{
id: crypto.randomUUID(),
folder: "notes",
body: "欢迎使用备忘录\n\n左侧选择文件夹,中间选择笔记,右侧直接编辑。第一行会自动作为标题。",
createdAt: now - 1000 * 60 * 60 * 24,
updatedAt: now - 1000 * 60 * 12,
version: 1
},
{
id: crypto.randomUUID(),
folder: "notes",
body: "待办清单\n\n- 记录想法\n- 整理项目\n- 做一个真正好用的 Web 版笔记",
createdAt: now - 1000 * 60 * 60 * 3,
updatedAt: now - 1000 * 60 * 35,
version: 1
}
]
};
}
export function normalizeStateForWrite({ folders = [], notes = [] }, now = Date.now()) {
const normalizedFolders = normalizeFolders(folders, now);
const folderIds = new Set(normalizedFolders.map((folder) => folder.id));
const normalizedNotes = notes.map((note) => ({
id: String(note.id || crypto.randomUUID()),
folder: folderIds.has(note.folder) ? note.folder : "notes",
body: clampNoteBody(note.body),
createdAt: Number(note.createdAt || now),
updatedAt: Number(note.updatedAt || now),
version: Number(note.version || 1)
}));
return {
folders: normalizedFolders,
notes: normalizedNotes
};
}
function normalizeFolders(folders, now) {
const seen = new Set();
const normalized = folders
.map((folder) => ({
id: String(folder.id || crypto.randomUUID()),
name: String(folder.name || "未命名文件夹").trim() || "未命名文件夹",
createdAt: Number(folder.createdAt || now),
updatedAt: Number(folder.updatedAt || now),
version: Number(folder.version || 1)
}))
.filter((folder) => {
if (seen.has(folder.id)) return false;
seen.add(folder.id);
return true;
});
if (!seen.has("notes")) {
normalized.unshift({ id: "notes", name: "备忘录", createdAt: now, updatedAt: now, version: 1 });
}
return normalized;
}
export function clampNoteBody(value) {
return String(value || "").slice(0, maxNoteBodyLength);
}