![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.ca/private_html/src/pages/admin/ |
import { useState } from 'react';
import LayoutWithSidebar from '@/components/LayoutWithSidebar';
const AdminOptions = () => {
const [backupStatus, setBackupStatus] = useState('');
const [restoreStatus, setRestoreStatus] = useState('');
const [restoreFile, setRestoreFile] = useState<File | null>(null);
const handleBackup = async () => {
setBackupStatus('Backing up...');
try {
const res = await fetch('/api/admin/backup');
if (!res.ok) throw new Error('Backup failed');
const blob = await res.blob();
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'backup.zip';
a.click();
setBackupStatus('Backup complete!');
} catch (err) {
setBackupStatus('Backup failed.');
}
};
const handleRestore = async () => {
if (!restoreFile) return;
setRestoreStatus('Restoring...');
const formData = new FormData();
formData.append('file', restoreFile);
try {
const res = await fetch('/api/admin/restore', {
method: 'POST',
body: formData,
});
if (!res.ok) throw new Error('Restore failed');
setRestoreStatus('Restore complete!');
} catch (err) {
setRestoreStatus('Restore failed.');
}
};
return (
<LayoutWithSidebar>
<div className="max-w-2xl mx-auto py-12">
<h1 className="text-3xl font-bold mb-8">Admin Options</h1>
<div className="bg-white rounded-xl shadow p-6 mb-8">
<h2 className="text-xl font-semibold mb-4">Backup</h2>
<button onClick={handleBackup} className="px-6 py-2 bg-primary text-white rounded-lg font-bold">Backup All Data & Files</button>
{backupStatus && <div className="mt-2 text-sm text-gray-600">{backupStatus}</div>}
</div>
<div className="bg-white rounded-xl shadow p-6">
<h2 className="text-xl font-semibold mb-4">Restore</h2>
<input type="file" accept=".zip" onChange={e => setRestoreFile(e.target.files?.[0] || null)} className="mb-4" />
<button onClick={handleRestore} className="px-6 py-2 bg-primary text-white rounded-lg font-bold" disabled={!restoreFile}>Restore from Backup</button>
{restoreStatus && <div className="mt-2 text-sm text-gray-600">{restoreStatus}</div>}
</div>
</div>
</LayoutWithSidebar>
);
};
export default AdminOptions;