import type { CanvasCapabilityClientCommand } from "@/lib/canvas/capabilities/client-command"; import { mergeCanvasSnapshots } from "@/lib/video-canvas/merge-snapshot"; import { canvasService } from "@/services/canvas"; import { useCanvasStore } from "@/store/canvas"; /** Runs after the editor has saved and while its save queue is reserved. */ export async function executeCanvasToolbarCapability( command: CanvasCapabilityClientCommand, ) { const projectId = command.projectId!; const before = useCanvasStore.getState(); if (before.projectId !== projectId) throw new Error("画布已切换,请重新选择图片"); const base = JSON.stringify({ canvasData: before.getCanvasState() }); const response = await fetch(`/api/canvas/${projectId}/capabilities`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(command), }); const payload = await response.json().catch(() => ({})); if (!response.ok || payload?.success !== true) { throw new Error(payload?.error || "图片处理失败"); } const result = await canvasService.getProject(projectId); if (!result.success || !result.data?.canvasData) { throw new Error(result.error || "结果已生成,但画布同步失败"); } const current = useCanvasStore.getState(); if (current.projectId !== projectId) return; const merged = mergeCanvasSnapshots( base, JSON.stringify({ canvasData: current.getCanvasState() }), JSON.stringify({ canvasData: result.data.canvasData }), ); if (merged.conflicts.length > 0) { throw new Error("结果已生成,但画布有冲突;请保留本地改动后刷新查看结果"); } current.loadCanvas(JSON.parse(merged.snapshot).canvasData); current.setCanvasRevision(String(result.data.updatedAt), String(result.data.updatedAt)); }