fix(canvas): 画布同步 - 版本冲突先核对并合并,本地保存与云端状态分开展示

本地持久化记录保存时间和日志令牌,同步面板区分本地与云端,不再用提示打断编辑。冲突时先尝试合并,无法合并才保留草稿并暂停自动提交;未登录时生成结果留在本地,登录后再继续上传。
This commit is contained in:
ddcat666 committed 2026-10-09 17:17:38 +08:00
1 parent 631a85b4fe
commit 5e69106d8f
17 files changed
+539 -236

No files matched your search

@@ -15,6 +15,8 @@ export type CanvasStorageDocument = {
state: { projects: CanvasProject[] };
version: number;
storageRevision: number;
savedAt?: string;
journalTokens?: Record<string, number>;
tombstones: CanvasStorageTombstones;
};
@@ -73,6 +75,8 @@ export function parseCanvasStorageDocument(value: string | null, fallback: Canva
state?: { projects?: unknown };
version?: unknown;
storageRevision?: unknown;
savedAt?: unknown;
journalTokens?: unknown;
tombstones?: unknown;
};
if (!Array.isArray(parsed.state?.projects)) throw new Error("画布持久状态无效");
@@ -80,6 +84,8 @@ export function parseCanvasStorageDocument(value: string | null, fallback: Canva
state: { projects: normalizeProjectAssetCategories(parsed.state.projects as CanvasProject[]) },
version: typeof parsed.version === "number" ? parsed.version : 0,
storageRevision: typeof parsed.storageRevision === "number" && Number.isFinite(parsed.storageRevision) ? parsed.storageRevision : 0,
savedAt: typeof parsed.savedAt === "string" && parsed.savedAt ? parsed.savedAt : undefined,
journalTokens: recordOfNumbers(parsed.journalTokens),
tombstones: normalizeTombstones(parsed.tombstones),
};
}