diff --git a/python_rpc/main.py b/python_rpc/main.py index 2deb2029..94c34e17 100644 --- a/python_rpc/main.py +++ b/python_rpc/main.py @@ -159,6 +159,8 @@ def action(): downloader = downloads.get(game_id) if downloader: downloader.pause_download() + + if downloading_game_id == game_id: downloading_game_id = -1 elif action == 'cancel': downloader = downloads.get(game_id) diff --git a/src/main/events/torrenting/cancel-game-download.ts b/src/main/events/torrenting/cancel-game-download.ts index 5d80337f..860d33bb 100644 --- a/src/main/events/torrenting/cancel-game-download.ts +++ b/src/main/events/torrenting/cancel-game-download.ts @@ -13,7 +13,14 @@ const cancelGameDownload = async ( await DownloadManager.cancelDownload(downloadKey); - await downloadsSublevel.del(downloadKey); + const download = await downloadsSublevel.get(downloadKey); + + if (!download) return; + + await downloadsSublevel.put(downloadKey, { + ...download, + status: "removed", + }); }; registerEvent("cancelGameDownload", cancelGameDownload); diff --git a/src/main/services/download/download-manager.ts b/src/main/services/download/download-manager.ts index 247d5c75..789a3010 100644 --- a/src/main/services/download/download-manager.ts +++ b/src/main/services/download/download-manager.ts @@ -219,8 +219,10 @@ export class DownloadManager { } as PauseDownloadPayload) .catch(() => {}); - WindowManager.mainWindow?.setProgressBar(-1); - this.downloadingGameId = null; + if (downloadKey === this.downloadingGameId) { + WindowManager.mainWindow?.setProgressBar(-1); + this.downloadingGameId = null; + } } static async resumeDownload(download: Download) { diff --git a/src/renderer/src/hooks/use-download.ts b/src/renderer/src/hooks/use-download.ts index 49a033c9..6d9e04d3 100644 --- a/src/renderer/src/hooks/use-download.ts +++ b/src/renderer/src/hooks/use-download.ts @@ -39,7 +39,7 @@ export function useDownload() { const pauseDownload = async (shop: GameShop, objectId: string) => { await window.electron.pauseGameDownload(shop, objectId); await updateLibrary(); - dispatch(clearDownload()); + if (lastPacket?.gameId === `${shop}:${objectId}`) dispatch(clearDownload()); }; const resumeDownload = async (shop: GameShop, objectId: string) => { diff --git a/src/renderer/src/pages/downloads/download-group.scss b/src/renderer/src/pages/downloads/download-group.scss index 2c5e9701..4a67e857 100644 --- a/src/renderer/src/pages/downloads/download-group.scss +++ b/src/renderer/src/pages/downloads/download-group.scss @@ -5,6 +5,14 @@ flex-direction: column; gap: calc(globals.$spacing-unit * 2); + &__details-with-article { + display: flex; + align-items: center; + gap: calc(globals.$spacing-unit / 2); + align-self: flex-start; + cursor: pointer; + } + &__header { display: flex; align-items: center; diff --git a/src/renderer/src/pages/downloads/download-group.tsx b/src/renderer/src/pages/downloads/download-group.tsx index 66416471..6d581683 100644 --- a/src/renderer/src/pages/downloads/download-group.tsx +++ b/src/renderer/src/pages/downloads/download-group.tsx @@ -24,6 +24,7 @@ import { DownloadIcon, LinkIcon, PlayIcon, + QuestionIcon, ThreeBarsIcon, TrashIcon, UnlinkIcon, @@ -122,8 +123,12 @@ export function DownloadGroup({

{download.downloader === Downloader.Torrent && ( - + {lastPacket?.numPeers} peers / {lastPacket?.numSeeds} seeds + )} @@ -136,7 +141,14 @@ export function DownloadGroup({ return download.status === "seeding" && download.downloader === Downloader.Torrent ? ( <> -

{t("seeding")}

+

+ {t("seeding")} + + +

{uploadSpeed &&

{uploadSpeed}/s

} ) : ( @@ -217,7 +229,7 @@ export function DownloadGroup({ ]; } - if (isGameDownloading || download?.status === "active") { + if (isGameDownloading) { return [ { label: t("pause"), diff --git a/src/renderer/src/pages/downloads/downloads.tsx b/src/renderer/src/pages/downloads/downloads.tsx index eb38c6f5..8b0e5576 100644 --- a/src/renderer/src/pages/downloads/downloads.tsx +++ b/src/renderer/src/pages/downloads/downloads.tsx @@ -8,7 +8,7 @@ import "./downloads.scss"; import { DeleteGameModal } from "./delete-game-modal"; import { DownloadGroup } from "./download-group"; import type { GameShop, LibraryGame, SeedingStatus } from "@types"; -import { orderBy, sortBy } from "lodash-es"; +import { orderBy } from "lodash-es"; import { ArrowDownIcon } from "@primer/octicons-react"; export default function Downloads() { @@ -58,24 +58,24 @@ export default function Downloads() { complete: [], }; - const result = sortBy(library, (game) => game.download?.timestamp).reduce( - (prev, next) => { - /* Game has been manually added to the library or has been canceled */ - if (!next.download?.status || next.download?.status === "removed") - return prev; + const result = orderBy( + library, + (game) => game.download?.timestamp, + "desc" + ).reduce((prev, next) => { + /* Game has been manually added to the library */ + if (!next.download) return prev; - /* Is downloading */ - if (lastPacket?.gameId === next.id) - return { ...prev, downloading: [...prev.downloading, next] }; + /* Is downloading */ + if (lastPacket?.gameId === next.id) + return { ...prev, downloading: [...prev.downloading, next] }; - /* Is either queued or paused */ - if (next.download.queued || next.download?.status === "paused") - return { ...prev, queued: [...prev.queued, next] }; + /* Is either queued or paused */ + if (next.download.queued || next.download?.status === "paused") + return { ...prev, queued: [...prev.queued, next] }; - return { ...prev, complete: [...prev.complete, next] }; - }, - initialValue - ); + return { ...prev, complete: [...prev.complete, next] }; + }, initialValue); const queued = orderBy(result.queued, (game) => game.download?.timestamp, [ "desc", 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 214af1d1..0892d0cf 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 @@ -163,8 +163,10 @@ export function DownloadSettingsModal({ selectedDownloader === downloader ? "primary" : "outline" } disabled={ - downloader === Downloader.RealDebrid && - !userPreferences?.realDebridApiToken + (downloader === Downloader.RealDebrid && + !userPreferences?.realDebridApiToken) || + (downloader === Downloader.TorBox && + !userPreferences?.torBoxApiToken) } onClick={() => setSelectedDownloader(downloader)} >