diff --git a/frontend/src/app/admin/backup/emergency/page.tsx b/frontend/src/app/admin/backup/emergency/page.tsx new file mode 100644 index 0000000..c226622 --- /dev/null +++ b/frontend/src/app/admin/backup/emergency/page.tsx @@ -0,0 +1,91 @@ +'use client'; + +import { useState } from 'react'; +import { useRouter } from 'next/navigation'; + +export default function EmergencyBackupPage() { + const [file, setFile] = useState(null); + const [status, setStatus] = useState<'idle' | 'uploading' | 'success' | 'error'>('idle'); + const [message, setMessage] = useState(''); + const router = useRouter(); + + const handleUpload = async () => { + if (!file) return; + setStatus('uploading'); + setMessage('Restaurando sistema de emergência... Por favor, aguarde.'); + + const formData = new FormData(); + formData.append('file', file); + + try { + const res = await fetch('/api/admin/backup/full', { + method: 'POST', + body: formData, + }); + + if (res.ok) { + setStatus('success'); + setMessage('Sistema restaurado com sucesso! Redirecionando para o login...'); + setTimeout(() => router.push('/admin/login'), 3000); + } else { + const errorData = await res.json(); + setStatus('error'); + setMessage(errorData.error || 'Erro ao restaurar backup.'); + } + } catch (err) { + setStatus('error'); + setMessage('Erro de conexão ao restaurar backup.'); + } + }; + + return ( +
+
+

🔑 Chave Mestra de Restauração

+

Use esta página para restaurar seu backup ZIP em um banco de dados novo.

+ +
+
+ setFile(e.target.files?.[0] || null)} + /> +
+ {file ? ( + {file.name} + ) : ( + 'Clique ou arraste o arquivo .zip de backup aqui' + )} +
+
+ + + + {message && ( +
+ {message} +
+ )} +
+
+
+ ); +}