"use client"; import { useEffect, useRef, useState } from "react"; import { Button } from "@/components/ui"; import { applyImport, downloadBackup, getStoragePersistence, parseBackup, previewImport, requestStoragePersistence, type BackupFile, type ImportPreview, type PersistenceState, } from "@/lib/backup"; import { useI18n } from "@/lib/i18n"; /** * Settings → Data & backup: export everything to one file, import a backup * with a preview and a merge/replace choice, and show whether the browser * treats this origin's storage as persistent. */ export function DataSection() { const { t } = useI18n(); const fileRef = useRef(null); const [persistence, setPersistence] = useState(null); const [pending, setPending] = useState<{ backup: BackupFile; preview: ImportPreview } | null>(null); const [notice, setNotice] = useState(null); useEffect(() => { void getStoragePersistence().then(setPersistence); }, []); const pick = async (file: File | undefined) => { setNotice(null); if (!file) return; const raw = await file.text().catch(() => ""); const result = parseBackup(raw); if ("error" in result) { setPending(null); setNotice(result.error); return; } setPending({ backup: result.backup, preview: previewImport(result.backup) }); }; const reset = () => { setPending(null); if (fileRef.current) fileRef.current.value = ""; }; const apply = async (mode: "merge" | "replace") => { if (!pending) return; const done = await applyImport(pending.backup, mode); setNotice(t("settings.importDone", { decks: done.decks, homework: done.homework })); reset(); }; const requestPersistent = async () => { const granted = await requestStoragePersistence(); setPersistence(granted ? "persistent" : "best-effort"); setNotice(granted ? t("settings.storageGranted") : t("settings.storageDenied")); }; return (

{t("settings.data")}

{t("settings.dataNote")}

void pick(event.target.files?.[0])} />

{t("settings.exportNote")}

{pending ? (

{t("settings.importPreview", { decks: pending.preview.decks.added + pending.preview.decks.replaced, homework: pending.preview.homework.added + pending.preview.homework.replaced, folders: pending.preview.folders.added + pending.preview.folders.replaced, })}

{t("settings.importMergeNote")}

{t("settings.importReplaceNote")}

) : null} {notice ?

{notice}

: null}
{t("settings.storage")} {persistence === "persistent" ? t("settings.storagePersistent") : persistence === "unsupported" ? t("settings.storageBestEffort") : t("settings.storageBestEffort")} {persistence === "best-effort" ? ( ) : null}
); }