mirror of
https://github.com/hydralauncher/hydra.git
synced 2025-02-13 03:32:13 +00:00
Merge pull request #574 from hydralauncher/feature/delete-installation-folder-dont-set-game-as-removed
Feature/delete installation folder dont set game as removed
This commit is contained in:
commit
038cc377ec
5 changed files with 69 additions and 50 deletions
|
@ -1,8 +1,6 @@
|
|||
import path from "node:path";
|
||||
import fs from "node:fs";
|
||||
|
||||
import { In } from "typeorm";
|
||||
|
||||
import { gameRepository } from "@main/repository";
|
||||
|
||||
import { getDownloadsPath } from "../helpers/get-downloads-path";
|
||||
|
@ -14,11 +12,18 @@ const deleteGameFolder = async (
|
|||
gameId: number
|
||||
): Promise<void> => {
|
||||
const game = await gameRepository.findOne({
|
||||
where: {
|
||||
id: gameId,
|
||||
status: In(["removed", "complete"]),
|
||||
isDeleted: false,
|
||||
},
|
||||
where: [
|
||||
{
|
||||
id: gameId,
|
||||
isDeleted: false,
|
||||
status: "removed",
|
||||
},
|
||||
{
|
||||
id: gameId,
|
||||
progress: 1,
|
||||
isDeleted: false,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
if (!game) return;
|
||||
|
@ -29,22 +34,32 @@ const deleteGameFolder = async (
|
|||
game.folderName
|
||||
);
|
||||
|
||||
if (fs.existsSync(folderPath)) {
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.rm(
|
||||
folderPath,
|
||||
{ recursive: true, force: true, maxRetries: 5, retryDelay: 200 },
|
||||
(error) => {
|
||||
if (error) {
|
||||
logger.error(error);
|
||||
reject();
|
||||
}
|
||||
|
||||
resolve();
|
||||
}
|
||||
);
|
||||
});
|
||||
if (!fs.existsSync(folderPath)) {
|
||||
await gameRepository.update(
|
||||
{ id: gameId },
|
||||
{ downloadPath: null, folderName: null }
|
||||
);
|
||||
}
|
||||
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
fs.rm(
|
||||
folderPath,
|
||||
{ recursive: true, force: true, maxRetries: 5, retryDelay: 200 },
|
||||
(error) => {
|
||||
if (error) {
|
||||
logger.error(error);
|
||||
reject();
|
||||
}
|
||||
|
||||
resolve();
|
||||
}
|
||||
);
|
||||
}).then(async () => {
|
||||
await gameRepository.update(
|
||||
{ id: gameId },
|
||||
{ downloadPath: null, folderName: null }
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -30,6 +30,6 @@ export const getSteamAppDetails = async (
|
|||
})
|
||||
.catch((err) => {
|
||||
logger.error(err, { method: "getSteamAppDetails" });
|
||||
throw new Error(err);
|
||||
return null;
|
||||
});
|
||||
};
|
||||
|
|
|
@ -52,7 +52,6 @@ export function useDownload() {
|
|||
|
||||
try {
|
||||
await window.electron.deleteGameFolder(gameId);
|
||||
await window.electron.removeGame(gameId);
|
||||
updateLibrary();
|
||||
} finally {
|
||||
dispatch(removeGameFromDeleting(gameId));
|
||||
|
|
|
@ -47,17 +47,21 @@ export function Downloads() {
|
|||
complete: [],
|
||||
};
|
||||
|
||||
const result = library.reduce((prev, next) => {
|
||||
if (lastPacket?.game.id === next.id) {
|
||||
return { ...prev, downloading: [...prev.downloading, next] };
|
||||
}
|
||||
const result = library
|
||||
.filter((game) => {
|
||||
return game.downloadPath;
|
||||
})
|
||||
.reduce((prev, next) => {
|
||||
if (lastPacket?.game.id === next.id) {
|
||||
return { ...prev, downloading: [...prev.downloading, next] };
|
||||
}
|
||||
|
||||
if (next.downloadQueue || next.status === "paused") {
|
||||
return { ...prev, queued: [...prev.queued, next] };
|
||||
}
|
||||
if (next.downloadQueue || next.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,
|
||||
|
@ -66,7 +70,7 @@ export function Downloads() {
|
|||
);
|
||||
|
||||
const complete = orderBy(result.complete, (game) =>
|
||||
game.status === "complete" ? 0 : 1
|
||||
game.progress === 1 ? 0 : 1
|
||||
);
|
||||
|
||||
return {
|
||||
|
|
|
@ -110,11 +110,6 @@ export function HeroPanelActions() {
|
|||
return;
|
||||
}
|
||||
|
||||
if (game?.executablePath) {
|
||||
window.electron.openGame(game.id, game.executablePath);
|
||||
return;
|
||||
}
|
||||
|
||||
const gameExecutablePath = await selectGameExecutable();
|
||||
if (gameExecutablePath)
|
||||
window.electron.openGame(game.id, gameExecutablePath);
|
||||
|
@ -139,6 +134,17 @@ export function HeroPanelActions() {
|
|||
</Button>
|
||||
);
|
||||
|
||||
const showDownloadOptionsButton = (
|
||||
<Button
|
||||
onClick={openRepacksModal}
|
||||
theme="outline"
|
||||
disabled={deleting}
|
||||
className={styles.heroPanelAction}
|
||||
>
|
||||
{t("open_download_options")}
|
||||
</Button>
|
||||
);
|
||||
|
||||
if (game?.status === "active" && game?.progress !== 1) {
|
||||
return (
|
||||
<>
|
||||
|
@ -188,14 +194,7 @@ export function HeroPanelActions() {
|
|||
if (game?.status === "removed") {
|
||||
return (
|
||||
<>
|
||||
<Button
|
||||
onClick={openRepacksModal}
|
||||
theme="outline"
|
||||
disabled={deleting}
|
||||
className={styles.heroPanelAction}
|
||||
>
|
||||
{t("open_download_options")}
|
||||
</Button>
|
||||
{showDownloadOptionsButton}
|
||||
|
||||
<Button
|
||||
onClick={() => removeGameFromLibrary(game.id).then(updateGame)}
|
||||
|
@ -227,7 +226,7 @@ export function HeroPanelActions() {
|
|||
if (game) {
|
||||
return (
|
||||
<>
|
||||
{game?.progress === 1 ? (
|
||||
{game.progress === 1 && game.downloadPath && (
|
||||
<>
|
||||
<BinaryNotFoundModal
|
||||
visible={showBinaryNotFoundModal}
|
||||
|
@ -243,10 +242,12 @@ export function HeroPanelActions() {
|
|||
{t("install")}
|
||||
</Button>
|
||||
</>
|
||||
) : (
|
||||
toggleGameOnLibraryButton
|
||||
)}
|
||||
|
||||
{game.progress === 1 && !game.downloadPath && showDownloadOptionsButton}
|
||||
|
||||
{game.progress !== 1 && toggleGameOnLibraryButton}
|
||||
|
||||
{isGameRunning ? (
|
||||
<Button
|
||||
onClick={closeGame}
|
||||
|
|
Loading…
Reference in a new issue