From 152313289c996fd81abc747f3f1023d1e917f4e4 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sun, 28 Jul 2024 21:40:09 +0200 Subject: [PATCH] [qol] install only mods not already installed (not finished) --- .../services/mods/bs-mods-manager.service.ts | 5 +- .../shared/bsm-button.component.tsx | 11 ++-- .../slides/mods/mod-item.component.tsx | 17 ++++--- .../slides/mods/mods-grid.component.tsx | 10 ++-- .../slides/mods/mods-slide.component.tsx | 50 +++++++++++-------- 5 files changed, 51 insertions(+), 42 deletions(-) diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts index 057247fd..9d900648 100644 --- a/src/main/services/mods/bs-mods-manager.service.ts +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -346,15 +346,12 @@ export class BsModsManagerService { throw CustomError.fromError(new Error("No mods to install"), "no-mods"); } - const deps = await this.resolveDependencies(mods, version); - mods.push(...deps); - const bsipa = mods.find(mod => mod.name.toLowerCase() === "bsipa"); if (bsipa) { mods = mods.filter(mod => mod.name.toLowerCase() !== "bsipa"); } - this.nbModsToInstall = mods.length + (bsipa && 1); + this.nbModsToInstall = mods.length + (bsipa ? 1 : 0); this.nbInstalledMods = 0; if (bsipa) { diff --git a/src/renderer/components/shared/bsm-button.component.tsx b/src/renderer/components/shared/bsm-button.component.tsx index f89e7b26..485f569d 100644 --- a/src/renderer/components/shared/bsm-button.component.tsx +++ b/src/renderer/components/shared/bsm-button.component.tsx @@ -11,6 +11,7 @@ export type BsmButtonType = "primary" | "secondary" | "success" | "cancel" | "er type Props = { className?: string; style?: CSSProperties; + iconStyle?: CSSProperties; imgClassName?: string; iconClassName?: string; icon?: BsmIconType; @@ -29,7 +30,7 @@ type Props = { textClassName?: string; }; -export const BsmButton = forwardRef(({ className, style, imgClassName, iconClassName, icon, image, text, type, active, withBar = true, disabled, onClickOutside, onClick, typeColor, color, title, iconColor, textClassName }, forwardedRef) => { +export const BsmButton = forwardRef(({ className, style, iconStyle, imgClassName, iconClassName, icon, image, text, type, active, withBar = true, disabled, onClickOutside, onClick, typeColor, color, title, iconColor, textClassName }, forwardedRef) => { const t = useTranslation(); const { firstColor, secondColor } = useThemeColor(); const ref = useRef(null); @@ -86,10 +87,10 @@ export const BsmButton = forwardRef(({ className, style, imgClas return (
{image && } - {icon && } + {icon && } {text && (type === "submit" ? ( - ) : ( @@ -99,8 +100,8 @@ export const BsmButton = forwardRef(({ className, style, imgClas ))} {withBar && (
-
-
+
+
)}
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 f6d7da4c..806efea7 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 @@ -1,7 +1,7 @@ import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component"; import { Mod } from "shared/models/mods/mod.interface"; -import { CSSProperties, MouseEvent, useRef } from "react"; +import { CSSProperties, MouseEvent, useMemo, useRef } from "react"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { BsModsManagerService } from "renderer/services/bs-mods-manager.service"; import { useObservable } from "renderer/hooks/use-observable.hook"; @@ -9,6 +9,7 @@ import { PageStateService } from "renderer/services/page-state.service"; import useDoubleClick from "use-double-click"; import { gt } from "semver"; import { useService } from "renderer/hooks/use-service.hook"; +import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; type Props = { className?: string; mod: Mod; installedVersion: string; isDependency?: boolean; isSelected?: boolean; onChange?: (val: boolean) => void; wantInfo?: boolean; onWantInfo?: (mod: Mod) => void }; @@ -20,6 +21,8 @@ export function ModItem({ className, mod, installedVersion, isDependency, isSele const uninstalling = useObservable(() => modsManager.isUninstalling$); const clickRef = useRef(); + const isChecked = useMemo(() => isDependency || isSelected || mod.required, [isDependency, isSelected, mod.required]); + useDoubleClick({ onSingleClick: e => handleWantInfo(e), onDoubleClick: e => handleOnChange(e), @@ -27,6 +30,10 @@ export function ModItem({ className, mod, installedVersion, isDependency, isSele latency: 175, }); + useOnUpdate(() => { + onChange(isChecked); + }, [isChecked]); + const wantInfoStyle: CSSProperties = wantInfo ? { borderColor: themeColor } : { borderColor: "transparent" }; const isOutDated = installedVersion ? gt(mod.version, installedVersion) : false; @@ -34,21 +41,19 @@ export function ModItem({ className, mod, installedVersion, isDependency, isSele modsManager.uninstallMod(mod, pageState.getState()); }; - const handleWantInfo = (e: MouseEvent) => { + const handleWantInfo = (e: MouseEvent) => { e.preventDefault(); onWantInfo(mod); }; - const handleOnChange = (e: MouseEvent) => { + const handleOnChange = (e: MouseEvent) => { e.preventDefault(); onChange(!isChecked); }; - const isChecked = isDependency || isSelected || mod.required; - return (
  • - + onChange(!isChecked)} disabled={mod.required || isDependency} checked={isChecked} />
    {mod.name} 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 206941f8..d45414f3 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 @@ -24,7 +24,7 @@ export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreIn if (!installed?.get(key)) { return undefined; } - const installedMod = installed.get(key).find(m => m.name === mod.name); + const installedMod = installed.get(key).find(m => m._id === mod._id); if (!installedMod) { return undefined; } @@ -36,16 +36,16 @@ export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreIn const deps = m.dependencies.map(dep => Array.from(modsMap.values()) .flat() - .find(m => dep.name === m.name) + .find(m => dep._id === m._id) ); - if (deps.some(depMod => depMod.name === mod.name)) { + if (deps.some(depMod => depMod._id === mod._id)) { return true; } - return deps.some(depMod => depMod.dependencies.some(depModDep => depModDep.name === mod.name)); + return deps.some(depMod => depMod.dependencies.some(depModDep => depModDep._id === mod._id)); }); }; - const isSelected = (mod: Mod): boolean => modsSelected.some(m => m.name === mod.name); + const isSelected = (mod: Mod): boolean => modsSelected.some(m => m._id === mod._id); const handleInput = (val: string) => setFilter(val.toLowerCase()); 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 29ef4d3a..bf9050d4 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 @@ -19,12 +19,14 @@ import { ModsDisclaimerModal } from "renderer/components/modal/modal-types/mods- import { OsDiagnosticService } from "renderer/services/os-diagnostic.service"; import { lt } from "semver"; import { useService } from "renderer/hooks/use-service.hook"; +import { NotificationService } from "renderer/services/notification.service"; export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; onDisclamerDecline: () => void }) { const ACCEPTED_DISCLAIMER_KEY = "accepted-mods-disclaimer"; const modsManager = useService(BsModsManagerService); const configService = useService(ConfigurationService); + const notification = useService(NotificationService); const linkOpener = useService(LinkOpenerService); const modals = useService(ModalService); const os = useService(OsDiagnosticService); @@ -52,15 +54,17 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; }; const handleModChange = (selected: boolean, mod: Mod) => { + if (selected) { - return setModsSelected([...modsSelected, mod]); + return setModsSelected(mods => { + if (mods.some(m => m._id === mod._id)) { + return mods; + } + return [...mods, mod]; + }); } - const mods = [...modsSelected]; - mods.splice( - mods.findIndex(m => m.name === mod.name), - 1 - ); - setModsSelected(mods); + + setModsSelected(mods => mods.filter(m => m._id !== mod._id)); }; const handleMoreInfo = (mod: Mod) => { @@ -77,26 +81,28 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; linkOpener.open(moreInfoMod.link); }; - const installMods = () => { + const installMods = (reinstallAll: boolean): void => { + + setReinstallAllMods(() => false); + if (installing) { return; } const modsToInstall = modsSelected.filter(mod => { - const corespondingMod = modsAvailable.get(mod.category).find(availabeMod => availabeMod._id === mod._id); - const installedMod = modsInstalled.get(mod.category)?.find(installedMod => installedMod.name === mod.name); + const installedMod = modsInstalled.get(mod.category)?.find(installedMod => installedMod._id === mod._id); - if (corespondingMod?.version && lt(corespondingMod.version, mod.version)) { - return false; - } + if(reinstallAll || !installedMod){ return true; } - if(installedMod?.version && lt(mod.version, installedMod?.version)){ - return false; - } - - return true; + return lt(installedMod.version, mod.version); }); + if (!modsToInstall.length) { + notification.notifyInfo({ title: "Mods déjà installées", desc: "Tous les mods séléctionnées sont déjà installées" }); + loadMods(); + return; + } + modsManager.installMods(modsToInstall, version).then(() => { loadMods(); }); @@ -192,13 +198,13 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion;
  • - +
    - - + installMods(false)} style={{ top: reinstallAllMods ? "-100%" : "0" }} /> + installMods(true)} style={{ top: reinstallAllMods ? "0" : "100%" }}/>
    - setReinstallAllMods(prev => !prev)}/> + setReinstallAllMods(prev => !prev)}/>