From cfde548150fbbd1096e8e7defd639ba3d197ea8e Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 21:57:09 +0200 Subject: [PATCH] [feature] we can open a modal to see available mods for a version --- .eslintrc.js | 1 + assets/jsons/bs-versions.json | 2 +- src/main/ipcs/bs-mods-ipcs.ts | 12 ++++-- .../services/mods/beat-mods-api.service.ts | 42 ++++++++----------- .../services/mods/bs-mods-manager.service.ts | 6 +-- .../available-version-item.component.tsx | 40 ++++++++++++++---- .../available-versions-slide.component.tsx | 15 +++++-- .../available-versions-slider.component.tsx | 5 ++- .../available-mods-modal.component.tsx | 19 +++++++++ .../svgs/icons/cpu-icon.component.tsx | 9 ++++ .../slides/mods/mod-item.component.tsx | 30 ++++++++++--- .../slides/mods/mods-grid.component.tsx | 36 +++++++++++++--- .../slides/mods/mods-slide.component.tsx | 15 ++----- .../services/bs-mods-manager.service.ts | 9 +++- .../thrird-partys/beat-mods.service.ts | 32 ++++++++++++++ src/shared/bs-version.interface.ts | 4 +- src/shared/models/ipc/ipc-routes.ts | 7 ++-- 17 files changed, 209 insertions(+), 75 deletions(-) create mode 100644 src/renderer/components/modal/modal-types/available-mods-modal.component.tsx create mode 100644 src/renderer/components/svgs/icons/cpu-icon.component.tsx create mode 100644 src/renderer/services/thrird-partys/beat-mods.service.ts diff --git a/.eslintrc.js b/.eslintrc.js index d0de28b5..ce838777 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -57,6 +57,7 @@ module.exports = { 'react/jsx-filename-extension': [2, { 'extensions': ['.js', '.jsx', '.ts', '.tsx'] }], "no-shadow": "off", "react/function-component-definition": "off", + "jsx-a11y/control-has-associated-label": "off", }, parserOptions: { ecmaVersion: 2020, diff --git a/assets/jsons/bs-versions.json b/assets/jsons/bs-versions.json index b6824e5b..27093c9a 100644 --- a/assets/jsons/bs-versions.json +++ b/assets/jsons/bs-versions.json @@ -736,4 +736,4 @@ "ReleaseDate": "1717513346", "year": "2024" } -] +] \ No newline at end of file diff --git a/src/main/ipcs/bs-mods-ipcs.ts b/src/main/ipcs/bs-mods-ipcs.ts index 7d580f04..75c79b56 100644 --- a/src/main/ipcs/bs-mods-ipcs.ts +++ b/src/main/ipcs/bs-mods-ipcs.ts @@ -1,12 +1,13 @@ import { BsModsManagerService } from "../services/mods/bs-mods-manager.service"; import { IpcService } from "../services/ipc.service"; import { from } from "rxjs"; +import { BeatModsApiService } from "main/services/mods/beat-mods-api.service"; const ipc = IpcService.getInstance(); -ipc.on("get-available-mods", (args, reply) => { - const modsManager = BsModsManagerService.getInstance(); - reply(from(modsManager.getAvailableMods(args))); +ipc.on("get-version-mods", (args, reply) => { + const beatMods = BeatModsApiService.getInstance(); + reply(from(beatMods.getVersionMods(args))); }); ipc.on("get-installed-mods", (args, reply) => { @@ -14,6 +15,11 @@ ipc.on("get-installed-mods", (args, reply) => { reply(from(modsManager.getInstalledMods(args))); }); +ipc.on("get-version-aliases", (_, reply) => { + const beatmods = BeatModsApiService.getInstance(); + reply(from(beatmods.getVersionAliases())); +}); + ipc.on("install-mods", (args, reply) => { const modsManager = BsModsManagerService.getInstance(); reply(from(modsManager.installMods(args.mods, args.version))); diff --git a/src/main/services/mods/beat-mods-api.service.ts b/src/main/services/mods/beat-mods-api.service.ts index 0bfeedee..b16999b8 100644 --- a/src/main/services/mods/beat-mods-api.service.ts +++ b/src/main/services/mods/beat-mods-api.service.ts @@ -1,4 +1,4 @@ -import { BSVersion } from "shared/bs-version.interface"; +import { BSVersion, BSVersionString } from "shared/bs-version.interface"; import { Mod } from "shared/models/mods/mod.interface"; import { RequestService } from "../request.service"; @@ -13,8 +13,8 @@ export class BeatModsApiService { private readonly BEAT_MODS_API_URL = "https://beatmods.com/api/v1/"; public readonly BEAT_MODS_URL = "https://beatmods.com"; - private readonly aliasesCache = new Map(); - private readonly versionModsCache = new Map(); + private aliasesCache: Record = {}; + private readonly versionModsCache = new Map(); private allModsCache: Mod[]; @@ -37,29 +37,21 @@ export class BeatModsApiService { return `${this.BEAT_MODS_API_URL}mod`; } - private async getVersionAlias(): Promise> { - if (this.aliasesCache.size) { + public async getVersionAliases(): Promise> { + if (Object.keys(this.aliasesCache).length > 0) { return this.aliasesCache; } - return this.requestService.getJSON>(this.BEAT_MODS_ALIAS).then(rawAliases => { - Object.entries(rawAliases).forEach(([key, value]) => { - this.aliasesCache.set( - key, - value.map(s => ({ BSVersion: s } as BSVersion)) - ); - }); + + return this.requestService.getJSON>(this.BEAT_MODS_ALIAS).then(rawAliases => { + this.aliasesCache = rawAliases; return this.aliasesCache; }); } - private async getAliasOfVersion(version: BSVersion): Promise { - return this.getVersionAlias().then(aliases => { - if (Array.from(aliases.keys()).some(k => k === version.BSVersion)) { - return version; - } - const alias = Array.from(aliases.entries()).find(([key, value]) => value.find(v => v.BSVersion === version.BSVersion))?.[0]; - return { BSVersion: alias } as BSVersion; - }); + private async getAliasOfVersion(version: BSVersionString): Promise { + return this.getVersionAliases().then(aliases => ( + aliases[version] ? version : Object.keys(aliases).find(k => aliases[k as BSVersionString].some(v => v === version)) as BSVersionString + )); } private asignDependencies(mod: Mod, mods: Mod[]): Mod { @@ -67,16 +59,16 @@ export class BeatModsApiService { return mod; } - public async getVersionMods(version: BSVersion): Promise { - if (this.versionModsCache.has(version.BSVersion)) { - return this.versionModsCache.get(version.BSVersion); + public async getVersionMods(version: BSVersionString): Promise { + if (this.versionModsCache.has(version)) { + return this.versionModsCache.get(version); } const alias = await this.getAliasOfVersion(version); - return this.requestService.getJSON(this.getVersionModsUrl(alias)).then(mods => { + return this.requestService.getJSON(this.getVersionModsUrl({ BSVersion: alias })).then(mods => { mods = mods.map(mod => this.asignDependencies(mod, mods)); - this.versionModsCache.set(version.BSVersion, mods); + this.versionModsCache.set(version, mods); return mods; }); } diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts index fb336d33..52ffc668 100644 --- a/src/main/services/mods/bs-mods-manager.service.ts +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -264,7 +264,7 @@ export class BsModsManagerService { } private async resolveDependencies(mods: Mod[], version: BSVersion): Promise { - const availableMods = await this.beatModsApi.getVersionMods(version); + const availableMods = await this.beatModsApi.getVersionMods(version.BSVersion); return Array.from( new Map( availableMods.reduce((res, mod) => { @@ -316,10 +316,6 @@ export class BsModsManagerService { await Promise.all(promises); } - public getAvailableMods(version: BSVersion): Promise { - return this.beatModsApi.getVersionMods(version); - } - public async getInstalledMods(version: BSVersion): Promise { this.manifestMatches = []; await this.beatModsApi.getAllMods(); diff --git a/src/renderer/components/available-versions/available-version-item.component.tsx b/src/renderer/components/available-versions/available-version-item.component.tsx index 605c054d..fe54dda9 100644 --- a/src/renderer/components/available-versions/available-version-item.component.tsx +++ b/src/renderer/components/available-versions/available-version-item.component.tsx @@ -1,4 +1,4 @@ -import { BSVersion } from "shared/bs-version.interface"; +import { BSVersion, BSVersionString } from "shared/bs-version.interface"; import { useState, memo, ComponentProps } from "react"; import defaultImage from "../../../../assets/images/default-version-img.jpg"; import dateFormat from "dateformat"; @@ -9,19 +9,33 @@ import { GlowEffect } from "../shared/glow-effect.component"; import equal from "fast-deep-equal"; import { SteamIcon } from "../svgs/icons/steam-icon.component"; import { useConstant } from "renderer/hooks/use-constant.hook"; +import { CpuIcon } from "../svgs/icons/cpu-icon.component"; +import Tippy from "@tippyjs/react"; +import { useService } from "renderer/hooks/use-service.hook"; +import { ModalService } from "renderer/services/modale.service"; +import { AvailableModsModal } from "../modal/modal-types/available-mods-modal.component"; type Props = { version: BSVersion; selected: boolean; + beatModsVersionAlias?: BSVersionString; onClick: ComponentProps<"li">["onClick"]; } -export const AvailableVersionItem = memo(function AvailableVersionItem({version, selected, onClick}: Props) { +export const AvailableVersionItem = memo(function AvailableVersionItem({version, selected, beatModsVersionAlias, onClick}: Props) { const t = useTranslation(); + + const modal = useService(ModalService); + const [hovered, setHovered] = useState(false); const formatedDate = useConstant(() => dateFormat(+version.ReleaseDate * 1000, "ddd. d mmm yyyy")); + const openAvailableMods = () => { + if(!beatModsVersionAlias) { return; } + modal.openModal(AvailableModsModal, beatModsVersionAlias); + }; + return ( setHovered(true)} onHoverEnd={() => setHovered(false)}> @@ -36,12 +50,22 @@ export const AvailableVersionItem = memo(function AvailableVersionItem({version,

{version.BSVersion}

{formatedDate} - {version.ReleaseURL && ( - - - {t("pages.available-versions.steam-release")} - - )} + +
+ {version.ReleaseURL && ( + + + {t("pages.available-versions.steam-release")} + + )} + {beatModsVersionAlias && ( + + + + )} +
diff --git a/src/renderer/components/available-versions/available-versions-slide.component.tsx b/src/renderer/components/available-versions/available-versions-slide.component.tsx index 89f9b3c4..a6186a83 100644 --- a/src/renderer/components/available-versions/available-versions-slide.component.tsx +++ b/src/renderer/components/available-versions/available-versions-slide.component.tsx @@ -1,14 +1,15 @@ import { useContext } from "react"; import { AvailableVersionItem } from "./available-version-item.component"; -import { BSVersion } from "shared/bs-version.interface"; +import { BSVersion, BSVersionString } from "shared/bs-version.interface"; import { AvailableVersionsContext } from "renderer/pages/available-versions-list.components"; import equal from "fast-deep-equal"; type Props = { - versions: BSVersion[] + versions: BSVersion[], + versionModAliases?: Record } -export function AvailableVersionsSlide({ versions }: Props) { +export function AvailableVersionsSlide({ versions, versionModAliases }: Props) { const context = useContext(AvailableVersionsContext); @@ -28,10 +29,16 @@ export function AvailableVersionsSlide({ versions }: Props) { return copy; } + const getVersionModAlias = (version: BSVersion): BSVersionString => { + if(!versionModAliases) { return; } + if(versionModAliases[version.BSVersion]) { return version.BSVersion; } + return Object.keys(versionModAliases).find(k => versionModAliases[k as BSVersionString].some(v => v === version.BSVersion)) as BSVersionString; + } + return (
    {getVersions().map(version => ( - setSelectedVersion(version)}/> + setSelectedVersion(version)} beatModsVersionAlias={getVersionModAlias(version)}/> ))}
); diff --git a/src/renderer/components/available-versions/available-versions-slider.component.tsx b/src/renderer/components/available-versions/available-versions-slider.component.tsx index 02f45b9f..dd3ab6bd 100644 --- a/src/renderer/components/available-versions/available-versions-slider.component.tsx +++ b/src/renderer/components/available-versions/available-versions-slider.component.tsx @@ -4,10 +4,13 @@ import { AvailableVersionsSlide } from "./available-versions-slide.component"; import { TabNavBar } from "../shared/tab-nav-bar.component"; import { useService } from "renderer/hooks/use-service.hook"; import { useObservable } from "renderer/hooks/use-observable.hook"; +import { BeatModsService } from "renderer/services/thrird-partys/beat-mods.service"; export function AvailableVersionsSlider() { const versionManagerService = useService(BSVersionManagerService); + const beatMods = useService(BeatModsService); + const versionModAliases = useObservable(() => beatMods.getVersionAliases(), undefined); const availableVersions = useObservable(() => versionManagerService.availableVersions$); const [yearIndex, setYearIndex] = useState(0); @@ -29,7 +32,7 @@ export function AvailableVersionsSlider() {
    {availableYears.map(year => ( - + ))}
diff --git a/src/renderer/components/modal/modal-types/available-mods-modal.component.tsx b/src/renderer/components/modal/modal-types/available-mods-modal.component.tsx new file mode 100644 index 00000000..719ac7dc --- /dev/null +++ b/src/renderer/components/modal/modal-types/available-mods-modal.component.tsx @@ -0,0 +1,19 @@ +import { ModsGrid, modsArrayToCategoryMap } from "renderer/components/version-viewer/slides/mods/mods-grid.component"; +import { useObservable } from "renderer/hooks/use-observable.hook"; +import { useService } from "renderer/hooks/use-service.hook" +import { ModalComponent } from "renderer/services/modale.service" +import { BeatModsService } from "renderer/services/thrird-partys/beat-mods.service"; +import { BSVersionString } from "shared/bs-version.interface" + +export const AvailableModsModal: ModalComponent = ({ data }) => { + + const beatMods = useService(BeatModsService); + + const availableMods = useObservable(() => beatMods.getVersionMods(data), undefined); + + return ( +
+ {availableMods && } +
+ ) +} diff --git a/src/renderer/components/svgs/icons/cpu-icon.component.tsx b/src/renderer/components/svgs/icons/cpu-icon.component.tsx new file mode 100644 index 00000000..9b906c52 --- /dev/null +++ b/src/renderer/components/svgs/icons/cpu-icon.component.tsx @@ -0,0 +1,9 @@ +import { createSvgIcon } from "../svg-icon.type" + +export const CpuIcon = createSvgIcon((props, ref) => { + return ( + + + + ) +}); diff --git a/src/renderer/components/version-viewer/slides/mods/mod-item.component.tsx b/src/renderer/components/version-viewer/slides/mods/mod-item.component.tsx index 56c24cd7..3b2f0148 100644 --- a/src/renderer/components/version-viewer/slides/mods/mod-item.component.tsx +++ b/src/renderer/components/version-viewer/slides/mods/mod-item.component.tsx @@ -10,9 +10,29 @@ import useDoubleClick from "use-double-click"; import { gt } from "semver"; import { useService } from "renderer/hooks/use-service.hook"; -type Props = { className?: string; mod: Mod; installedVersion: string; isDependency?: boolean; isSelected?: boolean; onChange?: (val: boolean) => void; wantInfo?: boolean; onWantInfo?: (mod: Mod) => void }; +type Props = { + className?: string; + mod: Mod; + installedVersion: string; + isDependency?: boolean; + isSelected?: boolean; + showInstalled?: boolean; + onChange?: (val: boolean) => void; + wantInfo?: boolean; + onWantInfo?: (mod: Mod) => void +}; -export function ModItem({ className, mod, installedVersion, isDependency, isSelected, onChange, wantInfo, onWantInfo }: Props) { +export function ModItem({ + className, + mod, + installedVersion, + isDependency, + isSelected, + showInstalled, + onChange, + wantInfo, + onWantInfo +}: Props) { const modsManager = useService(BsModsManagerService); const pageState = useService(PageStateService); @@ -48,14 +68,14 @@ export function ModItem({ className, mod, installedVersion, isDependency, isSele return (
  • - + {onChange && }
    {mod.name} - + {showInstalled !== false && {installedVersion || "-"} - + } {mod.version} diff --git a/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx b/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx index b4ed6e82..12eebefa 100644 --- a/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx +++ b/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx @@ -9,10 +9,25 @@ import { Mod } from "shared/models/mods/mod.interface"; import { ModItem } from "./mod-item.component"; import { useService } from "renderer/hooks/use-service.hook"; -type Props = { modsMap: Map; installed: Map; modsSelected: Mod[]; onModChange: (selected: boolean, mod: Mod) => void; moreInfoMod?: Mod; onWantInfos: (mod: Mod) => void }; +type Props = { + modsMap: Map; + installed?: Map; + showInstalled?: boolean; + modsSelected?: Mod[]; + onModChange?: (selected: boolean, mod: Mod) => void; + moreInfoMod?: Mod; + onWantInfos?: (mod: Mod) => void }; + +export function ModsGrid({ + modsMap, + installed, + modsSelected, + showInstalled, + onModChange, + moreInfoMod, + onWantInfos +}: Props) { -export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreInfoMod, onWantInfos }: Props) { - const pageState = useService(PageStateService); const modsManager = useService(BsModsManagerService); @@ -32,7 +47,7 @@ export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreIn }; const isDependency = (mod: Mod): boolean => { - return modsSelected.some(m => { + return !!modsSelected?.some(m => { const deps = m.dependencies.map(dep => Array.from(modsMap.values()) .flat() @@ -45,7 +60,7 @@ export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreIn }); }; - const isSelected = (mod: Mod): boolean => modsSelected.some(m => m.name === mod.name); + const isSelected = (mod: Mod): boolean => !!modsSelected?.some(m => m.name === mod.name); const handleInput = (val: string) => setFilter(val.toLowerCase()); @@ -66,7 +81,7 @@ export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreIn {filterEnabled ? handleInput(e.target.value)} /> : {t("pages.version-viewer.mods.mods-grid.header-bar.name")}} - {t("pages.version-viewer.mods.mods-grid.header-bar.installed")} + {showInstalled !== false && {t("pages.version-viewer.mods.mods-grid.header-bar.installed")}} {t("pages.version-viewer.mods.mods-grid.header-bar.latest")} {t("pages.version-viewer.mods.mods-grid.header-bar.description")} @@ -86,3 +101,12 @@ export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreIn ) ); } + +export function modsArrayToCategoryMap(mods: Mod[]): Map { + if (!mods) { + return new Map(); + } + const map = new Map(); + mods.forEach(mod => map.set(mod.category, [...(map.get(mod.category) ?? []), mod])); + return map; +}; 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 4e3d97f6..7fe6efbc 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 @@ -2,7 +2,7 @@ import { useEffect, useLayoutEffect, useRef, useState } from "react"; import { BsModsManagerService } from "renderer/services/bs-mods-manager.service"; import { BSVersion } from "shared/bs-version.interface"; import { Mod } from "shared/models/mods/mod.interface"; -import { ModsGrid } from "./mods-grid.component"; +import { ModsGrid, modsArrayToCategoryMap } from "./mods-grid.component"; import { ConfigurationService } from "renderer/services/configuration.service"; import { DefaultConfigKey } from "renderer/config/default-configuration.config"; import { BsmButton } from "renderer/components/shared/bsm-button.component"; @@ -41,15 +41,6 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; const downloadRef = useRef(null); const [downloadWith, setDownloadWidth] = useState(0); - const modsToCategoryMap = (mods: Mod[]): Map => { - if (!mods) { - return new Map(); - } - const map = new Map(); - mods.forEach(mod => map.set(mod.category, [...(map.get(mod.category) ?? []), mod])); - return map; - }; - const handleModChange = (selected: boolean, mod: Mod) => { if (selected) { return setModsSelected([...modsSelected, mod]); @@ -110,9 +101,9 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; modsManager.getInstalledMods(version) ]).pipe(map(([available, installed]) => { const defaultMods = configService.get("default_mods" as DefaultConfigKey); - setModsAvailable(() => modsToCategoryMap(available)); + setModsAvailable(() => modsArrayToCategoryMap(available)); setModsSelected(() => available.filter(m => m.required || defaultMods.some(d => m.name.toLowerCase() === d.toLowerCase()) || installed.some(i => m.name === i.name))); - setModsInstalled(() => modsToCategoryMap(installed)); + setModsInstalled(() => modsArrayToCategoryMap(installed)); })); }; diff --git a/src/renderer/services/bs-mods-manager.service.ts b/src/renderer/services/bs-mods-manager.service.ts index e390e94b..e9aac1a8 100644 --- a/src/renderer/services/bs-mods-manager.service.ts +++ b/src/renderer/services/bs-mods-manager.service.ts @@ -11,6 +11,7 @@ import { NotificationType } from "../../shared/models/notification/notification. import { OsDiagnosticService } from "./os-diagnostic.service"; import { ProgressBarService } from "./progress-bar.service"; import { NotificationService } from "./notification.service"; +import { BeatModsService } from "./thrird-partys/beat-mods.service"; export class BsModsManagerService { private static instance: BsModsManagerService; @@ -22,6 +23,7 @@ export class BsModsManagerService { private readonly modals: ModalService; private readonly notifications: NotificationService; private readonly os: OsDiagnosticService; + private readonly beatMods: BeatModsService; public readonly isInstalling$: BehaviorSubject = new BehaviorSubject(false); public readonly isUninstalling$: BehaviorSubject = new BehaviorSubject(false); @@ -39,10 +41,11 @@ export class BsModsManagerService { this.modals = ModalService.getInstance(); this.notifications = NotificationService.getInstance(); this.os = OsDiagnosticService.getInstance(); + this.beatMods = BeatModsService.getInstance(); } public getAvailableMods(version: BSVersion): Observable { - return this.ipcService.sendV2("get-available-mods", version); + return this.beatMods.getVersionMods(version.BSVersion); } public getInstalledMods(version: BSVersion): Observable { @@ -136,4 +139,8 @@ export class BsModsManagerService { this.progressBar.hide(); }) } + + public getVersionAliases(): Observable> { + return this.ipcService.sendV2("get-version-aliases"); + } } diff --git a/src/renderer/services/thrird-partys/beat-mods.service.ts b/src/renderer/services/thrird-partys/beat-mods.service.ts new file mode 100644 index 00000000..1ce9900e --- /dev/null +++ b/src/renderer/services/thrird-partys/beat-mods.service.ts @@ -0,0 +1,32 @@ +import { Observable } from "rxjs"; +import { IpcService } from "../ipc.service"; +import { BSVersionString } from "shared/bs-version.interface"; +import { Mod } from "shared/models/mods"; + +export class BeatModsService { + + private static instance: BeatModsService; + + public static getInstance(): BeatModsService { + if (!BeatModsService.instance) { + BeatModsService.instance = new BeatModsService(); + } + return BeatModsService.instance; + } + + private readonly ipcService: IpcService; + + private constructor() { + this.ipcService = IpcService.getInstance(); + } + + public getVersionAliases(): Observable> { + return this.ipcService.sendV2("get-version-aliases"); + } + + public getVersionMods(version: BSVersionString): Observable { + return this.ipcService.sendV2("get-version-mods", version); + } + + +} diff --git a/src/shared/bs-version.interface.ts b/src/shared/bs-version.interface.ts index 4bd6edd3..e681519c 100644 --- a/src/shared/bs-version.interface.ts +++ b/src/shared/bs-version.interface.ts @@ -1,7 +1,9 @@ import { BsStore } from "./models/bs-store.enum"; +export type BSVersionString = `${number}.${number}.${string}`; // 1.1.0p1 + export interface PartialBSVersion { - BSVersion: string, + BSVersion: BSVersionString, name?: string ino?: number, } diff --git a/src/shared/models/ipc/ipc-routes.ts b/src/shared/models/ipc/ipc-routes.ts index 0844fff2..9d2df475 100644 --- a/src/shared/models/ipc/ipc-routes.ts +++ b/src/shared/models/ipc/ipc-routes.ts @@ -1,6 +1,6 @@ import { Progression } from "main/helpers/fs.helpers"; import { Observable } from "rxjs"; -import { BSVersion } from "shared/bs-version.interface"; +import { BSVersion, BSVersionString } from "shared/bs-version.interface"; import { BSLaunchEventData, LaunchOption } from "shared/models/bs-launch"; import { BsvMapDetail } from "shared/models/maps"; import { BsmLocalMap, BsmLocalMapsProgress, DeleteMapsProgress } from "shared/models/maps/bsm-local-map.interface"; @@ -21,7 +21,7 @@ import { AppWindow } from "../window-manager/app-window.model"; export type IpcReplier = (data: Observable) => void; -export interface IpcChannelMapping extends Record { +export interface IpcChannelMapping { /* ** bs-download-ipcs ** */ "import-version": { request: ImportVersionOptions, response: Progression}; @@ -67,8 +67,9 @@ export interface IpcChannelMapping extends Record }; /* ** bs-mods-ipcs ** */ - "get-available-mods": { request: BSVersion, response: Mod[] }; + "get-version-mods": { request: BSVersionString, response: Mod[] }; "get-installed-mods": { request: BSVersion, response: Mod[] }; + "get-version-aliases": { request: void, response: Record } "install-mods": { request: { mods: Mod[]; version: BSVersion }, response: InstallModsResult }; "uninstall-mods": { request: { mods: Mod[]; version: BSVersion }, response: UninstallModsResult }; "uninstall-all-mods": { request: BSVersion, response: UninstallModsResult };