diff --git a/packages/shared/IpcChannel.ts b/packages/shared/IpcChannel.ts index cfc00913aa..42ff62db2a 100644 --- a/packages/shared/IpcChannel.ts +++ b/packages/shared/IpcChannel.ts @@ -177,7 +177,6 @@ export enum IpcChannel { Backup_RestoreFromLocalBackup = 'backup:restoreFromLocalBackup', Backup_ListLocalBackupFiles = 'backup:listLocalBackupFiles', Backup_DeleteLocalBackupFile = 'backup:deleteLocalBackupFile', - Backup_SetLocalBackupDir = 'backup:setLocalBackupDir', Backup_BackupToS3 = 'backup:backupToS3', Backup_RestoreFromS3 = 'backup:restoreFromS3', Backup_ListS3Files = 'backup:listS3Files', diff --git a/src/main/ipc.ts b/src/main/ipc.ts index a3e3ef4432..39f677a6b8 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -409,7 +409,6 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { ipcMain.handle(IpcChannel.Backup_RestoreFromLocalBackup, backupManager.restoreFromLocalBackup.bind(backupManager)) ipcMain.handle(IpcChannel.Backup_ListLocalBackupFiles, backupManager.listLocalBackupFiles.bind(backupManager)) ipcMain.handle(IpcChannel.Backup_DeleteLocalBackupFile, backupManager.deleteLocalBackupFile.bind(backupManager)) - ipcMain.handle(IpcChannel.Backup_SetLocalBackupDir, backupManager.setLocalBackupDir.bind(backupManager)) ipcMain.handle(IpcChannel.Backup_BackupToS3, backupManager.backupToS3.bind(backupManager)) ipcMain.handle(IpcChannel.Backup_RestoreFromS3, backupManager.restoreFromS3.bind(backupManager)) ipcMain.handle(IpcChannel.Backup_ListS3Files, backupManager.listS3Files.bind(backupManager)) diff --git a/src/main/services/BackupManager.ts b/src/main/services/BackupManager.ts index 5ec531fe62..56d3a97379 100644 --- a/src/main/services/BackupManager.ts +++ b/src/main/services/BackupManager.ts @@ -33,7 +33,6 @@ class BackupManager { this.deleteLocalBackupFile = this.deleteLocalBackupFile.bind(this) this.backupToLocalDir = this.backupToLocalDir.bind(this) this.restoreFromLocalBackup = this.restoreFromLocalBackup.bind(this) - this.setLocalBackupDir = this.setLocalBackupDir.bind(this) this.backupToS3 = this.backupToS3.bind(this) this.restoreFromS3 = this.restoreFromS3.bind(this) this.listS3Files = this.listS3Files.bind(this) @@ -599,17 +598,6 @@ class BackupManager { } } - async setLocalBackupDir(_: Electron.IpcMainInvokeEvent, dirPath: string) { - try { - // Check if directory exists - await fs.ensureDir(dirPath) - return true - } catch (error) { - logger.error('[BackupManager] Set local backup directory failed:', error as Error) - throw error - } - } - async restoreFromS3(_: Electron.IpcMainInvokeEvent, s3Config: S3Config) { const filename = s3Config.fileName || 'cherry-studio.backup.zip' diff --git a/src/preload/index.ts b/src/preload/index.ts index 5b492846d1..bc1d8b383e 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -120,7 +120,6 @@ const api = { ipcRenderer.invoke(IpcChannel.Backup_ListLocalBackupFiles, localBackupDir), deleteLocalBackupFile: (fileName: string, localBackupDir?: string) => ipcRenderer.invoke(IpcChannel.Backup_DeleteLocalBackupFile, fileName, localBackupDir), - setLocalBackupDir: (dirPath: string) => ipcRenderer.invoke(IpcChannel.Backup_SetLocalBackupDir, dirPath), checkWebdavConnection: (webdavConfig: WebDavConfig) => ipcRenderer.invoke(IpcChannel.Backup_CheckConnection, webdavConfig), diff --git a/src/renderer/src/components/LocalBackupManager.tsx b/src/renderer/src/components/LocalBackupManager.tsx index 387831ba1a..c7b86c94bc 100644 --- a/src/renderer/src/components/LocalBackupManager.tsx +++ b/src/renderer/src/components/LocalBackupManager.tsx @@ -31,7 +31,6 @@ export function LocalBackupManager({ visible, onClose, localBackupDir, restoreMe pageSize: 5, total: 0 }) - const fetchBackupFiles = useCallback(async () => { if (!localBackupDir) { return diff --git a/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx b/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx index 388a6b94ca..97e9105180 100644 --- a/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx @@ -36,6 +36,7 @@ const LocalBackupSettings: React.FC = () => { } = useSettings() const [localBackupDir, setLocalBackupDir] = useState(localBackupDirSetting) + const [resolvedLocalBackupDir, setResolvedLocalBackupDir] = useState(undefined) const [localBackupSkipBackupFile, setLocalBackupSkipBackupFile] = useState(localBackupSkipBackupFileSetting) const [backupManagerVisible, setBackupManagerVisible] = useState(false) @@ -48,6 +49,12 @@ const LocalBackupSettings: React.FC = () => { window.api.getAppInfo().then(setAppInfo) }, []) + useEffect(() => { + if (localBackupDirSetting) { + window.api.resolvePath(localBackupDirSetting).then(setResolvedLocalBackupDir) + } + }, [localBackupDirSetting]) + const { theme } = useTheme() const { t } = useTranslation() @@ -110,8 +117,7 @@ const LocalBackupSettings: React.FC = () => { if (await checkLocalBackupDirValid(value)) { setLocalBackupDir(value) dispatch(_setLocalBackupDir(value)) - // Create directory if it doesn't exist and set it in the backend - await window.api.backup.setLocalBackupDir(value) + setResolvedLocalBackupDir(await window.api.resolvePath(value)) dispatch(setLocalBackupAutoSync(true)) startAutoSync(true, 'local') @@ -183,7 +189,7 @@ const LocalBackupSettings: React.FC = () => { } const { isModalVisible, handleBackup, handleCancel, backuping, customFileName, setCustomFileName, showBackupModal } = - useLocalBackupModal(localBackupDir) + useLocalBackupModal(resolvedLocalBackupDir) const showBackupManager = () => { setBackupManagerVisible(true) @@ -298,7 +304,7 @@ const LocalBackupSettings: React.FC = () => { diff --git a/src/renderer/src/services/BackupService.ts b/src/renderer/src/services/BackupService.ts index 419f870f97..6216d2ae38 100644 --- a/src/renderer/src/services/BackupService.ts +++ b/src/renderer/src/services/BackupService.ts @@ -902,7 +902,11 @@ export async function backupToLocal({ showMessage = false, customFileName = '', autoBackupProcess = false -}: { showMessage?: boolean; customFileName?: string; autoBackupProcess?: boolean } = {}) { +}: { + showMessage?: boolean + customFileName?: string + autoBackupProcess?: boolean +} = {}) { const notificationService = NotificationService.getInstance() if (isManualBackupRunning) { logger.verbose('Manual backup already in progress') @@ -917,7 +921,12 @@ export async function backupToLocal({ store.dispatch(setLocalBackupSyncState({ syncing: true, lastSyncError: null })) - const { localBackupDir, localBackupMaxBackups, localBackupSkipBackupFile } = store.getState().settings + const { + localBackupDir: localBackupDirSetting, + localBackupMaxBackups, + localBackupSkipBackupFile + } = store.getState().settings + const localBackupDir = await window.api.resolvePath(localBackupDirSetting) let deviceType = 'unknown' let hostname = 'unknown' try { @@ -1039,9 +1048,9 @@ export async function backupToLocal({ } export async function restoreFromLocal(fileName: string) { - const { localBackupDir } = store.getState().settings - try { + const { localBackupDir: localBackupDirSetting } = store.getState().settings + const localBackupDir = await window.api.resolvePath(localBackupDirSetting) const restoreData = await window.api.backup.restoreFromLocalBackup(fileName, localBackupDir) const data = JSON.parse(restoreData) await handleData(data)