mirror of
https://github.com/Zagrios/bs-manager.git
synced 2026-07-03 14:08:25 +02:00
[bugfix] block mods grid if wineprefix is not yet setup
This commit is contained in:
@@ -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."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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> };
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user