Backend should be as frontend-agnostic as possible

This commit is contained in:
Zagrios
2025-02-10 22:37:32 +01:00
parent a54809ffb5
commit 41628d4e6e
7 changed files with 55 additions and 39 deletions
+1 -6
View File
@@ -1,6 +1,6 @@
import { BsModsManagerService } from "../services/mods/bs-mods-manager.service";
import { IpcService } from "../services/ipc.service";
import { from, of } from "rxjs";
import { from } from "rxjs";
const ipc = IpcService.getInstance();
@@ -34,8 +34,3 @@ ipc.on("bs-mods.uninstall-all-mods", (args, reply) => {
reply(modsManager.uninstallAllMods(args));
});
ipc.on("bs-mods.get-mods-grid-status", (_, reply) => {
const modsManager = BsModsManagerService.getInstance();
reply(of(modsManager.getModsGridStatus()));
})
+5
View File
@@ -9,3 +9,8 @@ ipc.on("linux.verify-proton-folder", (_, reply) => {
reply(of(linuxService.verifyProtonPath()));
});
ipc.on("linux.get-wine-prefix-path", (_, reply) => {
const linuxService = LinuxService.getInstance();
reply(of(linuxService.getWinePrefixPath()));
});
@@ -19,7 +19,6 @@ import crypto from "crypto";
import { BsmZipExtractor } from "main/models/bsm-zip-extractor.class";
import { BsmShellLog, bsmSpawn } from "main/helpers/os.helpers";
import { BbmFullMod, BbmModVersion, ExternalMod } from "../../../shared/models/mods/mod.interface";
import { ModsGridStatus } from "shared/models/mods/mod-ipc.model";
export class BsModsManagerService {
private static instance: BsModsManagerService;
@@ -565,18 +564,6 @@ export class BsModsManagerService {
.finally(() => obs.complete());
});
}
public getModsGridStatus(): ModsGridStatus {
if (process.platform === "linux") {
const wineprefix = this.linuxService.getWinePrefixPath();
if (!wineprefix) {
log.error("Could not find BSManager WINEPREFIX path");
return ModsGridStatus.NO_WINEPREFIX;
}
}
return ModsGridStatus.OK;
}
}
const enum ModsInstallFolder {
@@ -226,20 +226,16 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
return noop();
}
getAcceptDisclaimerKey()
.then(async (canLoad) => {
if (!canLoad) {
return onDisclamerDecline?.();
}
getAcceptDisclaimerKey().then(async canLoad => {
if (!canLoad) {
return onDisclamerDecline?.();
}
let status = ModsGridStatus.OK;
if (window.electron.platform === "linux") {
status = await modsManager.getModsGridStatus();
}
setGridStatus(status);
const status = await modsManager.getModsGridStatus();
setGridStatus(() => status);
loadMods();
});
loadMods();
});
return () => {
setMoreInfoMod(null);
@@ -352,7 +348,7 @@ function ModStatus({ text, image, spin = false, children }: { text: string; imag
return (
<div className="w-full h-full flex flex-col items-center justify-center text-gray-800 dark:text-gray-200">
<img className={`w-32 h-32 ${spin ? "spin-loading" : ""}`} src={image} alt=" " />
<span className="text-xl mt-3 italic">{t(text)}</span>
<span className="text-xl mt-3 italic text-center">{t(text)}</span>
{children}
</div>
);
@@ -9,6 +9,7 @@ import { ProgressionInterface } from "shared/models/progress-bar";
import { BbmFullMod, BbmModVersion } from "shared/models/mods/mod.interface";
import { logRenderError } from "renderer";
import { ModsGridStatus } from "shared/models/mods/mod-ipc.model";
import { LinuxService } from "./linux.service";
export class BsModsManagerService {
private static instance: BsModsManagerService;
@@ -18,6 +19,7 @@ export class BsModsManagerService {
private readonly ipcService: IpcService;
private readonly progressBar: ProgressBarService;
private readonly notifications: NotificationService;
private readonly linux: LinuxService
public readonly isUninstalling$: BehaviorSubject<boolean> = new BehaviorSubject(false);
@@ -32,6 +34,7 @@ export class BsModsManagerService {
this.ipcService = IpcService.getInstance();
this.progressBar = ProgressBarService.getInstance();
this.notifications = NotificationService.getInstance();
this.linux = LinuxService.getInstance();
}
public getAvailableMods(version: BSVersion): Observable<BbmFullMod[]> {
@@ -206,11 +209,16 @@ export class BsModsManagerService {
}
public async getModsGridStatus(): Promise<ModsGridStatus> {
return lastValueFrom(this.ipcService.sendV2("bs-mods.get-mods-grid-status"))
.catch(error => {
logRenderError(error);
return ModsGridStatus.UNKNOWN;
});
if(window.electron.platform === "linux"){
const winePrefix = await lastValueFrom(this.linux.getWinePrefixPath());
if(!winePrefix){
logRenderError("Could not find BSManager WINEPREFIX path");
return ModsGridStatus.NO_WINEPREFIX;
}
}
return ModsGridStatus.OK;
}
}
+26
View File
@@ -0,0 +1,26 @@
import { Observable } from "rxjs";
import { IpcService } from "./ipc.service";
export class LinuxService {
private static instance: LinuxService;
public static getInstance(): LinuxService {
if (!LinuxService.instance) {
LinuxService.instance = new LinuxService();
}
return LinuxService.instance;
}
private readonly ipc: IpcService;
private constructor() {
this.ipc = IpcService.getInstance();
}
public getWinePrefixPath(): Observable<string> {
return this.ipc.sendV2("linux.get-wine-prefix-path");
}
}
+1 -2
View File
@@ -21,7 +21,6 @@ import { LocalBPList, LocalBPListsDetails } from "../playlists/local-playlist.mo
import { StaticConfigGetIpcRequestResponse, StaticConfigKeys, StaticConfigSetIpcRequest } from "main/services/static-configuration.service";
import { BbmFullMod, BbmModVersion, ExternalMod } from "../mods/mod.interface";
import { OculusDownloadInfo } from "main/services/bs-version-download/bs-oculus-downloader.service";
import { ModsGridStatus } from "../mods/mod-ipc.model";
export type IpcReplier<T> = (data: Observable<T>) => void;
@@ -89,7 +88,6 @@ export interface IpcChannelMapping {
"bs-mods.install-mods": { request: { mods: BbmFullMod[]; version: BSVersion }, response: Progression };
"bs-mods.uninstall-mods": { request: { mods: BbmFullMod[]; version: BSVersion }, response: Progression };
"bs-mods.uninstall-all-mods": { request: BSVersion, response: Progression };
"bs-mods.get-mods-grid-status": { request: BSVersion, response: ModsGridStatus };
/* ** bs-playlist-ipcs ** */
"one-click-install-playlist": { request: string, response: Progression<DownloadPlaylistProgressionData> };
@@ -161,6 +159,7 @@ export interface IpcChannelMapping {
/* ** linux.ipcs ** */
"linux.verify-proton-folder": { request: void, response: boolean };
"linux.get-wine-prefix-path": { request: void, response: string };
/* ** oculus.ipcs ** */
"is-oculus-sideloaded-apps-enabled": { request: void, response: boolean };