diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index bc52670e..c0dcb075 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -131,6 +131,9 @@ "loading-mods": "Loading mods...", "no-internet": "No internet", "mods-not-available": "No mods are available yet for this version of Beat Saber", + "status": { + "no-wineprefix": "Could not find BSManager WINEPREFIX path, please launch Beat Saber in BSManager first." + }, "buttons": { "more-infos": "More info", "install-or-update": "Install or update", @@ -589,7 +592,7 @@ "success": "All mods have been uninstalled.", "errors": { "no-mods": "No mods are installed in this version 😑", - "no-wineprefix": "Could not find BSManager WINEPREFIX path, please launch beat saber in BSManager first." + "no-wineprefix": "Could not find BSManager WINEPREFIX path, please launch Beat Saber in BSManager first." } } }, diff --git a/src/main/ipcs/bs-mods-ipcs.ts b/src/main/ipcs/bs-mods-ipcs.ts index 0792538a..627d541d 100644 --- a/src/main/ipcs/bs-mods-ipcs.ts +++ b/src/main/ipcs/bs-mods-ipcs.ts @@ -1,6 +1,6 @@ import { BsModsManagerService } from "../services/mods/bs-mods-manager.service"; import { IpcService } from "../services/ipc.service"; -import { from } from "rxjs"; +import { from, of } from "rxjs"; const ipc = IpcService.getInstance(); @@ -33,3 +33,9 @@ ipc.on("bs-mods.uninstall-all-mods", (args, reply) => { const modsManager = BsModsManagerService.getInstance(); reply(modsManager.uninstallAllMods(args)); }); + +ipc.on("bs-mods.get-mods-grid-status", (_, reply) => { + const modsManager = BsModsManagerService.getInstance(); + reply(of(modsManager.getModsGridStatus())); +}) + diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts index f127ecaf..95d66a0d 100644 --- a/src/main/services/mods/bs-mods-manager.service.ts +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -19,6 +19,7 @@ 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; @@ -564,6 +565,18 @@ 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 { diff --git a/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx b/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx index 97854b4d..9bb754b4 100644 --- a/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx +++ b/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx @@ -22,6 +22,7 @@ import { UninstallAllModsModal } from "renderer/components/modal/modal-types/uni import Tippy from "@tippyjs/react"; import { ProgressBarService } from "renderer/services/progress-bar.service"; import { Dropzone } from "renderer/components/shared/dropzone.component"; +import { ModsGridStatus } from "shared/models/mods/mod-ipc.model"; export type ModsSlideRef = { loadMods: () => Promise; @@ -42,6 +43,7 @@ export const ModsSlide = forwardRef(({ version, isActive, o const os = useService(OsDiagnosticService); const progress = useService(ProgressBarService); + const [gridStatus, setGridStatus] = useState(ModsGridStatus.OK); const [modsAvailable, setModsAvailable] = useState(null as Map); const [modsInstalled, setModsInstalled] = useState(null as Map); const [modsSelected, setModsSelected] = useState([] as BbmFullMod[]); @@ -185,8 +187,23 @@ export const ModsSlide = forwardRef(({ version, isActive, o setModsSelected(() => []); } + const getAcceptDisclaimerKey = async () => { + if (configService.get(ACCEPTED_DISCLAIMER_KEY)) { + return true; + } + + const res = await modals.openModal(ModsDisclaimerModal); + const haveAccepted = res.exitCode === ModalExitCode.COMPLETED; + + if (haveAccepted) { + configService.set(ACCEPTED_DISCLAIMER_KEY, true); + } + + return haveAccepted; + } + const loadMods = async (): Promise => { - if (os.isOffline) { + if (os.isOffline || gridStatus !== ModsGridStatus.OK) { return Promise.resolve(); } @@ -209,31 +226,26 @@ export const ModsSlide = forwardRef(({ version, isActive, o return noop(); } - (async () => { - if (configService.get(ACCEPTED_DISCLAIMER_KEY)) { - return true; + getAcceptDisclaimerKey() + .then(async (canLoad) => { + if (!canLoad) { + return onDisclamerDecline?.(); } - const res = await modals.openModal(ModsDisclaimerModal); - const haveAccepted = res.exitCode === ModalExitCode.COMPLETED; - - if (haveAccepted) { - configService.set(ACCEPTED_DISCLAIMER_KEY, true); + let status = ModsGridStatus.OK; + if (window.electron.platform === "linux") { + status = await modsManager.getModsGridStatus(); } + setGridStatus(status); - return haveAccepted; - })().then(canLoad => { - if (!canLoad) { - return onDisclamerDecline?.(); - } - - loadMods(); - }); + loadMods(); + }); return () => { setMoreInfoMod(null); setModsAvailable(null); setModsInstalled(null); + setGridStatus(ModsGridStatus.OK); }; }, [isActive, isOnline, version]); @@ -262,6 +274,9 @@ export const ModsSlide = forwardRef(({ version, isActive, o if (!isOnline) { return ; } + if (gridStatus !== ModsGridStatus.OK) { + return ; + } if (!modsAvailable) { return ; } diff --git a/src/renderer/services/bs-mods-manager.service.ts b/src/renderer/services/bs-mods-manager.service.ts index 1fe17e10..19ee418d 100644 --- a/src/renderer/services/bs-mods-manager.service.ts +++ b/src/renderer/services/bs-mods-manager.service.ts @@ -8,6 +8,7 @@ import { Progression } from "main/helpers/fs.helpers"; 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"; export class BsModsManagerService { private static instance: BsModsManagerService; @@ -204,4 +205,12 @@ export class BsModsManagerService { return { available: (available ?? []), installed: (installedMods ?? []) }; } + public async getModsGridStatus(): Promise { + return lastValueFrom(this.ipcService.sendV2("bs-mods.get-mods-grid-status")) + .catch(error => { + logRenderError(error); + return ModsGridStatus.UNKNOWN; + }); + } + } diff --git a/src/shared/models/ipc/ipc-routes.ts b/src/shared/models/ipc/ipc-routes.ts index 9337b337..70f2a6ba 100644 --- a/src/shared/models/ipc/ipc-routes.ts +++ b/src/shared/models/ipc/ipc-routes.ts @@ -21,6 +21,7 @@ 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 = (data: Observable) => void; @@ -88,6 +89,7 @@ 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 }; diff --git a/src/shared/models/mods/mod-ipc.model.ts b/src/shared/models/mods/mod-ipc.model.ts index f1c4613d..a35e3351 100644 --- a/src/shared/models/mods/mod-ipc.model.ts +++ b/src/shared/models/mods/mod-ipc.model.ts @@ -12,3 +12,10 @@ export interface UninstallModsResult { nbModsToUninstall: number; nbUninstalledMods: number; } + +export enum ModsGridStatus { + OK = "", + NO_WINEPREFIX = "pages.version-viewer.mods.status.no-wineprefix", + UNKNOWN = "misc.unknown" +} +