import { FolderOpenOutlined, SaveOutlined, SyncOutlined, WarningOutlined } from '@ant-design/icons' import { HStack } from '@renderer/components/Layout' import Selector from '@renderer/components/Selector' import { WebdavBackupManager } from '@renderer/components/WebdavBackupManager' import { useWebdavBackupModal, WebdavBackupModal } from '@renderer/components/WebdavModals' import { useTheme } from '@renderer/context/ThemeProvider' import { useSettings } from '@renderer/hooks/useSettings' import { startAutoSync, stopAutoSync } from '@renderer/services/BackupService' import { useAppDispatch, useAppSelector } from '@renderer/store' import { setWebdavAutoSync, setWebdavHost as _setWebdavHost, setWebdavMaxBackups as _setWebdavMaxBackups, setWebdavPass as _setWebdavPass, setWebdavPath as _setWebdavPath, setWebdavSkipBackupFile as _setWebdavSkipBackupFile, setWebdavSyncInterval as _setWebdavSyncInterval, setWebdavUser as _setWebdavUser } from '@renderer/store/settings' import { Button, Input, Switch, Tooltip } from 'antd' import dayjs from 'dayjs' import { FC, useState } from 'react' import { useTranslation } from 'react-i18next' import { SettingDivider, SettingGroup, SettingHelpText, SettingRow, SettingRowTitle, SettingTitle } from '..' const WebDavSettings: FC = () => { const { webdavHost: webDAVHost, webdavUser: webDAVUser, webdavPass: webDAVPass, webdavPath: webDAVPath, webdavSyncInterval: webDAVSyncInterval, webdavMaxBackups: webDAVMaxBackups, webdavSkipBackupFile: webdDAVSkipBackupFile } = useSettings() const [webdavHost, setWebdavHost] = useState(webDAVHost) const [webdavUser, setWebdavUser] = useState(webDAVUser) const [webdavPass, setWebdavPass] = useState(webDAVPass) const [webdavPath, setWebdavPath] = useState(webDAVPath) const [webdavSkipBackupFile, setWebdavSkipBackupFile] = useState(webdDAVSkipBackupFile) const [backupManagerVisible, setBackupManagerVisible] = useState(false) const [syncInterval, setSyncInterval] = useState(webDAVSyncInterval) const [maxBackups, setMaxBackups] = useState(webDAVMaxBackups) const dispatch = useAppDispatch() const { theme } = useTheme() const { t } = useTranslation() const { webdavSync } = useAppSelector((state) => state.backup) // 把之前备份的文件定时上传到 webdav,首先先配置 webdav 的 host, port, user, pass, path const onSyncIntervalChange = (value: number) => { setSyncInterval(value) dispatch(_setWebdavSyncInterval(value)) if (value === 0) { dispatch(setWebdavAutoSync(false)) stopAutoSync() } else { dispatch(setWebdavAutoSync(true)) startAutoSync() } } const onMaxBackupsChange = (value: number) => { setMaxBackups(value) dispatch(_setWebdavMaxBackups(value)) } const onSkipBackupFilesChange = (value: boolean) => { setWebdavSkipBackupFile(value) dispatch(_setWebdavSkipBackupFile(value)) } const renderSyncStatus = () => { if (!webdavHost) return null if (!webdavSync.lastSyncTime && !webdavSync.syncing && !webdavSync.lastSyncError) { return {t('settings.data.webdav.noSync')} } return ( {webdavSync.syncing && } {!webdavSync.syncing && webdavSync.lastSyncError && ( )} {webdavSync.lastSyncTime && ( {t('settings.data.webdav.lastSync')}: {dayjs(webdavSync.lastSyncTime).format('HH:mm:ss')} )} ) } const { isModalVisible, handleBackup, handleCancel, backuping, customFileName, setCustomFileName, showBackupModal } = useWebdavBackupModal() const showBackupManager = () => { setBackupManagerVisible(true) } const closeBackupManager = () => { setBackupManagerVisible(false) } return ( {t('settings.data.webdav.title')} {t('settings.data.webdav.host')} setWebdavHost(e.target.value)} style={{ width: 250 }} type="url" onBlur={() => dispatch(_setWebdavHost(webdavHost || ''))} /> {t('settings.data.webdav.user')} setWebdavUser(e.target.value)} style={{ width: 250 }} onBlur={() => dispatch(_setWebdavUser(webdavUser || ''))} /> {t('settings.data.webdav.password')} setWebdavPass(e.target.value)} style={{ width: 250 }} onBlur={() => dispatch(_setWebdavPass(webdavPass || ''))} /> {t('settings.data.webdav.path')} setWebdavPath(e.target.value)} style={{ width: 250 }} onBlur={() => dispatch(_setWebdavPath(webdavPath || ''))} /> {t('settings.general.backup.title')} {t('settings.data.webdav.autoSync')} {t('settings.data.webdav.maxBackups')} {t('settings.data.backup.skip_file_data_title')} {t('settings.data.backup.skip_file_data_help')} {webdavSync && syncInterval > 0 && ( <> {t('settings.data.webdav.syncStatus')} {renderSyncStatus()} )} <> ) } export default WebDavSettings