From 4435df2fd706d68f280ba4d7368072bfecbb2266 Mon Sep 17 00:00:00 2001 From: Zagrios <40181755+Zagrios@users.noreply.github.com> Date: Sat, 22 Mar 2025 20:29:20 +0100 Subject: [PATCH] [bugfix-821] Add error messages for Beat Saber uninstallation --- assets/jsons/translations/de.json | 10 ++++++++ assets/jsons/translations/en.json | 10 ++++++++ assets/jsons/translations/es.json | 10 ++++++++ assets/jsons/translations/fr.json | 10 ++++++++ assets/jsons/translations/it.json | 10 ++++++++ assets/jsons/translations/ja.json | 10 ++++++++ assets/jsons/translations/ko.json | 10 ++++++++ assets/jsons/translations/pt-br.json | 10 ++++++++ assets/jsons/translations/ru.json | 10 ++++++++ assets/jsons/translations/tl.json | 10 ++++++++ assets/jsons/translations/uk.json | 10 ++++++++ assets/jsons/translations/zh-tw.json | 10 ++++++++ assets/jsons/translations/zh.json | 10 ++++++++ src/main/services/bs-local-version.service.ts | 10 +++----- .../bs-version-item.component.tsx | 3 ++- .../pages/version-viewer.component.tsx | 25 ++++++++++++++----- .../services/bs-uninstaller.service.ts | 4 +-- src/shared/models/ipc/ipc-routes.ts | 2 +- 18 files changed, 158 insertions(+), 16 deletions(-) diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index c405059e..b268d99b 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -701,6 +701,16 @@ "do-not-remind": "Nicht mehr daran erinnern", "ok": "Ok" } + }, + "bs-uninstall": { + "errors": { + "title": "Version kann nicht deinstalliert werden", + "desc": { + "CantDeleteOfficialVersion": "BSManager kann die originale Beat Saber Version nicht deinstallieren", + "VersionNotFound": "Version nicht gefunden.", + "delete-folder": "Version kann nicht gelöscht werden. Stelle sicher, dass Beat Saber nicht läuft." + } + } } }, "modals": { diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 7cff4159..d1857a6b 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -701,6 +701,16 @@ "do-not-remind": "Do not remind me", "ok": "Ok" } + }, + "bs-uninstall": { + "errors": { + "title": "Unable to uninstall version", + "desc": { + "CantDeleteOfficialVersion": "BSManager cannot uninstall the original Beat Saber version", + "VersionNotFound": "Version not found.", + "delete-folder": "Unable to delete the version. Ensure Beat Saber is not running." + } + } } }, "modals": { diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index 256f4b6c..50a8a26a 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -701,6 +701,16 @@ "do-not-remind": "No volver a recordármelo", "ok": "Ok" } + }, + "bs-uninstall": { + "errors": { + "title": "No se puede desinstalar la versión", + "desc": { + "CantDeleteOfficialVersion": "BSManager no puede desinstalar la versión original de Beat Saber", + "VersionNotFound": "Versión no encontrada.", + "delete-folder": "No se puede eliminar la versión. Asegúrate de que Beat Saber no esté en marcha." + } + } } }, "modals": { diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 8cba5f36..61dcf4d6 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -701,6 +701,16 @@ "do-not-remind": "Ne plus me rappeler", "ok": "Ok" } + }, + "bs-uninstall": { + "errors": { + "title": "Impossible de désinstaller la version", + "desc": { + "CantDeleteOfficialVersion": "BSManager ne peut pas désinstaller la version originale de Beat Saber", + "VersionNotFound": "La version n'a pas été trouvée.", + "delete-folder": "Impossible de supprimer la version. Vérifiez que Beat Saber n'est pas en cours d'exécution." + } + } } }, "modals": { diff --git a/assets/jsons/translations/it.json b/assets/jsons/translations/it.json index 5a6c48ae..be832210 100644 --- a/assets/jsons/translations/it.json +++ b/assets/jsons/translations/it.json @@ -701,6 +701,16 @@ "do-not-remind": "Non ricordarmelo più", "ok": "Ok" } + }, + "bs-uninstall": { + "errors": { + "title": "Impossibile disinstallare la versione", + "desc": { + "CantDeleteOfficialVersion": "BSManager non può disinstallare la versione originale di Beat Saber", + "VersionNotFound": "Versione non trovata.", + "delete-folder": "Impossibile eliminare la versione. Assicurati che Beat Saber non sia in esecuzione." + } + } } }, "modals": { diff --git a/assets/jsons/translations/ja.json b/assets/jsons/translations/ja.json index 6285a27d..d6c8e718 100644 --- a/assets/jsons/translations/ja.json +++ b/assets/jsons/translations/ja.json @@ -701,6 +701,16 @@ "do-not-remind": "再度通知しない", "ok": "OK" } + }, + "bs-uninstall": { + "errors": { + "title": "バージョンをアンインストールできません", + "desc": { + "CantDeleteOfficialVersion": "BSManagerはBeat Saberのオリジナルバージョンをアンインストールできません", + "VersionNotFound": "バージョンが見つかりません。", + "delete-folder": "バージョンを削除できません。Beat Saberが実行中でないことを確認してください。" + } + } } }, "modals": { diff --git a/assets/jsons/translations/ko.json b/assets/jsons/translations/ko.json index 0a9a94f4..37cf3150 100644 --- a/assets/jsons/translations/ko.json +++ b/assets/jsons/translations/ko.json @@ -701,6 +701,16 @@ "do-not-remind": "다시 알리지 않기", "ok": "확인" } + }, + "bs-uninstall": { + "errors": { + "title": "버전을 제거할 수 없습니다", + "desc": { + "CantDeleteOfficialVersion": "BSManager는 원본 Beat Saber 버전을 제거할 수 없습니다", + "VersionNotFound": "버전을 찾을 수 없습니다.", + "delete-folder": "버전을 삭제할 수 없습니다. Beat Saber가 실행 중이지 않은지 확인하세요." + } + } } }, "modals": { diff --git a/assets/jsons/translations/pt-br.json b/assets/jsons/translations/pt-br.json index c1768236..df75beaf 100644 --- a/assets/jsons/translations/pt-br.json +++ b/assets/jsons/translations/pt-br.json @@ -701,6 +701,16 @@ "do-not-remind": "Não me lembrar novamente", "ok": "Ok" } + }, + "bs-uninstall": { + "errors": { + "title": "Não é possível desinstalar a versão", + "desc": { + "CantDeleteOfficialVersion": "O BSManager não pode desinstalar a versão original do Beat Saber", + "VersionNotFound": "Versão não encontrada.", + "delete-folder": "Não foi possível deletar a versão. Certifique-se de que Beat Saber não está em execução." + } + } } }, "modals": { diff --git a/assets/jsons/translations/ru.json b/assets/jsons/translations/ru.json index d9d80a46..eb630cd5 100644 --- a/assets/jsons/translations/ru.json +++ b/assets/jsons/translations/ru.json @@ -701,6 +701,16 @@ "do-not-remind": "Больше не напоминать", "ok": "Ок" } + }, + "bs-uninstall": { + "errors": { + "title": "Невозможно удалить версию", + "desc": { + "CantDeleteOfficialVersion": "BSManager не может удалить оригинальную версию Beat Saber", + "VersionNotFound": "Версия не найдена.", + "delete-folder": "Не удалось удалить версию. Убедитесь, что Beat Saber не запущен." + } + } } }, "modals": { diff --git a/assets/jsons/translations/tl.json b/assets/jsons/translations/tl.json index 6d3ce7a6..110e38b2 100644 --- a/assets/jsons/translations/tl.json +++ b/assets/jsons/translations/tl.json @@ -701,6 +701,16 @@ "do-not-remind": "Huwag akong paalalahanan", "ok": "Ok" } + }, + "bs-uninstall": { + "errors": { + "title": "Hindi maalis ang bersyon", + "desc": { + "CantDeleteOfficialVersion": "Hindi maalis ng BSManager ang orihinal na bersyon ng Beat Saber", + "VersionNotFound": "Hindi nahanap ang bersyon.", + "delete-folder": "Hindi maalis ang bersyon. Tiyakin na ang Beat Saber ay hindi naka-run." + } + } } }, "modals": { diff --git a/assets/jsons/translations/uk.json b/assets/jsons/translations/uk.json index e906dc9c..81b1e0ea 100644 --- a/assets/jsons/translations/uk.json +++ b/assets/jsons/translations/uk.json @@ -701,6 +701,16 @@ "do-not-remind": "Не нагадувати", "ok": "Гаразд" } + }, + "bs-uninstall": { + "errors": { + "title": "Неможливо видалити версію", + "desc": { + "CantDeleteOfficialVersion": "BSManager не може видалити оригінальну версію Beat Saber", + "VersionNotFound": "Версія не знайдена.", + "delete-folder": "Не вдалося видалити версію. Переконайтеся, що Beat Saber не запущений." + } + } } }, "modals": { diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index f2f51201..eb3cd64a 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -701,6 +701,16 @@ "do-not-remind": "不要再提醒我", "ok": "確定" } + }, + "bs-uninstall": { + "errors": { + "title": "無法卸載版本", + "desc": { + "CantDeleteOfficialVersion": "BSManager無法卸載Beat Saber的原始版本", + "VersionNotFound": "找不到版本。", + "delete-folder": "無法刪除版本。確保Beat Saber未運行。" + } + } } }, "modals": { diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index aba6d6bc..31a0da8a 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -701,6 +701,16 @@ "do-not-remind": "不再提醒", "ok": "确定" } + }, + "bs-uninstall": { + "errors": { + "title": "无法卸载版本", + "desc": { + "CantDeleteOfficialVersion": "BSManager无法卸载Beat Saber的原始版本", + "VersionNotFound": "未找到版本。", + "delete-folder": "无法删除版本。确保Beat Saber未运行。" + } + } } }, "modals": { diff --git a/src/main/services/bs-local-version.service.ts b/src/main/services/bs-local-version.service.ts index c97ac1ea..5e73f99d 100644 --- a/src/main/services/bs-local-version.service.ts +++ b/src/main/services/bs-local-version.service.ts @@ -306,14 +306,12 @@ export class BSLocalVersionService { return versions; } - public async deleteVersion(version: BSVersion): Promise{ - if(version.steam || version.oculus){ return false; } + public async deleteVersion(version: BSVersion): Promise{ + if(version.steam || version.oculus){ throw new CustomError("BSManager is not able to delete official Beat Saber versions", "CantDeleteOfficialVersion"); } const versionFolder = await this.getVersionPath(version); - if(!(await pathExists(versionFolder))){ return true; } + if(!(await pathExists(versionFolder))){ throw new CustomError("Version not found", "VersionNotFound"); } - return deleteFolder(versionFolder) - .then(() => { return true; }) - .catch(() => { return false; }) + return deleteFolder(versionFolder); } public async editVersion(version: BSVersion, name: string, color: string): Promise{ diff --git a/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx b/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx index 8117d0aa..c82ac80d 100644 --- a/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx +++ b/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx @@ -16,6 +16,7 @@ import equal from "fast-deep-equal"; import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; import { BsDownloaderService } from "renderer/services/bs-version-download/bs-downloader.service"; import { ProgressBarService } from "renderer/services/progress-bar.service"; +import { noop } from "shared/helpers/function.helpers"; export function BsVersionItem(props: { version: BSVersion }) { @@ -70,7 +71,7 @@ export function BsVersionItem(props: { version: BSVersion }) { const wasVerification = bsDownloader.isVerifying; bsDownloader.stopDownload().then(() => { if(wasVerification){ return; } - bsUninstallerService.uninstall(versionDownload).then(res => res && verionManagerService.askInstalledVersions()); + bsUninstallerService.uninstall(versionDownload).then(() => verionManagerService.askInstalledVersions()).catch(noop); }); }; diff --git a/src/renderer/pages/version-viewer.component.tsx b/src/renderer/pages/version-viewer.component.tsx index 601e3063..718187dc 100644 --- a/src/renderer/pages/version-viewer.component.tsx +++ b/src/renderer/pages/version-viewer.component.tsx @@ -28,6 +28,7 @@ import { logRenderError } from "renderer"; import { BsModsManagerService } from "renderer/services/bs-mods-manager.service"; import { noop } from "shared/helpers/function.helpers"; import { useTranslationV2 } from "renderer/hooks/use-translation.hook"; +import { CustomError } from "shared/models/exceptions/custom-error.class"; export function VersionViewer() { @@ -125,13 +126,25 @@ export function VersionViewer() { const uninstall = async () => { const modalCompleted = await modalService.openModal(UninstallModal, { data: state }); - if (modalCompleted.exitCode === ModalExitCode.COMPLETED) { - bsUninstallerService.uninstall(state).then(() => { - bsVersionManagerService.askInstalledVersions().then(versions => { - navigateToVersion(versions?.at(0)); - }); - }); + if (modalCompleted.exitCode !== ModalExitCode.COMPLETED) { + return; } + + bsUninstallerService.uninstall(state).then(() => { + bsVersionManagerService.askInstalledVersions().then(versions => { + navigateToVersion(versions?.at(0)); + }); + }).catch((err: CustomError) => { + let desc = err?.message; + + if (["CantDeleteOfficialVersion", "VersionNotFound"].includes(err?.code)) { + desc = `notifications.bs-uninstall.errors.desc.${err.code}`; + } else if (err?.code?.startsWith("generic.fs.delete-folder")) { + desc = "notifications.bs-uninstall.errors.desc.delete-folder"; + } + + notification.notifyError({ title: "notifications.bs-uninstall.errors.title", desc }); + }); }; const edit = () => { diff --git a/src/renderer/services/bs-uninstaller.service.ts b/src/renderer/services/bs-uninstaller.service.ts index aade52eb..6528f2e9 100644 --- a/src/renderer/services/bs-uninstaller.service.ts +++ b/src/renderer/services/bs-uninstaller.service.ts @@ -18,7 +18,7 @@ export class BSUninstallerService { this.ipcService = IpcService.getInstance(); } - public uninstall(version: BSVersion): Promise { - return lastValueFrom(this.ipcService.sendV2("bs.uninstall", version)).catch(() => false); + public uninstall(version: BSVersion): Promise { + return lastValueFrom(this.ipcService.sendV2("bs.uninstall", version)); } } diff --git a/src/shared/models/ipc/ipc-routes.ts b/src/shared/models/ipc/ipc-routes.ts index ed417586..a29c2431 100644 --- a/src/shared/models/ipc/ipc-routes.ts +++ b/src/shared/models/ipc/ipc-routes.ts @@ -103,7 +103,7 @@ export interface IpcChannelMapping { "install-playlist-file": {request: {bplist: BPList, version?: BSVersion, dest?: string}, response: LocalBPListsDetails}; /* ** bs-uninstall-ipcs ** */ - "bs.uninstall": { request: BSVersion, response: boolean }; + "bs.uninstall": { request: BSVersion, response: void }; /* ** bs-version-ipcs ** */ "bs-version.get-version-dict": { request: void, response: BSVersion[] };