feat: added webdav auto-sync settings synchronization and custom show message option

This commit is contained in:
kangfenmao 2024-12-24 10:25:19 +08:00
parent fbd189c5e1
commit f1f7e8e11b
4 changed files with 24 additions and 28 deletions

View File

@ -2,6 +2,7 @@ import { isMac } from '@renderer/config/constant'
import { isLocalAi } from '@renderer/config/env' import { isLocalAi } from '@renderer/config/env'
import db from '@renderer/databases' import db from '@renderer/databases'
import i18n from '@renderer/i18n' import i18n from '@renderer/i18n'
import { startAutoSync, stopAutoSync } from '@renderer/services/BackupService'
import { useAppDispatch } from '@renderer/store' import { useAppDispatch } from '@renderer/store'
import { setAvatar, setFilesPath, setUpdateState } from '@renderer/store/runtime' import { setAvatar, setFilesPath, setUpdateState } from '@renderer/store/runtime'
import { delay, runAsyncFunction } from '@renderer/utils' import { delay, runAsyncFunction } from '@renderer/utils'
@ -15,7 +16,8 @@ import useUpdateHandler from './useUpdateHandler'
export function useAppInit() { export function useAppInit() {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { proxyUrl, language, windowStyle, manualUpdateCheck, proxyMode } = useSettings() const { proxyUrl, language, windowStyle, manualUpdateCheck, proxyMode, webdavAutoSync, webdavSyncInterval } =
useSettings()
const { minappShow } = useRuntime() const { minappShow } = useRuntime()
const { setDefaultModel, setTopicNamingModel, setTranslateModel } = useDefaultModel() const { setDefaultModel, setTopicNamingModel, setTranslateModel } = useDefaultModel()
const avatar = useLiveQuery(() => db.settings.get('image://avatar')) const avatar = useLiveQuery(() => db.settings.get('image://avatar'))
@ -74,6 +76,10 @@ export function useAppInit() {
}) })
}, [dispatch]) }, [dispatch])
useEffect(() => {
webdavAutoSync ? startAutoSync() : stopAutoSync()
}, [webdavAutoSync, webdavSyncInterval])
useEffect(() => { useEffect(() => {
import('@renderer/queue/KnowledgeQueue') import('@renderer/queue/KnowledgeQueue')
}, []) }, [])

View File

@ -37,8 +37,6 @@ export const useShortcut = (
const shortcutConfig = shortcuts.find((s) => s.key === shortcutKey) const shortcutConfig = shortcuts.find((s) => s.key === shortcutKey)
console.log(shortcutConfig)
useHotkeys( useHotkeys(
shortcutConfig?.enabled ? formatShortcut(shortcutConfig.shortcut) : 'none', shortcutConfig?.enabled ? formatShortcut(shortcutConfig.shortcut) : 'none',
(e) => { (e) => {

View File

@ -1,7 +1,7 @@
import { FolderOpenOutlined, SaveOutlined } from '@ant-design/icons' import { FolderOpenOutlined, SaveOutlined } from '@ant-design/icons'
import { HStack } from '@renderer/components/Layout' import { HStack } from '@renderer/components/Layout'
import { useSettings } from '@renderer/hooks/useSettings' import { useSettings } from '@renderer/hooks/useSettings'
import { backupToWebdav, restoreFromWebdav, startAutoSync, stopAutoSync } from '@renderer/services/BackupService' import { backupToWebdav, restoreFromWebdav } from '@renderer/services/BackupService'
import { useAppDispatch } from '@renderer/store' import { useAppDispatch } from '@renderer/store'
import { import {
setWebdavAutoSync, setWebdavAutoSync,
@ -63,15 +63,11 @@ const WebDavSettings: FC = () => {
await restoreFromWebdav() await restoreFromWebdav()
setRestoring(false) setRestoring(false)
} }
const onToggleAutoSync = (checked: boolean) => { const onToggleAutoSync = (checked: boolean) => {
dispatch(setWebdavAutoSync(checked)) dispatch(setWebdavAutoSync(checked))
if (checked) {
startAutoSync()
} else {
stopAutoSync()
}
} }
const onSyncIntervalChange = (value: number) => { const onSyncIntervalChange = (value: number) => {
setSyncInterval(value) setSyncInterval(value)
dispatch(_setWebdavSyncInterval(value)) dispatch(_setWebdavSyncInterval(value))
@ -138,7 +134,7 @@ const WebDavSettings: FC = () => {
disabled={!webdavHost} disabled={!webdavHost}
/> />
<Select <Select
value={syncInterval} value={syncInterval || 5}
onChange={onSyncIntervalChange} onChange={onSyncIntervalChange}
disabled={!webdavHost || !autoSync} disabled={!webdavHost || !autoSync}
style={{ width: 120 }}> style={{ width: 120 }}>

View File

@ -58,7 +58,7 @@ export async function reset() {
} }
// 备份到 webdav // 备份到 webdav
export async function backupToWebdav() { export async function backupToWebdav({ showMessage = true }: { showMessage?: boolean }) {
const { webdavHost, webdavUser, webdavPass, webdavPath } = store.getState().settings const { webdavHost, webdavUser, webdavPass, webdavPath } = store.getState().settings
const backupData = await getBackupData() const backupData = await getBackupData()
@ -72,16 +72,17 @@ export async function backupToWebdav() {
webdavPath webdavPath
}) })
if (success) { if (success) {
window.message.success({ content: i18n.t('message.backup.success'), key: 'backup' }) showMessage && window.message.success({ content: i18n.t('message.backup.success'), key: 'backup' })
} else { } else {
window.message.error({ content: i18n.t('message.backup.failed'), key: 'backup' }) showMessage && window.message.error({ content: i18n.t('message.backup.failed'), key: 'backup' })
} }
} catch (error: any) { } catch (error: any) {
console.error('[backup] backupToWebdav: Error uploading file to WebDAV:', error) console.error('[backup] backupToWebdav: Error uploading file to WebDAV:', error)
window.modal.error({ showMessage &&
title: i18n.t('message.backup.failed'), window.modal.error({
content: error.message title: i18n.t('message.backup.failed'),
}) content: error.message
})
} }
} }
@ -122,24 +123,19 @@ export function startAutoSync() {
const performBackup = async () => { const performBackup = async () => {
try { try {
console.log('[AutoSync] Performing backup...') console.log('[AutoSync] Performing backup...')
await backupToWebdav() await backupToWebdav({ showMessage: false })
window.message.success({ window.message.success({ content: i18n.t('message.backup.success'), key: 'webdav-sync' })
content: i18n.t('message.backup.start.success'),
key: 'webdav-sync'
})
} catch (error) { } catch (error) {
console.error('[AutoSync] Backup failed:', error) console.error('[AutoSync] Backup failed:', error)
window.message.error({ window.message.error({ content: i18n.t('message.backup.failed'), key: 'webdav-sync' })
content: i18n.t('message.backup.failed'),
key: 'webdav-sync'
})
} }
} }
performBackup() performBackup()
syncInterval = setInterval(performBackup, webdavSyncInterval * 60 * 1000) syncInterval = setInterval(performBackup, webdavSyncInterval * 60 * 1000)
console.log('[AutoSync] Sync interval set up:', syncInterval)
console.log(`[AutoSync] Sync interval set up: ${webdavSyncInterval} minutes`)
} }
} }