diff --git a/src/main/events/hardware/get-disk-free-space.ts b/src/main/events/hardware/get-disk-free-space.ts index 28dcafa2..427988d6 100644 --- a/src/main/events/hardware/get-disk-free-space.ts +++ b/src/main/events/hardware/get-disk-free-space.ts @@ -1,10 +1,9 @@ import checkDiskSpace from "check-disk-space"; import { registerEvent } from "../register-event"; -import { getDownloadsPath } from "../helpers/get-downloads-path"; -const getDiskFreeSpace = async (_event: Electron.IpcMainInvokeEvent) => - checkDiskSpace(await getDownloadsPath()); +const getDiskFreeSpace = async (_event: Electron.IpcMainInvokeEvent, path: string) => + checkDiskSpace(path); registerEvent(getDiskFreeSpace, { name: "getDiskFreeSpace", diff --git a/src/preload.ts b/src/preload.ts index ec36b67a..b01ab524 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -99,7 +99,7 @@ contextBridge.exposeInMainWorld("electron", { }, /* Hardware */ - getDiskFreeSpace: () => ipcRenderer.invoke("getDiskFreeSpace"), + getDiskFreeSpace: (path: string) => ipcRenderer.invoke("getDiskFreeSpace", path), /* Misc */ getOrCacheImage: (url: string) => ipcRenderer.invoke("getOrCacheImage", url), diff --git a/src/renderer/declaration.d.ts b/src/renderer/declaration.d.ts index f8d1018c..3184940a 100644 --- a/src/renderer/declaration.d.ts +++ b/src/renderer/declaration.d.ts @@ -76,7 +76,7 @@ declare global { ) => Promise; /* Hardware */ - getDiskFreeSpace: () => Promise; + getDiskFreeSpace: (path: string) => Promise; /* Misc */ getOrCacheImage: (url: string) => Promise; diff --git a/src/renderer/pages/game-details/game-details.tsx b/src/renderer/pages/game-details/game-details.tsx index aae3f267..9c9178bf 100644 --- a/src/renderer/pages/game-details/game-details.tsx +++ b/src/renderer/pages/game-details/game-details.tsx @@ -51,7 +51,6 @@ export function GameDetails() { const { t, i18n } = useTranslation("game_details"); const [showRepacksModal, setShowRepacksModal] = useState(false); - const [showSelectFolderModal, setShowSelectFolderModal] = useState(false); const randomGameObjectID = useRef(null); @@ -154,7 +153,6 @@ export function GameDetails() { ).then(() => { getGame(); setShowRepacksModal(false); - setShowSelectFolderModal(false); }); }; @@ -179,8 +177,6 @@ export function GameDetails() { visible={showRepacksModal} gameDetails={gameDetails} startDownload={handleStartDownload} - showSelectFolderModal={showSelectFolderModal} - setShowSelectFolderModal={setShowSelectFolderModal} onClose={() => setShowRepacksModal(false)} /> )} diff --git a/src/renderer/pages/game-details/repacks-modal.css.ts b/src/renderer/pages/game-details/repacks-modal.css.ts index c2568594..4133d1a7 100644 --- a/src/renderer/pages/game-details/repacks-modal.css.ts +++ b/src/renderer/pages/game-details/repacks-modal.css.ts @@ -16,3 +16,23 @@ export const repackButton = style({ color: vars.color.bodyText, padding: `${SPACING_UNIT * 2}px`, }); + +export const container = style({ + width: "100%", + display: "flex", + flexDirection: "column", + gap: `${SPACING_UNIT * 2}px`, + marginBottom: SPACING_UNIT * 2, + paddingBottom: SPACING_UNIT * 2, + borderBottom: `solid 1px ${vars.color.borderColor}`, +}); + +export const downloadsPathField = style({ + display: "flex", + gap: `${SPACING_UNIT * 2}px`, +}); + +export const hintText = style({ + fontSize: 12, + color: vars.color.bodyText, +}); \ No newline at end of file diff --git a/src/renderer/pages/game-details/repacks-modal.tsx b/src/renderer/pages/game-details/repacks-modal.tsx index 7908c486..33db267b 100644 --- a/src/renderer/pages/game-details/repacks-modal.tsx +++ b/src/renderer/pages/game-details/repacks-modal.tsx @@ -6,18 +6,16 @@ import type { GameRepack, ShopDetails } from "@types"; import * as styles from "./repacks-modal.css"; -import type { DiskSpace } from "check-disk-space"; -import { format } from "date-fns"; +import { useAppSelector } from "@renderer/hooks"; import { SPACING_UNIT } from "@renderer/theme.css"; import { formatBytes } from "@renderer/utils"; -import { useAppSelector } from "@renderer/hooks"; -import { SelectFolderModal } from "./select-folder-modal"; +import type { DiskSpace } from "check-disk-space"; +import { format } from "date-fns"; +import { Link } from "react-router-dom"; export interface RepacksModalProps { visible: boolean; gameDetails: ShopDetails; - showSelectFolderModal: boolean; - setShowSelectFolderModal: (value: boolean) => void; startDownload: (repackId: number, downloadPath: string) => Promise; onClose: () => void; } @@ -25,18 +23,13 @@ export interface RepacksModalProps { export function RepacksModal({ visible, gameDetails, - showSelectFolderModal, - setShowSelectFolderModal, startDownload, onClose, }: RepacksModalProps) { const [diskFreeSpace, setDiskFreeSpace] = useState(null); const [filteredRepacks, setFilteredRepacks] = useState([]); - const [repack, setRepack] = useState(null); - - const repackersFriendlyNames = useAppSelector( - (state) => state.repackersFriendlyNames.value - ); + const [selectedPath, setSelectedPath] = useState(""); + const [downloadStarting, setDownloadStarting] = useState(false); const { t } = useTranslation("game_details"); @@ -44,20 +37,22 @@ export function RepacksModal({ setFilteredRepacks(gameDetails.repacks); }, [gameDetails.repacks]); - const getDiskFreeSpace = () => { - window.electron.getDiskFreeSpace().then((result) => { - setDiskFreeSpace(result); - }); - }; + useEffect(() => { + visible && getDiskFreeSpace(selectedPath); + }, [selectedPath, visible]); useEffect(() => { - getDiskFreeSpace(); - }, [visible]); + Promise.all([ + window.electron.getDefaultDownloadsPath(), + window.electron.getUserPreferences(), + ]).then(([path, userPreferences]) => { + setSelectedPath(userPreferences?.downloadsPath || path); + }); + }, []); - const handleRepackClick = (repack: GameRepack) => { - setRepack(repack); - setShowSelectFolderModal(true); - }; + const repackersFriendlyNames = useAppSelector( + (state) => state.repackersFriendlyNames.value + ); const handleFilter: React.ChangeEventHandler = (event) => { setFilteredRepacks( @@ -69,6 +64,32 @@ export function RepacksModal({ ); }; + const handleChooseDownloadsPath = async () => { + const { filePaths } = await window.electron.showOpenDialog({ + defaultPath: selectedPath, + properties: ["openDirectory"], + }); + + if (filePaths && filePaths.length > 0) { + const path = filePaths[0]; + setSelectedPath(path); + } + }; + + const handleRepackClick = (repack: GameRepack) => { + setDownloadStarting(true); + startDownload(repack.id, selectedPath).finally(() => { + setDownloadStarting(false); + }); + }; + + const getDiskFreeSpace = (path: string) => { + window.electron.getDiskFreeSpace(path).then((result) => { + setDiskFreeSpace(result); + }); + }; + + return ( - setShowSelectFolderModal(false)} - gameDetails={gameDetails} - startDownload={startDownload} - repack={repack} - /> +
+
+ + + +
+

+ {t("select_folder_hint")}{" "} + + {t("hydra_settings")} + +

+
@@ -96,6 +141,7 @@ export function RepacksModal({ theme="dark" onClick={() => handleRepackClick(repack)} className={styles.repackButton} + disabled={downloadStarting} >

{repack.title}

diff --git a/src/renderer/pages/game-details/select-folder-modal.css.tsx b/src/renderer/pages/game-details/select-folder-modal.css.tsx deleted file mode 100644 index 7d32bccc..00000000 --- a/src/renderer/pages/game-details/select-folder-modal.css.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { style } from "@vanilla-extract/css"; -import { SPACING_UNIT, vars } from "@renderer/theme.css"; - -export const container = style({ - display: "flex", - flexDirection: "column", - gap: `${SPACING_UNIT * 2}px`, - width: "100%", -}); - -export const downloadsPathField = style({ - display: "flex", - gap: `${SPACING_UNIT * 2}px`, -}); - -export const hintText = style({ - fontSize: 12, - color: vars.color.bodyText, -}); diff --git a/src/renderer/pages/game-details/select-folder-modal.tsx b/src/renderer/pages/game-details/select-folder-modal.tsx deleted file mode 100644 index 4edfa6b1..00000000 --- a/src/renderer/pages/game-details/select-folder-modal.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { Button, Modal, TextField } from "@renderer/components"; -import { GameRepack, ShopDetails } from "@types"; -import { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; - -import * as styles from "./select-folder-modal.css"; -import { Link } from "react-router-dom"; - -export interface SelectFolderModalProps { - visible: boolean; - gameDetails: ShopDetails; - onClose: () => void; - startDownload: (repackId: number, downloadPath: string) => Promise; - repack: GameRepack; -} - -export function SelectFolderModal({ - visible, - gameDetails, - onClose, - startDownload, - repack, -}: SelectFolderModalProps) { - const { t } = useTranslation("game_details"); - - const [selectedPath, setSelectedPath] = useState(""); - const [downloadStarting, setDownloadStarting] = useState(false); - - useEffect(() => { - Promise.all([ - window.electron.getDefaultDownloadsPath(), - window.electron.getUserPreferences(), - ]).then(([path, userPreferences]) => { - setSelectedPath(userPreferences?.downloadsPath || path); - }); - }, []); - - const handleChooseDownloadsPath = async () => { - const { filePaths } = await window.electron.showOpenDialog({ - defaultPath: selectedPath, - properties: ["openDirectory"], - }); - - if (filePaths && filePaths.length > 0) { - const path = filePaths[0]; - setSelectedPath(path); - } - }; - - const handleStartClick = () => { - setDownloadStarting(true); - startDownload(repack.id, selectedPath).finally(() => { - setDownloadStarting(false); - }); - }; - - return ( - -

-
- - - -
-

- {t("select_folder_hint")}{" "} - - {t("hydra_settings")} - -

- -
-
- ); -}