import { LoadingButton } from "@mui/lab"; import { Button, List, ListItem, ListItemText, Stack, Typography, } from "@mui/material"; import { useLockFn } from "ahooks"; import type { ReactNode, Ref } from "react"; import { useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; import { BaseDialog, DialogRef } from "@/components/base"; import { createLocalBackup, createWebdavBackup } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; import { AutoBackupSettings } from "./auto-backup-settings"; import { BackupHistoryViewer } from "./backup-history-viewer"; import { BackupWebdavDialog } from "./backup-webdav-dialog"; type BackupSource = "local" | "webdav"; export function BackupViewer({ ref }: { ref?: Ref }) { const { t } = useTranslation(); const [open, setOpen] = useState(false); const [busyAction, setBusyAction] = useState(null); const [historyOpen, setHistoryOpen] = useState(false); const [historySource, setHistorySource] = useState("local"); const [historyPage, setHistoryPage] = useState(0); const [webdavDialogOpen, setWebdavDialogOpen] = useState(false); useImperativeHandle(ref, () => ({ open: () => setOpen(true), close: () => setOpen(false), })); const openHistory = (target: BackupSource) => { setHistorySource(target); setHistoryPage(0); setHistoryOpen(true); }; const handleBackup = useLockFn(async (target: BackupSource) => { try { setBusyAction(target); if (target === "local") { await createLocalBackup(); showNotice.success( "settings.modals.backup.messages.localBackupCreated", ); } else { await createWebdavBackup(); showNotice.success("settings.modals.backup.messages.backupCreated"); } } catch (error) { console.error(error); showNotice.error( target === "local" ? "settings.modals.backup.messages.localBackupFailed" : "settings.modals.backup.messages.backupFailed", target === "local" ? undefined : { error }, ); } finally { setBusyAction(null); } }); return ( setOpen(false)} onClose={() => setOpen(false)} > `1px solid ${theme.palette.divider}`, borderRadius: 2, p: 2, }} > {t("settings.modals.backup.auto.title")} `1px solid ${theme.palette.divider}`, borderRadius: 2, p: 2, }} > {t("settings.modals.backup.manual.title")} {( [ { key: "local" as BackupSource, title: t("settings.modals.backup.tabs.local"), description: t("settings.modals.backup.manual.local"), actions: [ handleBackup("local")} > {t("settings.modals.backup.actions.backup")} , , ], }, { key: "webdav" as BackupSource, title: t("settings.modals.backup.tabs.webdav"), description: t("settings.modals.backup.manual.webdav"), actions: [ handleBackup("webdav")} > {t("settings.modals.backup.actions.backup")} , , , ], }, ] satisfies Array<{ key: BackupSource; title: string; description: string; actions: ReactNode[]; }> ).map((item, idx) => ( {item.actions} ))} setHistoryOpen(false)} /> setWebdavDialogOpen(false)} onBackupSuccess={() => openHistory("webdav")} setBusy={(loading) => setBusyAction(loading ? "webdav" : null)} /> ); }