mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-07 22:10:21 +08:00
fix(LocalBackup): streamline local backup relative directory handling (#8595)
* fix(LocalBackup): streamline local backup directory handling - Added a new state to manage the resolved local backup directory in LocalBackupSettings. - Updated the LocalBackupManager component to use the resolved directory instead of the raw input. - Enhanced the backupToLocal and restoreFromLocal functions to resolve the local backup directory path before use, improving reliability. * refactor(Backup): remove setLocalBackupDir functionality - Removed the setLocalBackupDir method and its associated IPC channel handling from the BackupManager and IpcChannel. - Updated LocalBackupSettings to eliminate direct calls to setLocalBackupDir, instead resolving the local backup directory path directly. - Cleaned up related code in the BackupService to streamline local backup operations. * format code
This commit is contained in:
parent
57065a1831
commit
18521c93b4
@ -177,7 +177,6 @@ export enum IpcChannel {
|
|||||||
Backup_RestoreFromLocalBackup = 'backup:restoreFromLocalBackup',
|
Backup_RestoreFromLocalBackup = 'backup:restoreFromLocalBackup',
|
||||||
Backup_ListLocalBackupFiles = 'backup:listLocalBackupFiles',
|
Backup_ListLocalBackupFiles = 'backup:listLocalBackupFiles',
|
||||||
Backup_DeleteLocalBackupFile = 'backup:deleteLocalBackupFile',
|
Backup_DeleteLocalBackupFile = 'backup:deleteLocalBackupFile',
|
||||||
Backup_SetLocalBackupDir = 'backup:setLocalBackupDir',
|
|
||||||
Backup_BackupToS3 = 'backup:backupToS3',
|
Backup_BackupToS3 = 'backup:backupToS3',
|
||||||
Backup_RestoreFromS3 = 'backup:restoreFromS3',
|
Backup_RestoreFromS3 = 'backup:restoreFromS3',
|
||||||
Backup_ListS3Files = 'backup:listS3Files',
|
Backup_ListS3Files = 'backup:listS3Files',
|
||||||
|
|||||||
@ -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_RestoreFromLocalBackup, backupManager.restoreFromLocalBackup.bind(backupManager))
|
||||||
ipcMain.handle(IpcChannel.Backup_ListLocalBackupFiles, backupManager.listLocalBackupFiles.bind(backupManager))
|
ipcMain.handle(IpcChannel.Backup_ListLocalBackupFiles, backupManager.listLocalBackupFiles.bind(backupManager))
|
||||||
ipcMain.handle(IpcChannel.Backup_DeleteLocalBackupFile, backupManager.deleteLocalBackupFile.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_BackupToS3, backupManager.backupToS3.bind(backupManager))
|
||||||
ipcMain.handle(IpcChannel.Backup_RestoreFromS3, backupManager.restoreFromS3.bind(backupManager))
|
ipcMain.handle(IpcChannel.Backup_RestoreFromS3, backupManager.restoreFromS3.bind(backupManager))
|
||||||
ipcMain.handle(IpcChannel.Backup_ListS3Files, backupManager.listS3Files.bind(backupManager))
|
ipcMain.handle(IpcChannel.Backup_ListS3Files, backupManager.listS3Files.bind(backupManager))
|
||||||
|
|||||||
@ -33,7 +33,6 @@ class BackupManager {
|
|||||||
this.deleteLocalBackupFile = this.deleteLocalBackupFile.bind(this)
|
this.deleteLocalBackupFile = this.deleteLocalBackupFile.bind(this)
|
||||||
this.backupToLocalDir = this.backupToLocalDir.bind(this)
|
this.backupToLocalDir = this.backupToLocalDir.bind(this)
|
||||||
this.restoreFromLocalBackup = this.restoreFromLocalBackup.bind(this)
|
this.restoreFromLocalBackup = this.restoreFromLocalBackup.bind(this)
|
||||||
this.setLocalBackupDir = this.setLocalBackupDir.bind(this)
|
|
||||||
this.backupToS3 = this.backupToS3.bind(this)
|
this.backupToS3 = this.backupToS3.bind(this)
|
||||||
this.restoreFromS3 = this.restoreFromS3.bind(this)
|
this.restoreFromS3 = this.restoreFromS3.bind(this)
|
||||||
this.listS3Files = this.listS3Files.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) {
|
async restoreFromS3(_: Electron.IpcMainInvokeEvent, s3Config: S3Config) {
|
||||||
const filename = s3Config.fileName || 'cherry-studio.backup.zip'
|
const filename = s3Config.fileName || 'cherry-studio.backup.zip'
|
||||||
|
|
||||||
|
|||||||
@ -120,7 +120,6 @@ const api = {
|
|||||||
ipcRenderer.invoke(IpcChannel.Backup_ListLocalBackupFiles, localBackupDir),
|
ipcRenderer.invoke(IpcChannel.Backup_ListLocalBackupFiles, localBackupDir),
|
||||||
deleteLocalBackupFile: (fileName: string, localBackupDir?: string) =>
|
deleteLocalBackupFile: (fileName: string, localBackupDir?: string) =>
|
||||||
ipcRenderer.invoke(IpcChannel.Backup_DeleteLocalBackupFile, fileName, localBackupDir),
|
ipcRenderer.invoke(IpcChannel.Backup_DeleteLocalBackupFile, fileName, localBackupDir),
|
||||||
setLocalBackupDir: (dirPath: string) => ipcRenderer.invoke(IpcChannel.Backup_SetLocalBackupDir, dirPath),
|
|
||||||
checkWebdavConnection: (webdavConfig: WebDavConfig) =>
|
checkWebdavConnection: (webdavConfig: WebDavConfig) =>
|
||||||
ipcRenderer.invoke(IpcChannel.Backup_CheckConnection, webdavConfig),
|
ipcRenderer.invoke(IpcChannel.Backup_CheckConnection, webdavConfig),
|
||||||
|
|
||||||
|
|||||||
@ -31,7 +31,6 @@ export function LocalBackupManager({ visible, onClose, localBackupDir, restoreMe
|
|||||||
pageSize: 5,
|
pageSize: 5,
|
||||||
total: 0
|
total: 0
|
||||||
})
|
})
|
||||||
|
|
||||||
const fetchBackupFiles = useCallback(async () => {
|
const fetchBackupFiles = useCallback(async () => {
|
||||||
if (!localBackupDir) {
|
if (!localBackupDir) {
|
||||||
return
|
return
|
||||||
|
|||||||
@ -36,6 +36,7 @@ const LocalBackupSettings: React.FC = () => {
|
|||||||
} = useSettings()
|
} = useSettings()
|
||||||
|
|
||||||
const [localBackupDir, setLocalBackupDir] = useState<string | undefined>(localBackupDirSetting)
|
const [localBackupDir, setLocalBackupDir] = useState<string | undefined>(localBackupDirSetting)
|
||||||
|
const [resolvedLocalBackupDir, setResolvedLocalBackupDir] = useState<string | undefined>(undefined)
|
||||||
const [localBackupSkipBackupFile, setLocalBackupSkipBackupFile] = useState<boolean>(localBackupSkipBackupFileSetting)
|
const [localBackupSkipBackupFile, setLocalBackupSkipBackupFile] = useState<boolean>(localBackupSkipBackupFileSetting)
|
||||||
const [backupManagerVisible, setBackupManagerVisible] = useState(false)
|
const [backupManagerVisible, setBackupManagerVisible] = useState(false)
|
||||||
|
|
||||||
@ -48,6 +49,12 @@ const LocalBackupSettings: React.FC = () => {
|
|||||||
window.api.getAppInfo().then(setAppInfo)
|
window.api.getAppInfo().then(setAppInfo)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (localBackupDirSetting) {
|
||||||
|
window.api.resolvePath(localBackupDirSetting).then(setResolvedLocalBackupDir)
|
||||||
|
}
|
||||||
|
}, [localBackupDirSetting])
|
||||||
|
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
|
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
@ -110,8 +117,7 @@ const LocalBackupSettings: React.FC = () => {
|
|||||||
if (await checkLocalBackupDirValid(value)) {
|
if (await checkLocalBackupDirValid(value)) {
|
||||||
setLocalBackupDir(value)
|
setLocalBackupDir(value)
|
||||||
dispatch(_setLocalBackupDir(value))
|
dispatch(_setLocalBackupDir(value))
|
||||||
// Create directory if it doesn't exist and set it in the backend
|
setResolvedLocalBackupDir(await window.api.resolvePath(value))
|
||||||
await window.api.backup.setLocalBackupDir(value)
|
|
||||||
|
|
||||||
dispatch(setLocalBackupAutoSync(true))
|
dispatch(setLocalBackupAutoSync(true))
|
||||||
startAutoSync(true, 'local')
|
startAutoSync(true, 'local')
|
||||||
@ -183,7 +189,7 @@ const LocalBackupSettings: React.FC = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { isModalVisible, handleBackup, handleCancel, backuping, customFileName, setCustomFileName, showBackupModal } =
|
const { isModalVisible, handleBackup, handleCancel, backuping, customFileName, setCustomFileName, showBackupModal } =
|
||||||
useLocalBackupModal(localBackupDir)
|
useLocalBackupModal(resolvedLocalBackupDir)
|
||||||
|
|
||||||
const showBackupManager = () => {
|
const showBackupManager = () => {
|
||||||
setBackupManagerVisible(true)
|
setBackupManagerVisible(true)
|
||||||
@ -298,7 +304,7 @@ const LocalBackupSettings: React.FC = () => {
|
|||||||
<LocalBackupManager
|
<LocalBackupManager
|
||||||
visible={backupManagerVisible}
|
visible={backupManagerVisible}
|
||||||
onClose={closeBackupManager}
|
onClose={closeBackupManager}
|
||||||
localBackupDir={localBackupDir}
|
localBackupDir={resolvedLocalBackupDir}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
</SettingGroup>
|
</SettingGroup>
|
||||||
|
|||||||
@ -902,7 +902,11 @@ export async function backupToLocal({
|
|||||||
showMessage = false,
|
showMessage = false,
|
||||||
customFileName = '',
|
customFileName = '',
|
||||||
autoBackupProcess = false
|
autoBackupProcess = false
|
||||||
}: { showMessage?: boolean; customFileName?: string; autoBackupProcess?: boolean } = {}) {
|
}: {
|
||||||
|
showMessage?: boolean
|
||||||
|
customFileName?: string
|
||||||
|
autoBackupProcess?: boolean
|
||||||
|
} = {}) {
|
||||||
const notificationService = NotificationService.getInstance()
|
const notificationService = NotificationService.getInstance()
|
||||||
if (isManualBackupRunning) {
|
if (isManualBackupRunning) {
|
||||||
logger.verbose('Manual backup already in progress')
|
logger.verbose('Manual backup already in progress')
|
||||||
@ -917,7 +921,12 @@ export async function backupToLocal({
|
|||||||
|
|
||||||
store.dispatch(setLocalBackupSyncState({ syncing: true, lastSyncError: null }))
|
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 deviceType = 'unknown'
|
||||||
let hostname = 'unknown'
|
let hostname = 'unknown'
|
||||||
try {
|
try {
|
||||||
@ -1039,9 +1048,9 @@ export async function backupToLocal({
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function restoreFromLocal(fileName: string) {
|
export async function restoreFromLocal(fileName: string) {
|
||||||
const { localBackupDir } = store.getState().settings
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
const { localBackupDir: localBackupDirSetting } = store.getState().settings
|
||||||
|
const localBackupDir = await window.api.resolvePath(localBackupDirSetting)
|
||||||
const restoreData = await window.api.backup.restoreFromLocalBackup(fileName, localBackupDir)
|
const restoreData = await window.api.backup.restoreFromLocalBackup(fileName, localBackupDir)
|
||||||
const data = JSON.parse(restoreData)
|
const data = JSON.parse(restoreData)
|
||||||
await handleData(data)
|
await handleData(data)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user