"use client"; /** * Draft persistence for the wizards, so an OS kill (or an accidental reload) * doesn't lose the user's photos, pasted text or options. Best-effort: photo * data URLs can be large, so every write is guarded and skipped on quota * errors instead of breaking the flow. */ export type WizardDraft = { v: 1; savedAt: number; text?: string; focus?: string; difficulty?: string; count?: number; folderId?: string; images?: Array<{ id: string; name: string; dataUrl: string; bytes: number; width: number; height: number }>; }; const TTL_MS = 24 * 60 * 60 * 1000; const MAX_BYTES = 3_000_000; function keyFor(scope: "deck" | "homework"): string { return `freezmo.draft.${scope}.v1`; } export function saveWizardDraft(scope: "deck" | "homework", draft: Omit): void { try { const images = draft.images ?? []; const size = images.reduce((sum, image) => sum + image.dataUrl.length, 0); const payload: WizardDraft = { v: 1, savedAt: Date.now(), ...draft, // Photos over the budget are dropped rather than failing the whole save. images: size > MAX_BYTES ? [] : images, }; window.localStorage.setItem(keyFor(scope), JSON.stringify(payload)); } catch { /* quota or private mode — drafts are a nice-to-have */ } } export function loadWizardDraft(scope: "deck" | "homework"): WizardDraft | null { try { const raw = window.localStorage.getItem(keyFor(scope)); if (!raw) return null; const parsed = JSON.parse(raw) as WizardDraft; if (parsed.v !== 1 || Date.now() - parsed.savedAt > TTL_MS) { window.localStorage.removeItem(keyFor(scope)); return null; } return parsed; } catch { return null; } } export function clearWizardDraft(scope: "deck" | "homework"): void { try { window.localStorage.removeItem(keyFor(scope)); } catch { /* ignore */ } }