import type { OnboardingEmojiConfig } from "../components/onboarding/OnboardingOoDesigner"; import type { UiLocale } from "./ui-locale"; export const ONBOARDING_DRAFT_STORAGE_KEY = "rakazo.onboardingDraft"; export type OnboardingStepDraft = | "emoji" | "name" | "language" | "voice" | "integrations" | "scan" | "bot"; export type OnboardingDraft = { step: OnboardingStepDraft; emojiConfig: OnboardingEmojiConfig; ooName: string; languageChoice: UiLocale | null; currentLocale: UiLocale; selectedVoiceId: string; voiceSkipped: boolean; }; function readStorage( storage: Pick | null | undefined, ): Pick | null { if (storage !== undefined) return storage; return typeof sessionStorage !== "undefined" ? sessionStorage : null; } function writeStorage( storage: Pick | null | undefined, ): Pick | null { if (storage !== undefined) return storage; return typeof sessionStorage !== "undefined" ? sessionStorage : null; } /** Restore in-progress onboarding after reload or deep link within the same tab. */ export function readOnboardingDraft( storage: Pick | null = readStorage(undefined), ): OnboardingDraft | null { if (!storage) return null; try { const raw = storage.getItem(ONBOARDING_DRAFT_STORAGE_KEY); if (!raw) return null; const parsed = JSON.parse(raw) as Partial; if ( !parsed || typeof parsed.step !== "string" || !parsed.emojiConfig || typeof parsed.emojiConfig.avatarValue !== "string" || typeof parsed.emojiConfig.pose !== "string" || typeof parsed.ooName !== "string" ) { return null; } return { step: parsed.step as OnboardingStepDraft, emojiConfig: parsed.emojiConfig, ooName: parsed.ooName, languageChoice: parsed.languageChoice ?? null, currentLocale: parsed.currentLocale ?? "en", selectedVoiceId: parsed.selectedVoiceId ?? "", voiceSkipped: parsed.voiceSkipped ?? false, }; } catch { return null; } } export function persistOnboardingDraft( draft: OnboardingDraft, storage: Pick | null = writeStorage(undefined), ): void { if (!storage) return; try { storage.setItem(ONBOARDING_DRAFT_STORAGE_KEY, JSON.stringify(draft)); } catch { // Quota / private mode — onboarding still works without persistence. } } export function clearOnboardingDraft( storage: Pick | null = writeStorage(undefined), ): void { if (!storage) return; try { storage.removeItem(ONBOARDING_DRAFT_STORAGE_KEY); } catch { // Ignore storage failures on completion. } }