From 866df0c49392c31f3dff563c4fa0a06694987489 Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Mon, 16 Sep 2024 20:56:10 +0200 Subject: [PATCH] feat: add folder picker when there is no valid selected #3473 --- electron/electronAPI.d.ts | 2 ++ electron/local-file-sync.ts | 14 +++++++++- electron/preload.ts | 2 ++ .../shared-with-frontend/ipc-events.const.ts | 4 ++- .../local-file-sync-electron.service.ts | 26 ++++++++++++++++--- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/electron/electronAPI.d.ts b/electron/electronAPI.d.ts index a5c776de9..ab870cdd2 100644 --- a/electron/electronAPI.d.ts +++ b/electron/electronAPI.d.ts @@ -40,6 +40,8 @@ export interface ElectronAPI { checkDirExists(args: { dirPath: string }): Promise; + pickDirectory(): Promise; + // checkDirExists(dirPath: string): Promise; // STANDARD diff --git a/electron/local-file-sync.ts b/electron/local-file-sync.ts index 9731565d0..b58423607 100644 --- a/electron/local-file-sync.ts +++ b/electron/local-file-sync.ts @@ -2,7 +2,8 @@ import { IPC } from './shared-with-frontend/ipc-events.const'; import { SyncGetRevResult } from '../src/app/imex/sync/sync.model'; import { readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; import { error, log } from 'electron-log/main'; -import { ipcMain } from 'electron'; +import { dialog, ipcMain } from 'electron'; +import { getWin } from './main-window'; export const initLocalFileSyncAdapter = (): void => { ipcMain.handle( @@ -112,6 +113,17 @@ export const initLocalFileSyncAdapter = (): void => { } }, ); + + ipcMain.handle(IPC.PICK_DIRECTORY, async (): Promise => { + const { canceled, filePaths } = await dialog.showOpenDialog(getWin(), { + properties: ['openDirectory'], + }); + if (canceled) { + return undefined; + } else { + return filePaths[0]; + } + }); }; const getRev = (filePath: string): string => { diff --git a/electron/preload.ts b/electron/preload.ts index bcffc1d91..bcc159df3 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -38,6 +38,8 @@ const ea: ElectronAPI = { checkDirExists: (dirPath) => _invoke('CHECK_DIR_EXISTS', dirPath) as Promise, + pickDirectory: () => _invoke('PICK_DIRECTORY') as Promise, + // STANDARD // -------- setZoomFactor: (zoomFactor: number) => { diff --git a/electron/shared-with-frontend/ipc-events.const.ts b/electron/shared-with-frontend/ipc-events.const.ts index e85890562..315f9466b 100644 --- a/electron/shared-with-frontend/ipc-events.const.ts +++ b/electron/shared-with-frontend/ipc-events.const.ts @@ -50,9 +50,11 @@ export enum IPC { FILE_SYNC_LOAD = 'FILE_SYNC_LOAD', FILE_SYNC_SAVE = 'FILE_SYNC_SAVE', - CHECK_DIR_EXISTS = 'CHECK_DIR_EXISTS', FILE_SYNC_GET_REV_AND_CLIENT_UPDATE = 'FILE_SYNC_GET_REV_AND_CLIENT_UPDATE', + CHECK_DIR_EXISTS = 'CHECK_DIR_EXISTS', + PICK_DIRECTORY = 'PICK_DIRECTORY', + ANY_FILE_DOWNLOADED = 'ANY_FILE_DOWNLOADED', FULL_SCREEN_BLOCKER = 'FULL_SCREEN_BLOCKER', diff --git a/src/app/imex/sync/local-file-sync/local-file-sync-electron.service.ts b/src/app/imex/sync/local-file-sync/local-file-sync-electron.service.ts index 09d3ac0a7..8dc3a30ff 100644 --- a/src/app/imex/sync/local-file-sync/local-file-sync-electron.service.ts +++ b/src/app/imex/sync/local-file-sync/local-file-sync-electron.service.ts @@ -40,9 +40,18 @@ export class LocalFileSyncElectronService implements SyncProviderServiceInterfac }; } catch (e) { const folderPath = await this._folderPathOnce$.toPromise(); - const isDirExists = await this._checkDirExists(folderPath as string); - if (!isDirExists) { - alert(`Directory ${folderPath} does not exist`); + try { + const isDirExists = await this._checkDirExists(folderPath as string); + if (!isDirExists) { + alert('No valid folder selected for local file sync. Please select one.'); + this._pickDirectory(); + throw new Error('No valid folder selected'); + } + } catch (err) { + console.error(err); + alert('No valid folder selected for local file sync. Please select one.'); + this._pickDirectory(); + throw new Error('No valid folder selected'); } if (e?.toString?.().includes('ENOENT')) { @@ -115,4 +124,15 @@ export class LocalFileSyncElectronService implements SyncProviderServiceInterfac } return r; } + + private async _pickDirectory(): Promise { + const dir = await window.ea.pickDirectory(); + if (dir) { + this._globalConfigService.updateSection('sync', { + localFileSync: { + syncFolderPath: dir, + }, + }); + } + } }