From db8da467e81fa2a60f6b3f131b75210e0cf892d5 Mon Sep 17 00:00:00 2001 From: Moyasee Date: Mon, 26 Jan 2026 18:57:08 +0200 Subject: [PATCH] refactor: improve error handling in download processes and simplify button content rendering in download settings modal --- .../events/torrenting/add-game-to-queue.ts | 2 +- .../update-download-queue-position.ts | 2 +- src/main/helpers/download-error-handler.ts | 85 +++++++++++-------- .../modals/download-settings-modal.tsx | 44 ++++++---- 4 files changed, 80 insertions(+), 53 deletions(-) diff --git a/src/main/events/torrenting/add-game-to-queue.ts b/src/main/events/torrenting/add-game-to-queue.ts index f57cfaf6..ce86f40d 100644 --- a/src/main/events/torrenting/add-game-to-queue.ts +++ b/src/main/events/torrenting/add-game-to-queue.ts @@ -57,7 +57,7 @@ const addGameToQueue = async ( const updatedGame = await gamesSublevel.get(gameKey); await Promise.all([ - createGame(updatedGame!).catch(() => {}), + createGame(updatedGame).catch(() => {}), HydraApi.post(`/games/${shop}/${objectId}/download`, null, { needsAuth: false, }).catch(() => {}), diff --git a/src/main/events/torrenting/update-download-queue-position.ts b/src/main/events/torrenting/update-download-queue-position.ts index 5672d63d..6e480778 100644 --- a/src/main/events/torrenting/update-download-queue-position.ts +++ b/src/main/events/torrenting/update-download-queue-position.ts @@ -13,7 +13,7 @@ const updateDownloadQueuePosition = async ( const download = await downloadsSublevel.get(gameKey); - if (!download || !download.queued || download.status !== "paused") { + if (!download?.queued || download.status !== "paused") { return false; } diff --git a/src/main/helpers/download-error-handler.ts b/src/main/helpers/download-error-handler.ts index ad39d263..4b3864d6 100644 --- a/src/main/helpers/download-error-handler.ts +++ b/src/main/helpers/download-error-handler.ts @@ -1,48 +1,63 @@ import { AxiosError } from "axios"; import { Downloader, DownloadError } from "@shared"; +type DownloadErrorResult = { ok: false; error?: string }; + +const handleAxiosError = ( + err: AxiosError, + downloader: Downloader +): DownloadErrorResult | null => { + if (err.response?.status === 429 && downloader === Downloader.Gofile) { + return { ok: false, error: DownloadError.GofileQuotaExceeded }; + } + + if (err.response?.status === 403 && downloader === Downloader.RealDebrid) { + return { ok: false, error: DownloadError.RealDebridAccountNotAuthorized }; + } + + if (downloader === Downloader.TorBox) { + const data = err.response?.data as { detail?: string } | undefined; + return { ok: false, error: data?.detail }; + } + + return null; +}; + +const HOST_NAMES: Partial> = { + [Downloader.Buzzheavier]: "Buzzheavier", + [Downloader.FuckingFast]: "FuckingFast", +}; + +const handleHostSpecificError = ( + message: string, + downloader: Downloader +): DownloadErrorResult | null => { + const hostName = HOST_NAMES[downloader]; + if (!hostName) return null; + + if (message.includes("Rate limit")) { + return { ok: false, error: `${hostName}: Rate limit exceeded` }; + } + + if (message.includes("not found") || message.includes("deleted")) { + return { ok: false, error: `${hostName}: File not found` }; + } + + return null; +}; + export const handleDownloadError = ( err: unknown, downloader: Downloader -): { ok: false; error?: string } => { +): DownloadErrorResult => { if (err instanceof AxiosError) { - if (err.response?.status === 429 && downloader === Downloader.Gofile) { - return { ok: false, error: DownloadError.GofileQuotaExceeded }; - } - - if (err.response?.status === 403 && downloader === Downloader.RealDebrid) { - return { ok: false, error: DownloadError.RealDebridAccountNotAuthorized }; - } - - if (downloader === Downloader.TorBox) { - return { ok: false, error: err.response?.data?.detail }; - } + const result = handleAxiosError(err, downloader); + if (result) return result; } if (err instanceof Error) { - if (downloader === Downloader.Buzzheavier) { - if (err.message.includes("Rate limit")) { - return { ok: false, error: "Buzzheavier: Rate limit exceeded" }; - } - if ( - err.message.includes("not found") || - err.message.includes("deleted") - ) { - return { ok: false, error: "Buzzheavier: File not found" }; - } - } - - if (downloader === Downloader.FuckingFast) { - if (err.message.includes("Rate limit")) { - return { ok: false, error: "FuckingFast: Rate limit exceeded" }; - } - if ( - err.message.includes("not found") || - err.message.includes("deleted") - ) { - return { ok: false, error: "FuckingFast: File not found" }; - } - } + const hostResult = handleHostSpecificError(err.message, downloader); + if (hostResult) return hostResult; return { ok: false, error: err.message }; } diff --git a/src/renderer/src/pages/game-details/modals/download-settings-modal.tsx b/src/renderer/src/pages/game-details/modals/download-settings-modal.tsx index 6f20e439..69ea682d 100644 --- a/src/renderer/src/pages/game-details/modals/download-settings-modal.tsx +++ b/src/renderer/src/pages/game-details/modals/download-settings-modal.tsx @@ -221,6 +221,33 @@ export function DownloadSettingsModal({ } }; + const getButtonContent = () => { + if (downloadStarting) { + return ( + <> + + {t("loading")} + + ); + } + + if (hasActiveDownload) { + return ( + <> + + {t("add_to_queue")} + + ); + } + + return ( + <> + + {t("download_now")} + + ); + }; + const handleStartClick = async () => { if (repack) { setDownloadStarting(true); @@ -462,22 +489,7 @@ export function DownloadSettingsModal({ ) } > - {downloadStarting ? ( - <> - - {t("loading")} - - ) : hasActiveDownload ? ( - <> - - {t("add_to_queue")} - - ) : ( - <> - - {t("download_now")} - - )} + {getButtonContent()}