diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx index 3374ee9..b14b849 100644 --- a/src/pages/Settings.tsx +++ b/src/pages/Settings.tsx @@ -4,6 +4,7 @@ import { Monitor, Trash2, Download, + Upload, FileSpreadsheet, } from "lucide-react"; import { useAppStore } from "../stores/appStore"; @@ -35,6 +36,69 @@ export default function Settings() { } }; + const handleImportJson = () => { + const input = document.createElement("input"); + input.type = "file"; + input.accept = "application/json"; + input.onchange = async (e) => { + const file = (e.target as HTMLInputElement).files?.[0]; + if (!file) return; + + const reader = new FileReader(); + reader.onload = async (event) => { + try { + const content = event.target?.result as string; + const data = JSON.parse(content); + + if (!data.sessions || !data.settings || !data.players) { + throw new Error("Fichier de sauvegarde invalide ou corrompu."); + } + + if ( + window.confirm( + "Attention : L'importation va écraser vos données actuelles. Voulez-vous continuer ?", + ) + ) { + await db.transaction( + "rw", + db.sessions, + db.settings, + db.players, + async () => { + await db.sessions.clear(); + await db.settings.clear(); + await db.players.clear(); + + if (data.sessions.length > 0) + await db.sessions.bulkAdd(data.sessions); + if (data.settings.length > 0) + await db.settings.bulkAdd(data.settings); + if (data.players.length > 0) + await db.players.bulkAdd(data.players); + }, + ); + + // Reload settings to apply any imported theme + const newSettings = await db.settings.get(1); + if (newSettings && newSettings.theme) { + setTheme(newSettings.theme); + } + + alert("Restauration réussie !"); + window.location.reload(); + } + } catch (error) { + console.error(error); + alert( + "Échec de l'importation : Le fichier n'est pas un backup Skori valide.", + ); + } + }; + reader.readAsText(file); + }; + input.click(); + }; + const handleExportCSV = async () => { try { const sessions = await db.sessions.toArray(); @@ -162,23 +226,39 @@ export default function Settings() { - + Sauvegarder + + Format .json + + + + + +