"use client"; import { useRef, useState } from "react"; import { toast, Toaster } from "sonner"; import { useTranslation } from "react-i18next"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { DatabaseIcon, DownloadIcon, UploadIcon, Loader2 } from "lucide-react"; import { Card, CardContent } from "@/components/ui/card"; import { cn } from "@/lib/utils"; import { motion, AnimatePresence } from "framer-motion"; interface DatabaseBackupProps { open: boolean; onClose: () => void; token?: string; } export default function DatabaseBackup({ open, onClose, token, }: DatabaseBackupProps) { const { t } = useTranslation("common"); const fileInputRef = useRef(null); const [isExporting, setIsExporting] = useState(false); const [isImporting, setIsImporting] = useState(false); const handleExport = async () => { if (!token) { toast.error(t("auth.unauthorized")); return; } setIsExporting(true); try { const response = await fetch("/api/v1/panel/database/export", { headers: { Authorization: `Bearer ${token}`, }, }); if (!response.ok) { throw new Error(t("backup.export.error")); } const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `openwebui_monitor_backup_${ new Date().toISOString().split("T")[0] }.json`; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); toast.success(t("backup.export.success")); } catch (error) { console.error(t("backup.export.error"), error); toast.error(t("backup.export.error")); } finally { setIsExporting(false); } }; const handleImport = async (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; if (!token) { toast.error(t("auth.unauthorized")); return; } setIsImporting(true); try { const content = await file.text(); const data = JSON.parse(content); const response = await fetch("/api/v1/panel/database/import", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, body: JSON.stringify(data), }); if (!response.ok) { throw new Error(t("backup.import.error")); } const result = await response.json(); if (result.success) { toast.success(t("backup.import.success")); if (fileInputRef.current) { fileInputRef.current.value = ""; } } else { throw new Error(result.error || t("backup.import.error")); } } catch (err) { console.error(t("backup.import.error"), err); toast.error( err instanceof Error ? err.message : t("backup.import.error") ); } finally { setIsImporting(false); } }; return ( {open && (
{t("backup.title")}
{t("backup.description")}
{isExporting ? ( ) : ( )}

{t("backup.export.title")}

{t("backup.export.description")}

fileInputRef.current?.click()} >
{isImporting ? ( ) : ( )}

{t("backup.import.title")}

{t("backup.import.description")}

)}
); }