File size: 2,319 Bytes
2f60066
fccdf92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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);
}