style(backup): fix style

This commit is contained in:
GeorgeDong32 2025-09-25 12:51:01 +08:00 committed by GeorgeDong32
parent 06cba0e3bf
commit a2c1011c55
2 changed files with 95 additions and 3 deletions

View File

@ -13,7 +13,9 @@ import {
setLocalBackupDir as _setLocalBackupDir,
setLocalBackupMaxBackups as _setLocalBackupMaxBackups,
setLocalBackupSkipBackupFile as _setLocalBackupSkipBackupFile,
setLocalBackupSyncInterval as _setLocalBackupSyncInterval
setLocalBackupSyncInterval as _setLocalBackupSyncInterval,
setLocalSingleFileName as _setLocalSingleFileName,
setLocalSingleFileOverwrite as _setLocalSingleFileOverwrite
} from '@renderer/store/settings'
import { AppInfo } from '@renderer/types'
import { Button, Input, Switch, Tooltip } from 'antd'
@ -32,12 +34,16 @@ const LocalBackupSettings: React.FC = () => {
localBackupDir: localBackupDirSetting,
localBackupSyncInterval: localBackupSyncIntervalSetting,
localBackupMaxBackups: localBackupMaxBackupsSetting,
localBackupSkipBackupFile: localBackupSkipBackupFileSetting
localBackupSkipBackupFile: localBackupSkipBackupFileSetting,
localSingleFileOverwrite: localSingleFileOverwriteSetting,
localSingleFileName: localSingleFileNameSetting
} = useSettings()
const [localBackupDir, setLocalBackupDir] = useState<string | undefined>(localBackupDirSetting)
const [resolvedLocalBackupDir, setResolvedLocalBackupDir] = useState<string | undefined>(undefined)
const [localBackupSkipBackupFile, setLocalBackupSkipBackupFile] = useState<boolean>(localBackupSkipBackupFileSetting)
const [localSingleFileOverwrite, setLocalSingleFileOverwrite] = useState<boolean>(!!localSingleFileOverwriteSetting)
const [localSingleFileName, setLocalSingleFileName] = useState<string | undefined>(localSingleFileNameSetting)
const [backupManagerVisible, setBackupManagerVisible] = useState(false)
const [syncInterval, setSyncInterval] = useState<number>(localBackupSyncIntervalSetting)
@ -140,6 +146,15 @@ const LocalBackupSettings: React.FC = () => {
dispatch(_setLocalBackupSkipBackupFile(value))
}
const onSingleFileOverwriteChange = (value: boolean) => {
setLocalSingleFileOverwrite(value)
dispatch(_setLocalSingleFileOverwrite(value))
}
const onSingleFileNameBlur = () => {
dispatch(_setLocalSingleFileName(localSingleFileName || ''))
}
const handleBrowseDirectory = async () => {
try {
const newLocalBackupDir = await window.api.select({
@ -203,6 +218,37 @@ const LocalBackupSettings: React.FC = () => {
<SettingGroup theme={theme}>
<SettingTitle>{t('settings.data.local.title')}</SettingTitle>
<SettingDivider />
{/* 覆盖式单文件备份,仅在自动备份开启且保留份数=1时推荐启用 */}
<SettingRow>
<SettingRowTitle>
{t('settings.data.backup.singleFileOverwrite.title') || '覆盖式单文件备份(同名覆盖)'}
</SettingRowTitle>
<Switch
checked={localSingleFileOverwrite}
onChange={onSingleFileOverwriteChange}
disabled={!(syncInterval > 0 && maxBackups === 1)}
/>
</SettingRow>
<SettingRow>
<SettingHelpText>
{t('settings.data.backup.singleFileOverwrite.help') ||
'当自动备份开启且保留份数为1时使用固定文件名每次覆盖。'}
</SettingHelpText>
</SettingRow>
<SettingRow>
<SettingRowTitle>{t('settings.data.backup.singleFileName.title') || '自定义文件名(可选)'}</SettingRowTitle>
<Input
placeholder={
t('settings.data.backup.singleFileName.placeholder') || '如cherry-studio.<hostname>.<device>.zip'
}
value={localSingleFileName}
onChange={(e) => setLocalSingleFileName(e.target.value)}
onBlur={onSingleFileNameBlur}
style={{ width: 300 }}
disabled={!localSingleFileOverwrite || !(syncInterval > 0 && maxBackups === 1)}
/>
</SettingRow>
<SettingDivider />
<SettingRow>
<SettingRowTitle>{t('settings.data.local.directory.label')}</SettingRowTitle>
<HStack gap="5px">

View File

@ -14,6 +14,8 @@ import {
setWebdavMaxBackups as _setWebdavMaxBackups,
setWebdavPass as _setWebdavPass,
setWebdavPath as _setWebdavPath,
setWebdavSingleFileName as _setWebdavSingleFileName,
setWebdavSingleFileOverwrite as _setWebdavSingleFileOverwrite,
setWebdavSkipBackupFile as _setWebdavSkipBackupFile,
setWebdavSyncInterval as _setWebdavSyncInterval,
setWebdavUser as _setWebdavUser
@ -34,7 +36,9 @@ const WebDavSettings: FC = () => {
webdavSyncInterval: webDAVSyncInterval,
webdavMaxBackups: webDAVMaxBackups,
webdavSkipBackupFile: webdDAVSkipBackupFile,
webdavDisableStream: webDAVDisableStream
webdavDisableStream: webDAVDisableStream,
webdavSingleFileOverwrite: webDAVSingleFileOverwrite,
webdavSingleFileName: webDAVSingleFileName
} = useSettings()
const [webdavHost, setWebdavHost] = useState<string | undefined>(webDAVHost)
@ -43,6 +47,8 @@ const WebDavSettings: FC = () => {
const [webdavPath, setWebdavPath] = useState<string | undefined>(webDAVPath)
const [webdavSkipBackupFile, setWebdavSkipBackupFile] = useState<boolean>(webdDAVSkipBackupFile)
const [webdavDisableStream, setWebdavDisableStream] = useState<boolean>(webDAVDisableStream)
const [webdavSingleFileOverwrite, setWebdavSingleFileOverwrite] = useState<boolean>(!!webDAVSingleFileOverwrite)
const [webdavSingleFileName, setWebdavSingleFileName] = useState<string | undefined>(webDAVSingleFileName)
const [backupManagerVisible, setBackupManagerVisible] = useState(false)
const [syncInterval, setSyncInterval] = useState<number>(webDAVSyncInterval)
@ -84,6 +90,15 @@ const WebDavSettings: FC = () => {
dispatch(_setWebdavDisableStream(value))
}
const onSingleFileOverwriteChange = (value: boolean) => {
setWebdavSingleFileOverwrite(value)
dispatch(_setWebdavSingleFileOverwrite(value))
}
const onSingleFileNameBlur = () => {
dispatch(_setWebdavSingleFileName(webdavSingleFileName || ''))
}
const renderSyncStatus = () => {
if (!webdavHost) return null
@ -123,6 +138,37 @@ const WebDavSettings: FC = () => {
<SettingGroup theme={theme}>
<SettingTitle>{t('settings.data.webdav.title')}</SettingTitle>
<SettingDivider />
{/* 覆盖式单文件备份,仅在自动备份开启且保留份数=1时推荐启用 */}
<SettingRow>
<SettingRowTitle>
{t('settings.data.backup.singleFileOverwrite.title') || '覆盖式单文件备份(同名覆盖)'}
</SettingRowTitle>
<Switch
checked={webdavSingleFileOverwrite}
onChange={onSingleFileOverwriteChange}
disabled={!(syncInterval > 0 && maxBackups === 1)}
/>
</SettingRow>
<SettingRow>
<SettingHelpText>
{t('settings.data.backup.singleFileOverwrite.help') ||
'当自动备份开启且保留份数为1时使用固定文件名每次覆盖。'}
</SettingHelpText>
</SettingRow>
<SettingRow>
<SettingRowTitle>{t('settings.data.backup.singleFileName.title') || '自定义文件名(可选)'}</SettingRowTitle>
<Input
placeholder={
t('settings.data.backup.singleFileName.placeholder') || '如cherry-studio.<hostname>.<device>.zip'
}
value={webdavSingleFileName}
onChange={(e) => setWebdavSingleFileName(e.target.value)}
onBlur={onSingleFileNameBlur}
style={{ width: 300 }}
disabled={!webdavSingleFileOverwrite || !(syncInterval > 0 && maxBackups === 1)}
/>
</SettingRow>
<SettingDivider />
<SettingRow>
<SettingRowTitle>{t('settings.data.webdav.host.label')}</SettingRowTitle>
<Input