56 lines
1.7 KiB
TypeScript
56 lines
1.7 KiB
TypeScript
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<T>(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.
|
|
}
|
|
}
|