export type CanvasDraft = { base: string; snapshot: string }; const key = (projectId: string) => `canvas-unsynced:${projectId}`; export function readCanvasDraft(projectId: string): CanvasDraft | null { try { const value = JSON.parse(localStorage.getItem(key(projectId)) || "null"); return typeof value?.base === "string" && typeof value?.snapshot === "string" ? value : null; } catch { return null; } } export function writeCanvasDraft(projectId: string, draft: CanvasDraft): boolean { try { localStorage.setItem(key(projectId), JSON.stringify(draft)); return true; } catch { return false; } } export function clearCanvasDraft(projectId: string) { try { localStorage.removeItem(key(projectId)); } catch { // Keep the current in-memory canvas when browser storage is unavailable. } } const composerKey = (chatId: string) => `canvas-unsent-message:${chatId}`; export function writeCanvasComposerDraft(chatId: string, draft: { text: string; attachments: unknown[] }) { try { localStorage.setItem(composerKey(chatId), JSON.stringify(draft)); return true; } catch { return false; } } export function readCanvasComposerDraft(chatId: string): { text: string; attachments: T[] } | null { try { const value = JSON.parse(localStorage.getItem(composerKey(chatId)) || "null"); return typeof value?.text === "string" && Array.isArray(value?.attachments) ? value : null; } catch { return null; } } export function clearCanvasComposerDraft(chatId: string) { try { localStorage.removeItem(composerKey(chatId)); } catch { // Keep the current editor contents when browser storage is unavailable. } }