From a20c73d0e98c9e365d87ad4cc18ce67565f4462f Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sat, 27 Jul 2024 15:51:06 +0200 Subject: [PATCH 1/4] [qol] dont reinstall all mods by default (not finnished) --- .../shared/bsm-button.component.tsx | 2 +- .../shared/bsm-dropdown-button.component.tsx | 20 ++++++++++++++----- .../slides/mods/mods-grid.component.tsx | 6 +++--- .../slides/mods/mods-slide.component.tsx | 16 ++++++++++----- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/renderer/components/shared/bsm-button.component.tsx b/src/renderer/components/shared/bsm-button.component.tsx index 2d9802d6..f89e7b26 100644 --- a/src/renderer/components/shared/bsm-button.component.tsx +++ b/src/renderer/components/shared/bsm-button.component.tsx @@ -6,7 +6,7 @@ import { useClickOutside } from "renderer/hooks/use-click-outside.hook"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { getCorrectTextColor } from "renderer/helpers/correct-text-color"; -type BsmButtonType = "primary" | "secondary" | "success" | "cancel" | "error" | "none"; +export type BsmButtonType = "primary" | "secondary" | "success" | "cancel" | "error" | "none"; type Props = { className?: string; diff --git a/src/renderer/components/shared/bsm-dropdown-button.component.tsx b/src/renderer/components/shared/bsm-dropdown-button.component.tsx index eceef67a..805c5041 100644 --- a/src/renderer/components/shared/bsm-dropdown-button.component.tsx +++ b/src/renderer/components/shared/bsm-dropdown-button.component.tsx @@ -1,9 +1,10 @@ import { forwardRef, LegacyRef, useImperativeHandle, useRef, useState } from "react"; import { BsmIconType, BsmIcon } from "../svgs/bsm-icon.component"; -import { BsmButton } from "./bsm-button.component"; +import { BsmButton, BsmButtonType } from "./bsm-button.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; import { AnimatePresence } from "framer-motion"; import { useClickOutside } from "renderer/hooks/use-click-outside.hook"; +import { cn } from "renderer/helpers/css-class.helpers"; export interface DropDownItem { text: string; @@ -11,8 +12,17 @@ export interface DropDownItem { onClick?: () => void; } +type ClassNames = { + mainContainer?: string; + button?: string; + itemsContainer?: string; + iconClassName?: string; +} + type Props = { className?: string; + classNames?: ClassNames; + buttonColor?: BsmButtonType; items?: DropDownItem[]; align?: "left" | "right" | "center"; withBar?: boolean; @@ -24,7 +34,7 @@ type Props = { textClassName?: string; }; -export const BsmDropdownButton = forwardRef(({ className, items, align, withBar = true, icon = "settings", buttonClassName, menuTranslationY, children, text, textClassName }: Props, fowardRed) => { +export const BsmDropdownButton = forwardRef(({ className, classNames, buttonColor, items, align, withBar = true, icon = "settings", buttonClassName, menuTranslationY, children, text, textClassName }: Props, fowardRed) => { const [expanded, setExpanded] = useState(false); const t = useTranslation(); const ref = useRef(fowardRed); @@ -63,9 +73,9 @@ export const BsmDropdownButton = forwardRef(({ className, items, align, withBar })(); return ( -
} className={className}> - setExpanded(!expanded)} className={buttonClassName ?? defaultButtonClassName} icon={icon} active={expanded} textClassName={textClassName} onClickOutside={handleClickOutside} withBar={withBar} text={text} /> -
+
} className={cn(className, classNames?.mainContainer)}> + setExpanded(!expanded)} className={cn(buttonClassName ?? defaultButtonClassName, classNames?.button)} icon={icon} active={expanded} textClassName={textClassName} onClickOutside={handleClickOutside} withBar={withBar} text={text} typeColor={buttonColor} iconClassName={classNames?.iconClassName}/> +
{items?.map( i => i && ( 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..206941f8 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 @@ -12,7 +12,7 @@ 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 }; export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreInfoMod, onWantInfos }: Props) { - + const pageState = useService(PageStateService); const modsManager = useService(BsModsManagerService); @@ -61,8 +61,8 @@ export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreIn return ( modsMap && (
- - + + {filterEnabled ? handleInput(e.target.value)} /> : {t("pages.version-viewer.mods.mods-grid.header-bar.name")}} 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 cc773abb..f708e042 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 @@ -35,6 +35,7 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; const [modsInstalled, setModsInstalled] = useState(null as Map); const [modsSelected, setModsSelected] = useState([] as Mod[]); const [moreInfoMod, setMoreInfoMod] = useState(null as Mod); + const [reinstallAllMods, setReinstallAllMods] = useState(false); const isOnline = useObservable(() => os.isOnline$); const installing = useObservable(() => modsManager.isInstalling$); @@ -80,6 +81,7 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; 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); @@ -186,13 +188,17 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; } return ( <> -
+
-
+
-
- +
+
+ + +
+ setReinstallAllMods(prev => !prev)}/>
@@ -201,7 +207,7 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; return (
-
{renderContent()}
+
{renderContent()}
); } 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 2/4] [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)}/>
    From 8316a9ef8054c04b53141ce2321928f525a9c00c Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Mon, 29 Jul 2024 20:31:06 +0200 Subject: [PATCH 3/4] [qol] fix transform style not working --- src/renderer/components/shared/bsm-button.component.tsx | 2 +- .../version-viewer/slides/mods/mods-slide.component.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/shared/bsm-button.component.tsx b/src/renderer/components/shared/bsm-button.component.tsx index 485f569d..5723d1ef 100644 --- a/src/renderer/components/shared/bsm-button.component.tsx +++ b/src/renderer/components/shared/bsm-button.component.tsx @@ -87,7 +87,7 @@ export const BsmButton = forwardRef(({ className, style, iconSty return (
    {image && } - {icon && } + {icon && } {text && (type === "submit" ? (
    - setReinstallAllMods(prev => !prev)}/> + setReinstallAllMods(prev => !prev)}/>
    From a6462530bb9fd6740c9d06d95303343f59f8cbfd Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Mon, 29 Jul 2024 21:11:14 +0200 Subject: [PATCH 4/4] [qol] reinstall all translations + fix buttons sizing --- assets/jsons/translations/de.json | 3 ++- assets/jsons/translations/en.json | 3 ++- assets/jsons/translations/es.json | 3 ++- assets/jsons/translations/fr.json | 3 ++- assets/jsons/translations/ja.json | 3 ++- assets/jsons/translations/ru.json | 3 ++- assets/jsons/translations/zh-tw.json | 3 ++- assets/jsons/translations/zh.json | 3 ++- .../version-viewer/slides/mods/mods-slide.component.tsx | 6 +++--- 9 files changed, 19 insertions(+), 11 deletions(-) diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index e6f88ecb..d32829f2 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -73,7 +73,8 @@ "mods-not-available": "Für diese Version von Beat Saber sind noch keine Mods verfügbar", "buttons": { "more-infos": "Mehr Infos", - "install-or-update": "Installieren oder aktualisieren" + "install-or-update": "Installieren oder aktualisieren", + "reinstall-all": "Alles neu installieren" }, "mods-grid": { "header-bar": { diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index eaa7a9e2..6e385f05 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -73,7 +73,8 @@ "mods-not-available": "No mods are available yet for this version of Beat Saber", "buttons": { "more-infos": "More info", - "install-or-update": "Install or update" + "install-or-update": "Install or update", + "reinstall-all": "Reinstall all" }, "mods-grid": { "header-bar": { diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index f4be86e8..fdc67c77 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -73,7 +73,8 @@ "mods-not-available": "Aún no hay mods disponibles para esta versión de Beat Saber", "buttons": { "more-infos": "Más información", - "install-or-update": "Instalar o actualizar" + "install-or-update": "Instalar o actualizar", + "reinstall-all": "Reinstalar todo" }, "mods-grid": { "header-bar": { diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 86737a38..142515f1 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -73,7 +73,8 @@ "mods-not-available": "Aucun mod n'est encore disponible pour cette version de Beat Saber", "buttons": { "more-infos": "Plus d'infos", - "install-or-update": "Installer ou mettre à jour" + "install-or-update": "Installer ou mettre à jour", + "reinstall-all": "Tout réinstaller" }, "mods-grid": { "header-bar": { diff --git a/assets/jsons/translations/ja.json b/assets/jsons/translations/ja.json index ed982fa4..66ab8ad2 100644 --- a/assets/jsons/translations/ja.json +++ b/assets/jsons/translations/ja.json @@ -73,7 +73,8 @@ "mods-not-available": "このバージョンで使用できるMODはまだありません。", "buttons": { "more-infos": "詳細情報", - "install-or-update": "インストールとアップデート" + "install-or-update": "インストールとアップデート", + "reinstall-all": "すべて再インストール" }, "mods-grid": { "header-bar": { diff --git a/assets/jsons/translations/ru.json b/assets/jsons/translations/ru.json index d93e138d..c34b87da 100644 --- a/assets/jsons/translations/ru.json +++ b/assets/jsons/translations/ru.json @@ -73,7 +73,8 @@ "mods-not-available": "Не найдены моды для этой версии Beat Saber", "buttons": { "more-infos": "Подробнее", - "install-or-update": "Установить или обновить" + "install-or-update": "Установить или обновить", + "reinstall-all": "Переустановить все" }, "mods-grid": { "header-bar": { diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index 65d49ae8..8622103f 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -73,7 +73,8 @@ "mods-not-available": "該版本 BeatSaber 暫無可用 Mod", "buttons": { "more-infos": "更多資訊", - "install-or-update": "安裝或更新" + "install-or-update": "安裝或更新", + "reinstall-all": "重新安裝全部" }, "mods-grid": { "header-bar": { diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index 6a0722c6..591271a1 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -73,7 +73,8 @@ "mods-not-available": "该版本 BeatSaber 暂无可用 Mod", "buttons": { "more-infos": "更多信息", - "install-or-update": "安装或更新" + "install-or-update": "安装或更新", + "reinstall-all": "重新安装全部" }, "mods-grid": { "header-bar": { 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 0010955a..52ef38b6 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 @@ -200,9 +200,9 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion;
    -
    - installMods(false)} style={{ top: reinstallAllMods ? "-100%" : "0" }} /> - installMods(true)} style={{ top: reinstallAllMods ? "0" : "100%" }}/> +
    + installMods(false)} style={{ top: reinstallAllMods ? "-100%" : "0" }} /> + installMods(true)} style={{ top: reinstallAllMods ? "-100%" : "0" }}/>
    setReinstallAllMods(prev => !prev)}/>