From c674fce0c0eab3c2a087a66bb73ef485977e8dbc Mon Sep 17 00:00:00 2001 From: MathieuG-P Date: Sun, 25 Dec 2022 01:04:36 +0100 Subject: [PATCH] advancement on onclick install model AND fix circual dependency --- src/main/ipcs/bs-model-ipcs.ts | 16 ++++++++ src/main/main.ts | 3 -- .../local-models-manager.service.ts | 12 ++++++ src/main/services/window-manager.service.ts | 6 ++- .../components/shared/bsm-image.component.tsx | 2 +- .../services/model-downloader.service.ts | 39 +++++++++++++++++++ .../OneClick/OneClickDownloadModel.tsx | 23 ++++++++++- 7 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 src/main/ipcs/bs-model-ipcs.ts create mode 100644 src/renderer/services/model-downloader.service.ts diff --git a/src/main/ipcs/bs-model-ipcs.ts b/src/main/ipcs/bs-model-ipcs.ts new file mode 100644 index 00000000..e1f08aec --- /dev/null +++ b/src/main/ipcs/bs-model-ipcs.ts @@ -0,0 +1,16 @@ +import { ipcMain } from "electron"; +import { UtilsService } from "../services/utils.service"; +import { IpcRequest } from "shared/models/ipc"; +import { MSModel } from "shared/models/model-saber/model-saber.model"; +import { LocalModelsManagerService } from "../services/additional-content/local-models-manager.service"; + +ipcMain.on("one-click-install-model", async (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const models = LocalModelsManagerService.getInstance(); + + models.oneClickDownloadModel(request.args).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(e => { + utils.ipcSend(request.responceChannel, {success: false, error: e}); + }) +}); \ No newline at end of file diff --git a/src/main/main.ts b/src/main/main.ts index eff82c52..5fd5c7f7 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -18,11 +18,8 @@ import { DeepLinkService } from './services/deep-link.service'; import { AppWindow } from 'shared/models/window-manager/app-window.model'; import { LocalMapsManagerService } from './services/additional-content/local-maps-manager.service'; import { LocalPlaylistsManagerService } from './services/additional-content/local-playlists-manager.service'; -import { ModelSaberService } from './services/thrid-party/model-saber/model-saber.service'; import { LocalModelsManagerService } from './services/additional-content/local-models-manager.service'; -export const PRELOAD_PATH = app.isPackaged ? path.join(__dirname, 'preload.js') : path.join(__dirname, '../../.erb/dll/preload.js') - const isDebug = process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; log.transports.file.level = 'info'; diff --git a/src/main/services/additional-content/local-models-manager.service.ts b/src/main/services/additional-content/local-models-manager.service.ts index 509407d7..a5838708 100644 --- a/src/main/services/additional-content/local-models-manager.service.ts +++ b/src/main/services/additional-content/local-models-manager.service.ts @@ -4,6 +4,8 @@ import { ipcMain } from "electron"; import { IpcRequest } from "shared/models/ipc"; import { UtilsService } from "../utils.service"; import { WindowManagerService } from "../window-manager.service"; +import { MSModel, MSModelType } from "shared/models/model-saber/model-saber.model"; +import { BSVersion } from "shared/bs-version.interface"; export class LocalModelsManagerService { @@ -49,6 +51,16 @@ export class LocalModelsManagerService { } + private getModelFolderPath(type: MSModelType, version?: BSVersion): Promise{ + // TODO : return path of model type of version + } + public downloadModel(model: MSModel, version: BSVersion): Promise{ + // TODO : Download model to the version + } + + public async oneClickDownloadModel(model: MSModel): Promise{ + + } } \ No newline at end of file diff --git a/src/main/services/window-manager.service.ts b/src/main/services/window-manager.service.ts index 909dd516..1019a8c1 100644 --- a/src/main/services/window-manager.service.ts +++ b/src/main/services/window-manager.service.ts @@ -2,12 +2,14 @@ import { app, BrowserWindow, BrowserWindowConstructorOptions } from "electron"; import { resolveHtmlPath } from "../util"; import { UtilsService } from "./utils.service"; import { AppWindow } from "shared/models/window-manager/app-window.model"; -import { PRELOAD_PATH } from "../main"; +import path from "path"; export class WindowManagerService{ private static instance: WindowManagerService; + private readonly PRELOAD_PATH = app.isPackaged ? path.join(__dirname, 'preload.js') : path.join(__dirname, '../../../.erb/dll/preload.js') + private readonly utilsService: UtilsService = UtilsService.getInstance(); private readonly appWindowsOptions: Record = { @@ -23,7 +25,7 @@ export class WindowManagerService{ show: false, frame: false, titleBarOverlay: false, - webPreferences: { preload: PRELOAD_PATH, webSecurity: false } + webPreferences: { preload: this.PRELOAD_PATH, webSecurity: false } } private readonly windows: Map = new Map(); diff --git a/src/renderer/components/shared/bsm-image.component.tsx b/src/renderer/components/shared/bsm-image.component.tsx index d387420c..c586f72b 100644 --- a/src/renderer/components/shared/bsm-image.component.tsx +++ b/src/renderer/components/shared/bsm-image.component.tsx @@ -15,7 +15,7 @@ export const BsmImage = forwardRef(({className, image, errorImage, placeholder, const [isLoaded, setIsLoaded] = useState(false); - image = image ? image : (placeholder||errorImage); + image = image || (placeholder||errorImage); const styles: CSSProperties = (() => { return { diff --git a/src/renderer/services/model-downloader.service.ts b/src/renderer/services/model-downloader.service.ts new file mode 100644 index 00000000..d4827eb3 --- /dev/null +++ b/src/renderer/services/model-downloader.service.ts @@ -0,0 +1,39 @@ +import { timer } from "rxjs"; +import { MSModel } from "shared/models/model-saber/model-saber.model"; +import { IpcService } from "./ipc.service"; +import { ProgressBarService } from "./progress-bar.service"; + +export class ModelDownloaderService { + + private static instance: ModelDownloaderService; + + public static getInstance(): ModelDownloaderService{ + if(!ModelDownloaderService.instance){ ModelDownloaderService.instance = new ModelDownloaderService(); } + return ModelDownloaderService.instance; + } + + private readonly ipc: IpcService; + private readonly progress: ProgressBarService; + + private constructor(){ + this.ipc = IpcService.getInstance(); + this.progress = ProgressBarService.getInstance(); + } + + + public async oneClickInstallModel(model: MSModel): Promise{ + + this.progress.showFake(0.07); + + const res = await this.ipc.send("one-click-install-model", {args: model}); + + this.progress.complete(); + await timer(500).toPromise(); + this.progress.hide(true); + + return res.success; + + } + + +} \ No newline at end of file diff --git a/src/renderer/windows/OneClick/OneClickDownloadModel.tsx b/src/renderer/windows/OneClick/OneClickDownloadModel.tsx index 2ed4ee47..6ed3be5c 100644 --- a/src/renderer/windows/OneClick/OneClickDownloadModel.tsx +++ b/src/renderer/windows/OneClick/OneClickDownloadModel.tsx @@ -1,17 +1,26 @@ import { useEffect, useState } from "react"; +import { BsmProgressBar } from "renderer/components/progress-bar/bsm-progress-bar.component"; +import { BsmImage } from "renderer/components/shared/bsm-image.component"; +import TitleBar from "renderer/components/title-bar/title-bar.component"; import { IpcService } from "renderer/services/ipc.service"; +import { ProgressBarService } from "renderer/services/progress-bar.service"; import { ThemeService } from "renderer/services/theme.service"; import { ModelSaberService } from "renderer/services/thrird-partys/model-saber.service"; import { MSModel } from "shared/models/model-saber/model-saber.model"; +import defaultImage from '../../../../assets/images/default-version-img.jpg' export default function OneClickDownloadModel() { const ipc = IpcService.getInstance(); const themeService = ThemeService.getInstance(); const modelSaber = ModelSaberService.getInstance(); + const progress = ProgressBarService.getInstance(); const [model, setModel] = useState(null); + const cover = model ? model.thumbnail : null; + const title = model ? model.name : null; + useEffect(() => { const sub = themeService.theme$.subscribe(() => { @@ -29,10 +38,14 @@ export default function OneClickDownloadModel() { setModel(() => model); + progress.open(); + // Download model }); + promise.finally(() => console.log("close")); + return () => { sub.unsubscribe(); } @@ -40,6 +53,14 @@ export default function OneClickDownloadModel() { return ( -
OneClickDownloadModel
+
+ {cover && } +
+ + +

{title}

+
+ +
) }