Merge branch 'feature/profile-redesign' of github.com:hydralauncher/hydra into feature/profile-redesign

This commit is contained in:
Chubby Granny Chaser 2024-09-14 21:00:02 +01:00
commit 5432ef311a
No known key found for this signature in database
9 changed files with 85 additions and 25 deletions

View File

@ -126,7 +126,9 @@
"stats": "Stats",
"download_count": "Downloads",
"player_count": "Active players",
"download_error": "This download option is not available"
"download_error": "This download option is not available",
"download": "Download",
"executable_path_in_use": "Executable already in use by \"{{game}}\""
},
"activation": {
"title": "Activate Hydra",

View File

@ -122,7 +122,9 @@
"stats": "Estatísticas",
"download_count": "Downloads",
"player_count": "Jogadores ativos",
"download_error": "Essa opção de download falhou"
"download_error": "Essa opção de download falhou",
"download": "Baixar",
"executable_path_in_use": "Executável em uso por \"{{game}}\""
},
"activation": {
"title": "Ativação",

View File

@ -111,7 +111,9 @@
"download_paused": "Transferência pausada",
"last_downloaded_option": "Última opção transferida",
"create_shortcut_success": "Atalho criado com sucesso",
"create_shortcut_error": "Erro ao criar atalho"
"create_shortcut_error": "Erro ao criar atalho",
"download": "Transferir",
"executable_path_in_use": "Executável em uso por \"{{game}}\""
},
"activation": {
"title": "Ativação",

View File

@ -22,6 +22,7 @@ import "./library/open-game-executable-path";
import "./library/open-game-installer";
import "./library/open-game-installer-path";
import "./library/update-executable-path";
import "./library/verify-executable-path";
import "./library/remove-game";
import "./library/remove-game-from-library";
import "./misc/open-external";

View File

@ -0,0 +1,13 @@
import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
const verifyExecutablePathInUse = async (
_event: Electron.IpcMainInvokeEvent,
executablePath: string
) => {
return gameRepository.findOne({
where: { executablePath },
});
};
registerEvent("verifyExecutablePathInUse", verifyExecutablePathInUse);

View File

@ -75,6 +75,8 @@ contextBridge.exposeInMainWorld("electron", {
ipcRenderer.invoke("createGameShortcut", id),
updateExecutablePath: (id: number, executablePath: string) =>
ipcRenderer.invoke("updateExecutablePath", id, executablePath),
verifyExecutablePathInUse: (executablePath: string) =>
ipcRenderer.invoke("verifyExecutablePathInUse", executablePath),
getLibrary: () => ipcRenderer.invoke("getLibrary"),
openGameInstaller: (gameId: number) =>
ipcRenderer.invoke("openGameInstaller", gameId),

View File

@ -72,6 +72,7 @@ declare global {
) => Promise<void>;
createGameShortcut: (id: number) => Promise<boolean>;
updateExecutablePath: (id: number, executablePath: string) => Promise<void>;
verifyExecutablePathInUse: (executablePath: string) => Promise<Game>;
getLibrary: () => Promise<LibraryGame[]>;
openGameInstaller: (gameId: number) => Promise<boolean>;
openGameInstallerPath: (gameId: number) => Promise<boolean>;

View File

@ -6,6 +6,7 @@ import { useTranslation } from "react-i18next";
import * as styles from "./hero-panel-actions.css";
import { gameDetailsContext } from "@renderer/context";
import { DownloadIcon } from "@renderer/components/sidebar/download-icon";
export function HeroPanelActions() {
const [toggleLibraryGameDisabled, setToggleLibraryGameDisabled] =
@ -25,6 +26,11 @@ export function HeroPanelActions() {
selectGameExecutable,
} = useContext(gameDetailsContext);
const { lastPacket } = useDownload();
const isGameDownloading =
game?.status === "active" && lastPacket?.game.id === game?.id;
const { updateLibrary } = useLibrary();
const { t } = useTranslation("game_details");
@ -84,6 +90,47 @@ export function HeroPanelActions() {
</Button>
);
const gameActionButton = () => {
if (isGameRunning) {
return (
<Button
onClick={closeGame}
theme="outline"
disabled={deleting}
className={styles.heroPanelAction}
>
{t("close")}
</Button>
);
}
if (game?.executablePath) {
return (
<Button
onClick={openGame}
theme="outline"
disabled={deleting || isGameRunning}
className={styles.heroPanelAction}
>
<PlayIcon />
{t("play")}
</Button>
);
}
return (
<Button
onClick={() => setShowRepacksModal(true)}
theme="outline"
disabled={isGameDownloading || !repacks.length}
className={styles.heroPanelAction}
>
<DownloadIcon isDownloading={false} />
{t("download")}
</Button>
);
};
if (repacks.length && !game) {
return (
<>
@ -96,26 +143,7 @@ export function HeroPanelActions() {
if (game) {
return (
<div className={styles.actions}>
{isGameRunning ? (
<Button
onClick={closeGame}
theme="outline"
disabled={deleting}
className={styles.heroPanelAction}
>
{t("close")}
</Button>
) : (
<Button
onClick={openGame}
theme="outline"
disabled={deleting || isGameRunning}
className={styles.heroPanelAction}
>
<PlayIcon />
{t("play")}
</Button>
)}
{gameActionButton()}
<div className={styles.separator} />

View File

@ -57,8 +57,17 @@ export function GameOptionsModal({
const path = await selectGameExecutable();
if (path) {
await window.electron.updateExecutablePath(game.id, path);
updateGame();
const gameUsingPath =
await window.electron.verifyExecutablePathInUse(path);
if (gameUsingPath) {
showErrorToast(
t("executable_path_in_use", { game: gameUsingPath.title })
);
return;
}
window.electron.updateExecutablePath(game.id, path).then(updateGame);
}
};