[bugfix] block mods grid if wineprefix is not yet setup

This commit is contained in:
silentrald
2025-02-08 11:05:07 +08:00
parent ff3d82238f
commit 6fc3fed6dd
7 changed files with 74 additions and 19 deletions
+4 -1
View File
@@ -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."
}
}
},
+7 -1
View File
@@ -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()));
})
@@ -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 {
@@ -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<void>;
@@ -42,6 +43,7 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
const os = useService(OsDiagnosticService);
const progress = useService(ProgressBarService);
const [gridStatus, setGridStatus] = useState(ModsGridStatus.OK);
const [modsAvailable, setModsAvailable] = useState(null as Map<BbmCategories, BbmFullMod[]>);
const [modsInstalled, setModsInstalled] = useState(null as Map<BbmCategories, BbmFullMod[]>);
const [modsSelected, setModsSelected] = useState([] as BbmFullMod[]);
@@ -185,8 +187,23 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
setModsSelected(() => []);
}
const getAcceptDisclaimerKey = async () => {
if (configService.get<boolean>(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<void> => {
if (os.isOffline) {
if (os.isOffline || gridStatus !== ModsGridStatus.OK) {
return Promise.resolve();
}
@@ -209,31 +226,26 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
return noop();
}
(async () => {
if (configService.get<boolean>(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<ModsSlideRef, Props>(({ version, isActive, o
if (!isOnline) {
return <ModStatus text="pages.version-viewer.mods.no-internet" image={BeatConflictImg} />;
}
if (gridStatus !== ModsGridStatus.OK) {
return <ModStatus text={gridStatus} image={BeatConflictImg} />;
}
if (!modsAvailable) {
return <ModStatus text="pages.version-viewer.mods.loading-mods" image={BeatWaitingImg} spin />;
}
@@ -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<ModsGridStatus> {
return lastValueFrom(this.ipcService.sendV2("bs-mods.get-mods-grid-status"))
.catch(error => {
logRenderError(error);
return ModsGridStatus.UNKNOWN;
});
}
}
+2
View File
@@ -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<T> = (data: Observable<T>) => 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<DownloadPlaylistProgressionData> };
+7
View File
@@ -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"
}