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" ? (
-
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" ? (
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 bf9050d4..0010955a 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
@@ -204,7 +204,7 @@ 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 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)}/>