feat: add cloud backup upload and universal restore script
This commit is contained in:
@@ -151,6 +151,32 @@ export function BackupManager() {
|
||||
}
|
||||
};
|
||||
|
||||
const uploadBackupToCloud = async (filename: string) => {
|
||||
try {
|
||||
setRestoreLoading(filename);
|
||||
|
||||
const response = await fetch('/api/backup/upload', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ filename })
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (response.ok) {
|
||||
success('Backup enviado para cloud com sucesso!');
|
||||
} else {
|
||||
showError(data.error || 'Erro ao enviar backup');
|
||||
}
|
||||
} catch (err) {
|
||||
showError('Erro ao enviar backup: ' + (err as Error).message);
|
||||
} finally {
|
||||
setRestoreLoading(null);
|
||||
}
|
||||
};
|
||||
|
||||
const formatSize = (bytes: number) => {
|
||||
if (bytes === 0) return '0 B';
|
||||
const k = 1024;
|
||||
@@ -247,6 +273,18 @@ export function BackupManager() {
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-2 shrink-0">
|
||||
<button
|
||||
onClick={() => uploadBackupToCloud(backup.filename)}
|
||||
disabled={restoreLoading === backup.filename}
|
||||
title="Enviar para cloud"
|
||||
className="p-2 hover:bg-purple-100 dark:hover:bg-purple-900/20 rounded-lg transition-colors text-purple-600 dark:text-purple-400 disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{restoreLoading === backup.filename ? (
|
||||
<i className="ri-loader-4-line animate-spin text-xl"></i>
|
||||
) : (
|
||||
<i className="ri-cloud-upload-line text-xl"></i>
|
||||
)}
|
||||
</button>
|
||||
<button
|
||||
onClick={() => restoreBackup(backup.filename)}
|
||||
disabled={restoreLoading === backup.filename}
|
||||
|
||||
Reference in New Issue
Block a user