diff --git a/app/admin/page.tsx b/app/admin/page.tsx index 735e8b0..8f2a18c 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -581,6 +581,59 @@ export default function AdminDashboard() { }; const [restoring, setRestoring] = useState(false); + const [factoryPreset, setFactoryPreset] = useState<{ exists: boolean; sizeBytes?: number; modifiedAt?: string } | null>(null); + const [savingPreset, setSavingPreset] = useState(false); + const [factoryResetting, setFactoryResetting] = useState(false); + + const refreshFactoryPreset = async () => { + try { + const res = await fetch('/api/admin/factory-preset'); + if (res.ok) setFactoryPreset(await res.json()); + } catch { /* ignore */ } + }; + useEffect(() => { void refreshFactoryPreset(); }, []); + + const handleSaveFactoryPreset = async () => { + const msg = factoryPreset?.exists + ? 'Sovrascrivere il factory preset esistente con lo stato attuale?' + : 'Salvare lo stato attuale come factory preset?'; + if (!window.confirm(msg)) return; + setSavingPreset(true); + try { + const res = await fetch('/api/admin/factory-preset', { method: 'POST' }); + const data = await res.json().catch(() => ({})); + if (!res.ok) { + showToast(data?.error || `Errore (${res.status})`, 'error'); + return; + } + showToast('Factory preset aggiornato.'); + await refreshFactoryPreset(); + } catch (err) { + showToast(`Errore di rete: ${(err as Error).message}`, 'error'); + } finally { + setSavingPreset(false); + } + }; + + const handleFactoryReset = async () => { + if (!window.confirm('FACTORY RESET — tutti i dati attuali verranno sostituiti col factory preset. Continuare?')) return; + setFactoryResetting(true); + try { + const res = await fetch('/api/admin/factory-reset', { method: 'POST' }); + const data = await res.json().catch(() => ({})); + if (!res.ok) { + showToast(data?.error || `Errore (${res.status})`, 'error'); + return; + } + showToast(`Factory reset eseguito: ${data.restored?.cards ?? 0} card, ${data.restored?.portals ?? 0} portali. Ricarico…`); + setTimeout(() => window.location.reload(), 1200); + } catch (err) { + showToast(`Errore di rete: ${(err as Error).message}`, 'error'); + } finally { + setFactoryResetting(false); + } + }; + const handleRestoreUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; e.target.value = ''; @@ -840,6 +893,39 @@ export default function AdminDashboard() { +
+

Factory Preset

+

+ Stato “di fabbrica” sempre ripristinabile con un click. Utile per preparare preset standard da distribuire alle macchine MajorNet: + configura il portale come vuoi, salvalo come preset, poi copia factory/preset.zip sulle altre macchine. +

+

+ Preset attuale: {factoryPreset === null ? '…' + : factoryPreset.exists + ? presente · {((factoryPreset.sizeBytes ?? 0) / (1024 * 1024)).toFixed(1)} MB · {factoryPreset.modifiedAt ? new Date(factoryPreset.modifiedAt).toLocaleString('it-IT') : '?'} + : nessun preset configurato} +

+
+ + +
+
+