mirror of
https://github.com/hydralauncher/hydra.git
synced 2026-01-23 10:51:02 +00:00
Compare commits
17 Commits
feat/LBX-3
...
fix/fullsc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24d65b50b4 | ||
|
|
34681b3bc2 | ||
|
|
4b71a3f5bb | ||
|
|
a0f669c97b | ||
|
|
96fca88601 | ||
|
|
3f65bb86a8 | ||
|
|
b494c7c8ec | ||
|
|
d5e6bed3b7 | ||
|
|
214267df7e | ||
|
|
21f46c9af3 | ||
|
|
cc5e0014f7 | ||
|
|
142bd3156c | ||
|
|
95a7bc2236 | ||
|
|
78d2be85f2 | ||
|
|
67ea9e78a2 | ||
|
|
67f863e0f3 | ||
|
|
77b6f1b2ad |
@@ -420,7 +420,9 @@
|
|||||||
"delete_archive_title": "Would you like to delete {{fileName}}?",
|
"delete_archive_title": "Would you like to delete {{fileName}}?",
|
||||||
"delete_archive_description": "The file has been successfully extracted and it's no longer needed.",
|
"delete_archive_description": "The file has been successfully extracted and it's no longer needed.",
|
||||||
"yes": "Yes",
|
"yes": "Yes",
|
||||||
"no": "No"
|
"no": "No",
|
||||||
|
"network": "NETWORK",
|
||||||
|
"peak": "PEAK"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Downloads path",
|
"downloads_path": "Downloads path",
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"downloading": "{{title}} ({{percentage}} - Letöltés…)",
|
"downloading": "{{title}} ({{percentage}} - Letöltés…)",
|
||||||
"filter": "Könyvtár szűrése",
|
"filter": "Könyvtár szűrése",
|
||||||
"home": "Főoldal",
|
"home": "Főoldal",
|
||||||
"queued": "A(z) {{title}} (Várakozósorban van)",
|
"queued": "{{title}} (Várakozásban)",
|
||||||
"game_has_no_executable": "A játékhoz nincs tallózva futtatható fájl",
|
"game_has_no_executable": "A játékhoz nincs tallózva futtatható fájl",
|
||||||
"sign_in": "Bejelentkezés",
|
"sign_in": "Bejelentkezés",
|
||||||
"friends": "Barátok",
|
"friends": "Barátok",
|
||||||
@@ -94,6 +94,12 @@
|
|||||||
"header": {
|
"header": {
|
||||||
"search": "Keresés",
|
"search": "Keresés",
|
||||||
"search_library": "Könyvtár böngészése",
|
"search_library": "Könyvtár böngészése",
|
||||||
|
"recent_searches": "Korábbi Keresések",
|
||||||
|
"suggestions": "Találatok",
|
||||||
|
"clear_history": "Törlés",
|
||||||
|
"remove_from_history": "Törlés az előzményekből",
|
||||||
|
"loading": "Töltés...",
|
||||||
|
"no_results": "Nincs találat",
|
||||||
"home": "Főoldal",
|
"home": "Főoldal",
|
||||||
"catalogue": "Katalógus",
|
"catalogue": "Katalógus",
|
||||||
"library": "Könyvtár",
|
"library": "Könyvtár",
|
||||||
@@ -109,6 +115,7 @@
|
|||||||
"downloading": "{{title}} letöltése… ({{percentage}} kész) - Befejezés {{eta}} - {{speed}}",
|
"downloading": "{{title}} letöltése… ({{percentage}} kész) - Befejezés {{eta}} - {{speed}}",
|
||||||
"calculating_eta": "{{title}} letöltése… ({{percentage}} kész) - Hátralévő idő…",
|
"calculating_eta": "{{title}} letöltése… ({{percentage}} kész) - Hátralévő idő…",
|
||||||
"checking_files": "A(z) {{title}} fájljaiból… ({{percentage}} kész)",
|
"checking_files": "A(z) {{title}} fájljaiból… ({{percentage}} kész)",
|
||||||
|
"extracting": "{{title}} kicsomagolása… ({{percentage}} kicsomagolva)",
|
||||||
"installing_common_redist": "{{log}}…",
|
"installing_common_redist": "{{log}}…",
|
||||||
"installation_complete": "Telepítés befejezve",
|
"installation_complete": "Telepítés befejezve",
|
||||||
"installation_complete_message": "A(z) Alapvető segédprogramok sikeresen telepítve"
|
"installation_complete_message": "A(z) Alapvető segédprogramok sikeresen telepítve"
|
||||||
@@ -165,7 +172,7 @@
|
|||||||
"playing_now": "Játékban: ",
|
"playing_now": "Játékban: ",
|
||||||
"change": "Változtatás",
|
"change": "Változtatás",
|
||||||
"repacks_modal_description": "Válaszd ki a repacket amit leszeretnél tölteni",
|
"repacks_modal_description": "Válaszd ki a repacket amit leszeretnél tölteni",
|
||||||
"select_folder_hint": "A letöltési mappát a <0>Beállítások</0> menüjében változtathatod meg",
|
"select_folder_hint": "A letöltési mappát a <0>Beállításokban</0> változtathatod meg",
|
||||||
"download_now": "Letöltés",
|
"download_now": "Letöltés",
|
||||||
"no_shop_details": "A bolt adatai nem érhetőek el.",
|
"no_shop_details": "A bolt adatai nem érhetőek el.",
|
||||||
"download_options": "Letöltési opciók",
|
"download_options": "Letöltési opciók",
|
||||||
@@ -196,6 +203,7 @@
|
|||||||
"danger_zone_section_description": "Itt eltávolítható a játék a könyvtáradból, vagy a fájlok amelyek a Hydra által lettek letöltve",
|
"danger_zone_section_description": "Itt eltávolítható a játék a könyvtáradból, vagy a fájlok amelyek a Hydra által lettek letöltve",
|
||||||
"download_in_progress": "Letöltés folyamatban",
|
"download_in_progress": "Letöltés folyamatban",
|
||||||
"download_paused": "Letöltés szüneteltetve",
|
"download_paused": "Letöltés szüneteltetve",
|
||||||
|
"extracting": "Kicsomagolás",
|
||||||
"last_downloaded_option": "Utoljára letöltött",
|
"last_downloaded_option": "Utoljára letöltött",
|
||||||
"new_download_option": "Új",
|
"new_download_option": "Új",
|
||||||
"create_steam_shortcut": "Steam parancsikon létrehozása",
|
"create_steam_shortcut": "Steam parancsikon létrehozása",
|
||||||
@@ -397,7 +405,7 @@
|
|||||||
"delete_modal_description": "Ez eltávolítja a telepítési fájlokat a számítógépedről",
|
"delete_modal_description": "Ez eltávolítja a telepítési fájlokat a számítógépedről",
|
||||||
"install": "Telepít",
|
"install": "Telepít",
|
||||||
"download_in_progress": "Folyamatban lévő",
|
"download_in_progress": "Folyamatban lévő",
|
||||||
"queued_downloads": "Várakozósoron lévő letöltések",
|
"queued_downloads": "Várakozásban lévő letöltések",
|
||||||
"downloads_completed": "Befejezett",
|
"downloads_completed": "Befejezett",
|
||||||
"queued": "Várakozásban",
|
"queued": "Várakozásban",
|
||||||
"no_downloads_title": "Oly üres..",
|
"no_downloads_title": "Oly üres..",
|
||||||
@@ -408,7 +416,11 @@
|
|||||||
"resume_seeding": "Seedelés folytatása",
|
"resume_seeding": "Seedelés folytatása",
|
||||||
"options": "Kezelés",
|
"options": "Kezelés",
|
||||||
"extract": "Fájlok kibontása",
|
"extract": "Fájlok kibontása",
|
||||||
"extracting": "Fájlok kibontása…"
|
"extracting": "Fájlok kibontása…",
|
||||||
|
"delete_archive_title": "Szeretnéd törölni ezt a fájlt? {{fileName}}",
|
||||||
|
"delete_archive_description": "A tömörített fájl ki lett csomagolva, s többé nincs rá szükség. ",
|
||||||
|
"yes": "Igen",
|
||||||
|
"no": "Nem"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Letöltési útvonalak",
|
"downloads_path": "Letöltési útvonalak",
|
||||||
@@ -669,7 +681,7 @@
|
|||||||
"no_blocked_users": "Nincs letiltott felhasználó",
|
"no_blocked_users": "Nincs letiltott felhasználó",
|
||||||
"friend_code_copied": "Barát kód kimásolva",
|
"friend_code_copied": "Barát kód kimásolva",
|
||||||
"undo_friendship_modal_text": "Ezáltal megszünteted a barátságod vele: {{displayName}}",
|
"undo_friendship_modal_text": "Ezáltal megszünteted a barátságod vele: {{displayName}}",
|
||||||
"privacy_hint": "Hogy beállítsd ki láthassa ezt, menj a <0>Beállítások</0> menüjébe",
|
"privacy_hint": "Hogy beállítsd ki láthassa ezt, menj a <0>Beállításokba</0>",
|
||||||
"locked_profile": "Ez a profil privát",
|
"locked_profile": "Ez a profil privát",
|
||||||
"image_process_failure": "Hiba a kép feldolgozása közben",
|
"image_process_failure": "Hiba a kép feldolgozása közben",
|
||||||
"required_field": "Ez a mező kötelező",
|
"required_field": "Ez a mező kötelező",
|
||||||
|
|||||||
@@ -408,7 +408,9 @@
|
|||||||
"delete_archive_title": "Deseja deletar {{fileName}}?",
|
"delete_archive_title": "Deseja deletar {{fileName}}?",
|
||||||
"delete_archive_description": "O arquivo foi extraído com sucesso e não é mais necessário.",
|
"delete_archive_description": "O arquivo foi extraído com sucesso e não é mais necessário.",
|
||||||
"yes": "Sim",
|
"yes": "Sim",
|
||||||
"no": "Não"
|
"no": "Não",
|
||||||
|
"network": "REDE",
|
||||||
|
"peak": "PICO"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Diretório dos downloads",
|
"downloads_path": "Diretório dos downloads",
|
||||||
|
|||||||
@@ -1,5 +1,21 @@
|
|||||||
@use "../../scss/globals.scss";
|
@use "../../scss/globals.scss";
|
||||||
|
|
||||||
|
.fullscreen-media-modal__overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: rgba(0, 0, 0, 0.8);
|
||||||
|
backdrop-filter: blur(2px);
|
||||||
|
z-index: globals.$backdrop-z-index;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.fullscreen-media-modal {
|
.fullscreen-media-modal {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -7,12 +23,17 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
position: relative;
|
position: relative;
|
||||||
background-color: rgba(0, 0, 0, 0.5);
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
max-width: none;
|
||||||
|
max-height: none;
|
||||||
|
|
||||||
&__close-button {
|
&__close-button {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: calc(globals.$spacing-unit * 4);
|
top: calc(globals.$spacing-unit * 5);
|
||||||
right: calc(globals.$spacing-unit * 3);
|
right: calc(globals.$spacing-unit * 4);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
color: globals.$body-color;
|
color: globals.$body-color;
|
||||||
background-color: rgba(0, 0, 0, 0.5);
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { createPortal } from "react-dom";
|
|||||||
import { XIcon } from "@primer/octicons-react";
|
import { XIcon } from "@primer/octicons-react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
import { Backdrop } from "../backdrop/backdrop";
|
|
||||||
import "./fullscreen-media-modal.scss";
|
import "./fullscreen-media-modal.scss";
|
||||||
|
|
||||||
export interface FullscreenMediaModalProps {
|
export interface FullscreenMediaModalProps {
|
||||||
@@ -64,7 +63,7 @@ export function FullscreenMediaModal({
|
|||||||
if (!visible || !src) return null;
|
if (!visible || !src) return null;
|
||||||
|
|
||||||
return createPortal(
|
return createPortal(
|
||||||
<Backdrop>
|
<div className="fullscreen-media-modal__overlay">
|
||||||
<dialog className="fullscreen-media-modal" open aria-label={alt}>
|
<dialog className="fullscreen-media-modal" open aria-label={alt}>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -82,7 +81,7 @@ export function FullscreenMediaModal({
|
|||||||
<img src={src} alt={alt} className="fullscreen-media-modal__image" />
|
<img src={src} alt={alt} className="fullscreen-media-modal__image" />
|
||||||
</div>
|
</div>
|
||||||
</dialog>
|
</dialog>
|
||||||
</Backdrop>,
|
</div>,
|
||||||
document.body
|
document.body
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ export interface DownloadState {
|
|||||||
gameId: string | null;
|
gameId: string | null;
|
||||||
gamesWithDeletionInProgress: string[];
|
gamesWithDeletionInProgress: string[];
|
||||||
extraction: ExtractionInfo | null;
|
extraction: ExtractionInfo | null;
|
||||||
|
peakSpeeds: Record<string, number>;
|
||||||
|
speedHistory: Record<string, number[]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const initialState: DownloadState = {
|
const initialState: DownloadState = {
|
||||||
@@ -19,6 +21,8 @@ const initialState: DownloadState = {
|
|||||||
gameId: null,
|
gameId: null,
|
||||||
gamesWithDeletionInProgress: [],
|
gamesWithDeletionInProgress: [],
|
||||||
extraction: null,
|
extraction: null,
|
||||||
|
peakSpeeds: {},
|
||||||
|
speedHistory: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const downloadSlice = createSlice({
|
export const downloadSlice = createSlice({
|
||||||
@@ -28,6 +32,27 @@ export const downloadSlice = createSlice({
|
|||||||
setLastPacket: (state, action: PayloadAction<DownloadProgress | null>) => {
|
setLastPacket: (state, action: PayloadAction<DownloadProgress | null>) => {
|
||||||
state.lastPacket = action.payload;
|
state.lastPacket = action.payload;
|
||||||
if (!state.gameId && action.payload) state.gameId = action.payload.gameId;
|
if (!state.gameId && action.payload) state.gameId = action.payload.gameId;
|
||||||
|
|
||||||
|
// Track peak speed and speed history atomically when packet arrives
|
||||||
|
if (action.payload?.gameId && action.payload.downloadSpeed != null) {
|
||||||
|
const { gameId, downloadSpeed } = action.payload;
|
||||||
|
|
||||||
|
// Update peak speed if this is higher
|
||||||
|
const currentPeak = state.peakSpeeds[gameId] || 0;
|
||||||
|
if (downloadSpeed > currentPeak) {
|
||||||
|
state.peakSpeeds[gameId] = downloadSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update speed history for chart
|
||||||
|
if (!state.speedHistory[gameId]) {
|
||||||
|
state.speedHistory[gameId] = [];
|
||||||
|
}
|
||||||
|
state.speedHistory[gameId].push(downloadSpeed);
|
||||||
|
// Keep only last 120 entries
|
||||||
|
if (state.speedHistory[gameId].length > 120) {
|
||||||
|
state.speedHistory[gameId].shift();
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
clearDownload: (state) => {
|
clearDownload: (state) => {
|
||||||
state.lastPacket = null;
|
state.lastPacket = null;
|
||||||
@@ -62,6 +87,20 @@ export const downloadSlice = createSlice({
|
|||||||
clearExtraction: (state) => {
|
clearExtraction: (state) => {
|
||||||
state.extraction = null;
|
state.extraction = null;
|
||||||
},
|
},
|
||||||
|
updatePeakSpeed: (
|
||||||
|
state,
|
||||||
|
action: PayloadAction<{ gameId: string; speed: number }>
|
||||||
|
) => {
|
||||||
|
const { gameId, speed } = action.payload;
|
||||||
|
const currentPeak = state.peakSpeeds[gameId] || 0;
|
||||||
|
if (speed > currentPeak) {
|
||||||
|
state.peakSpeeds[gameId] = speed;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
clearPeakSpeed: (state, action: PayloadAction<string>) => {
|
||||||
|
state.peakSpeeds[action.payload] = 0;
|
||||||
|
state.speedHistory[action.payload] = [];
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -72,4 +111,6 @@ export const {
|
|||||||
removeGameFromDeleting,
|
removeGameFromDeleting,
|
||||||
setExtractionProgress,
|
setExtractionProgress,
|
||||||
clearExtraction,
|
clearExtraction,
|
||||||
|
updatePeakSpeed,
|
||||||
|
clearPeakSpeed,
|
||||||
} = downloadSlice.actions;
|
} = downloadSlice.actions;
|
||||||
|
|||||||
@@ -412,10 +412,12 @@ function HeroDownloadView({
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{game.download?.downloader && (
|
{game.download?.downloader !== undefined && (
|
||||||
<div className="download-group__stat-item">
|
<div className="download-group__stat-item">
|
||||||
<div className="download-group__stat-content">
|
<div className="download-group__stat-content">
|
||||||
<Badge>{DOWNLOADER_NAME[game.download.downloader]}</Badge>
|
<Badge>
|
||||||
|
{DOWNLOADER_NAME[Number(game.download.downloader)]}
|
||||||
|
</Badge>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -512,8 +514,9 @@ export function DownloadGroup({
|
|||||||
|
|
||||||
const { formatDistance } = useDate();
|
const { formatDistance } = useDate();
|
||||||
|
|
||||||
const [peakSpeeds, setPeakSpeeds] = useState<Record<string, number>>({});
|
// Get speed history and peak speeds from Redux (centralized state)
|
||||||
const speedHistoryRef = useRef<Record<string, number[]>>({});
|
const speedHistory = useAppSelector((state) => state.download.speedHistory);
|
||||||
|
const peakSpeeds = useAppSelector((state) => state.download.peakSpeeds);
|
||||||
const [dominantColors, setDominantColors] = useState<Record<string, string>>(
|
const [dominantColors, setDominantColors] = useState<Record<string, string>>(
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
@@ -576,68 +579,8 @@ export function DownloadGroup({
|
|||||||
});
|
});
|
||||||
}, [library, lastPacket?.gameId]);
|
}, [library, lastPacket?.gameId]);
|
||||||
|
|
||||||
useEffect(() => {
|
// Speed history and peak speeds are now tracked in Redux (in setLastPacket reducer)
|
||||||
if (lastPacket?.gameId && lastPacket.downloadSpeed !== undefined) {
|
// No local effect needed - data is updated atomically when packets arrive
|
||||||
const gameId = lastPacket.gameId;
|
|
||||||
|
|
||||||
const currentPeak = peakSpeeds[gameId] || 0;
|
|
||||||
if (lastPacket.downloadSpeed > currentPeak) {
|
|
||||||
setPeakSpeeds((prev) => ({
|
|
||||||
...prev,
|
|
||||||
[gameId]: lastPacket.downloadSpeed,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!speedHistoryRef.current[gameId]) {
|
|
||||||
speedHistoryRef.current[gameId] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
speedHistoryRef.current[gameId].push(lastPacket.downloadSpeed);
|
|
||||||
|
|
||||||
if (speedHistoryRef.current[gameId].length > 120) {
|
|
||||||
speedHistoryRef.current[gameId].shift();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [lastPacket?.gameId, lastPacket?.downloadSpeed, peakSpeeds]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
for (const game of library) {
|
|
||||||
if (
|
|
||||||
game.download &&
|
|
||||||
game.download.progress < 0.01 &&
|
|
||||||
game.download.status !== "paused"
|
|
||||||
) {
|
|
||||||
// Fresh download - clear any old data
|
|
||||||
if (speedHistoryRef.current[game.id]?.length > 0) {
|
|
||||||
speedHistoryRef.current[game.id] = [];
|
|
||||||
setPeakSpeeds((prev) => ({ ...prev, [game.id]: 0 }));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [library]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const timeouts: NodeJS.Timeout[] = [];
|
|
||||||
|
|
||||||
for (const game of library) {
|
|
||||||
if (
|
|
||||||
game.download?.progress === 1 &&
|
|
||||||
speedHistoryRef.current[game.id]?.length > 0
|
|
||||||
) {
|
|
||||||
const timeout = setTimeout(() => {
|
|
||||||
speedHistoryRef.current[game.id] = [];
|
|
||||||
setPeakSpeeds((prev) => ({ ...prev, [game.id]: 0 }));
|
|
||||||
}, 10_000);
|
|
||||||
timeouts.push(timeout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
for (const timeout of timeouts) {
|
|
||||||
clearTimeout(timeout);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}, [library]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (library.length > 0 && title === t("download_in_progress")) {
|
if (library.length > 0 && title === t("download_in_progress")) {
|
||||||
@@ -842,7 +785,14 @@ export function DownloadGroup({
|
|||||||
? (lastPacket?.downloadSpeed ?? 0)
|
? (lastPacket?.downloadSpeed ?? 0)
|
||||||
: 0;
|
: 0;
|
||||||
const finalDownloadSize = getFinalDownloadSize(game);
|
const finalDownloadSize = getFinalDownloadSize(game);
|
||||||
const peakSpeed = peakSpeeds[game.id] || 0;
|
// Use lastPacket.gameId for lookup since that's the key used to store the data
|
||||||
|
// Fall back to game.id if lastPacket is not available
|
||||||
|
const dataKey = lastPacket?.gameId ?? game.id;
|
||||||
|
const gameSpeedHistory = speedHistory[dataKey] ?? [];
|
||||||
|
const storedPeak = peakSpeeds[dataKey];
|
||||||
|
// Use stored peak if available and > 0, otherwise use current speed as initial value
|
||||||
|
const peakSpeed =
|
||||||
|
storedPeak !== undefined && storedPeak > 0 ? storedPeak : downloadSpeed;
|
||||||
|
|
||||||
let currentProgress = game.download?.progress || 0;
|
let currentProgress = game.download?.progress || 0;
|
||||||
if (isGameExtracting) {
|
if (isGameExtracting) {
|
||||||
@@ -864,7 +814,7 @@ export function DownloadGroup({
|
|||||||
currentProgress={currentProgress}
|
currentProgress={currentProgress}
|
||||||
dominantColor={dominantColor}
|
dominantColor={dominantColor}
|
||||||
lastPacket={lastPacket}
|
lastPacket={lastPacket}
|
||||||
speedHistory={speedHistoryRef.current[game.id] || []}
|
speedHistory={gameSpeedHistory}
|
||||||
formatSpeed={formatSpeed}
|
formatSpeed={formatSpeed}
|
||||||
calculateETA={calculateETA}
|
calculateETA={calculateETA}
|
||||||
pauseDownload={pauseDownload}
|
pauseDownload={pauseDownload}
|
||||||
@@ -908,7 +858,9 @@ export function DownloadGroup({
|
|||||||
</button>
|
</button>
|
||||||
<div className="download-group__simple-meta">
|
<div className="download-group__simple-meta">
|
||||||
<div className="download-group__simple-meta-row">
|
<div className="download-group__simple-meta-row">
|
||||||
<Badge>{DOWNLOADER_NAME[game.download!.downloader]}</Badge>
|
<Badge>
|
||||||
|
{DOWNLOADER_NAME[Number(game.download!.downloader)]}
|
||||||
|
</Badge>
|
||||||
</div>
|
</div>
|
||||||
<div className="download-group__simple-meta-row">
|
<div className="download-group__simple-meta-row">
|
||||||
{extraction?.visibleId === game.id ? (
|
{extraction?.visibleId === game.id ? (
|
||||||
|
|||||||
Reference in New Issue
Block a user