From 995101ebec8a347f18edc307a6eec8d29e17a544 Mon Sep 17 00:00:00 2001 From: Xymorot Date: Mon, 4 Jan 2021 22:11:14 +0100 Subject: [PATCH] refactor: extract dialog functionality of electron into a service so it can be developed centrally --- src/main/core/container.ts | 3 +++ src/main/modules/dialog/dialog.ts | 26 +++++++++++++++++++ src/main/modules/dialog/i-dialog.d.ts | 5 ++++ .../modules/nhentai/nhentai-ipc-controller.ts | 13 ++++++---- 4 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/main/modules/dialog/dialog.ts create mode 100644 src/main/modules/dialog/i-dialog.d.ts diff --git a/src/main/core/container.ts b/src/main/core/container.ts index af7cace..2e62300 100644 --- a/src/main/core/container.ts +++ b/src/main/core/container.ts @@ -1,6 +1,7 @@ import 'reflect-metadata'; import { Container, interfaces } from 'inversify'; import { MainAppWindow } from '../modules/app-window/main-app-window'; +import { Dialog } from '../modules/dialog/dialog'; import { I18nTranslator } from '../modules/i18n/i18n-translator'; import { Logger } from '../modules/logger/logger'; import { NhentaiApi } from '../modules/nhentai/nhentai-api'; @@ -27,6 +28,8 @@ container.bind('logger').to(Logger); container.bind('i18n-translator').to(I18nTranslator); +container.bind('dialog').to(Dialog); + container.bind('store').to(Store); container.bind('session-helper').to(SessionHelper); diff --git a/src/main/modules/dialog/dialog.ts b/src/main/modules/dialog/dialog.ts new file mode 100644 index 0000000..7158622 --- /dev/null +++ b/src/main/modules/dialog/dialog.ts @@ -0,0 +1,26 @@ +import { dialog, OpenDialogOptions } from 'electron'; +import { injectable } from 'inversify'; +import { inject } from '../../core/inject'; +import { II18nTranslator } from '../i18n/i-i18n-translator'; +import { IDialog } from './i-dialog'; + +@injectable() +export class Dialog implements IDialog { + private readonly translator: II18nTranslator; + + public constructor(@inject('i18n-translator') translator: II18nTranslator) { + this.translator = translator; + } + + public selectFolder(options: OpenDialogOptions): ReturnType { + return dialog.showOpenDialog({ + ...{ + title: this.translator.t('select a folder'), + }, + ...options, + ...{ + properties: ['openDirectory', 'showHiddenFiles'], + }, + }); + } +} diff --git a/src/main/modules/dialog/i-dialog.d.ts b/src/main/modules/dialog/i-dialog.d.ts new file mode 100644 index 0000000..53c73b2 --- /dev/null +++ b/src/main/modules/dialog/i-dialog.d.ts @@ -0,0 +1,5 @@ +import { dialog, OpenDialogOptions } from 'electron'; + +interface IDialog { + selectFolder(options: OpenDialogOptions): ReturnType; +} diff --git a/src/main/modules/nhentai/nhentai-ipc-controller.ts b/src/main/modules/nhentai/nhentai-ipc-controller.ts index 1fcd220..9f795d6 100644 --- a/src/main/modules/nhentai/nhentai-ipc-controller.ts +++ b/src/main/modules/nhentai/nhentai-ipc-controller.ts @@ -1,7 +1,7 @@ -import { dialog } from 'electron'; import path from 'path'; import { createWriteStream } from 'fs-extra'; import { container } from '../../core/container'; +import { IDialog } from '../dialog/i-dialog'; import { II18nTranslator } from '../i18n/i-i18n-translator'; import { answer } from '../ipc/annotations/answer'; import { INhentaiApi } from './i-nhentai-api'; @@ -12,15 +12,17 @@ export class NhentaiIpcController implements IIpcController { private readonly translator: II18nTranslator; - private constructor(nhentaiApi: INhentaiApi, translator: II18nTranslator) { + private readonly dialog: IDialog; + + private constructor(nhentaiApi: INhentaiApi, translator: II18nTranslator, dialog: IDialog) { this.nhentaiApi = nhentaiApi; this.translator = translator; + this.dialog = dialog; } @answer(IpcChannel.NHENTAI_SAVE_FAVORITES) public async nhentaiSaveFavorites(): Promise { - const result = await dialog.showOpenDialog({ - properties: ['openDirectory'], + const result = await this.dialog.selectFolder({ title: this.translator.t('Select torrent file save location'), }); @@ -39,6 +41,7 @@ export class NhentaiIpcController implements IIpcController { public get(): NhentaiIpcController { const nhentaiApi: INhentaiApi = container.get('nhentai-api'); const translator: II18nTranslator = container.get('i18n-translator'); - return new NhentaiIpcController(nhentaiApi, translator); + const dialog: IDialog = container.get('dialog'); + return new NhentaiIpcController(nhentaiApi, translator, dialog); } }