From 2634bec29235eaa1728d69c50dc679fa23b18e8c Mon Sep 17 00:00:00 2001 From: Moyasee Date: Wed, 22 Oct 2025 22:49:07 +0300 Subject: [PATCH] feat: added open screenshots folder in settings-behavior --- src/locales/en/translation.json | 1 + src/main/events/index.ts | 4 +++- src/main/events/misc/open-folder.ts | 11 ++++++++++ src/preload/index.ts | 2 ++ .../user-profile/user-profile.context.tsx | 21 +++++++++++++------ src/renderer/src/declaration.d.ts | 2 ++ .../src/pages/settings/settings-behavior.scss | 4 ++++ .../src/pages/settings/settings-behavior.tsx | 14 ++++++++++++- 8 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 src/main/events/misc/open-folder.ts diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index efaab73a..c0514378 100755 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -526,6 +526,7 @@ "extract_files_by_default": "Extract files by default after download", "enable_steam_achievements": "Enable search for Steam achievements", "enable_achievement_screenshots": "Enable achievement screenshots", + "open_screenshots_directory": "Open screenshots directory", "achievement_custom_notification_position": "Achievement custom notification position", "top-left": "Top left", "top-center": "Top center", diff --git a/src/main/events/index.ts b/src/main/events/index.ts index 8d21aa11..1750cb30 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -1,4 +1,4 @@ -import { appVersion, defaultDownloadsPath, isStaging } from "@main/constants"; +import { appVersion, defaultDownloadsPath, isStaging, screenshotsPath } from "@main/constants"; import { ipcMain } from "electron"; import "./catalogue/get-game-shop-details"; @@ -38,6 +38,7 @@ import "./library/create-steam-shortcut"; import "./library/copy-custom-game-asset"; import "./misc/open-checkout"; import "./misc/open-external"; +import "./misc/open-folder"; import "./misc/show-open-dialog"; import "./misc/show-item-in-folder"; import "./misc/install-common-redist"; @@ -107,3 +108,4 @@ ipcMain.handle("getVersion", () => appVersion); ipcMain.handle("isStaging", () => isStaging); ipcMain.handle("isPortableVersion", () => isPortableVersion()); ipcMain.handle("getDefaultDownloadsPath", () => defaultDownloadsPath); +ipcMain.handle("getScreenshotsPath", () => screenshotsPath); diff --git a/src/main/events/misc/open-folder.ts b/src/main/events/misc/open-folder.ts new file mode 100644 index 00000000..1a6c4447 --- /dev/null +++ b/src/main/events/misc/open-folder.ts @@ -0,0 +1,11 @@ +import { shell } from "electron"; +import { registerEvent } from "../register-event"; + +const openFolder = async ( + _event: Electron.IpcMainInvokeEvent, + folderPath: string +) => { + return shell.openPath(folderPath); +}; + +registerEvent("openFolder", openFolder); \ No newline at end of file diff --git a/src/preload/index.ts b/src/preload/index.ts index da914b92..52fbcba5 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -344,9 +344,11 @@ contextBridge.exposeInMainWorld("electron", { ping: () => ipcRenderer.invoke("ping"), getVersion: () => ipcRenderer.invoke("getVersion"), getDefaultDownloadsPath: () => ipcRenderer.invoke("getDefaultDownloadsPath"), + getScreenshotsPath: () => ipcRenderer.invoke("getScreenshotsPath"), isStaging: () => ipcRenderer.invoke("isStaging"), isPortableVersion: () => ipcRenderer.invoke("isPortableVersion"), openExternal: (src: string) => ipcRenderer.invoke("openExternal", src), + openFolder: (path: string) => ipcRenderer.invoke("openFolder", path), openCheckout: () => ipcRenderer.invoke("openCheckout"), showOpenDialog: (options: Electron.OpenDialogOptions) => ipcRenderer.invoke("showOpenDialog", options), diff --git a/src/renderer/src/context/user-profile/user-profile.context.tsx b/src/renderer/src/context/user-profile/user-profile.context.tsx index d9d131d2..d5118792 100644 --- a/src/renderer/src/context/user-profile/user-profile.context.tsx +++ b/src/renderer/src/context/user-profile/user-profile.context.tsx @@ -1,6 +1,12 @@ import { darkenColor } from "@renderer/helpers"; import { useAppSelector, useToast } from "@renderer/hooks"; -import type { Badge, UserProfile, UserStats, UserGame, ProfileAchievement } from "@types"; +import type { + Badge, + UserProfile, + UserStats, + UserGame, + ProfileAchievement, +} from "@types"; import { average } from "color.js"; import { createContext, useCallback, useEffect, useState } from "react"; @@ -150,17 +156,19 @@ export function UserProfileContextProvider({ // Fetch achievements separately const achievementsPromise = window.electron.hydraApi - .get(`/users/${userId}/achievements?${params.toString()}`) + .get< + ProfileAchievement[] + >(`/users/${userId}/achievements?${params.toString()}`) .catch(() => null); // If achievements fail, just return null - return Promise.all([profilePromise, achievementsPromise]) - .then(([userProfile, achievements]) => { + return Promise.all([profilePromise, achievementsPromise]).then( + ([userProfile, achievements]) => { // Merge achievements into the profile const profileWithAchievements = { ...userProfile, achievements: achievements || null, }; - + setUserProfile(profileWithAchievements); if (userProfile.profileImageUrl) { @@ -168,7 +176,8 @@ export function UserProfileContextProvider({ (color) => setHeroBackground(color) ); } - }); + } + ); }, [ navigate, getUserStats, diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index 9f882aed..957cf3f6 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -276,7 +276,9 @@ declare global { isStaging: () => Promise; ping: () => string; getDefaultDownloadsPath: () => Promise; + getScreenshotsPath: () => Promise; isPortableVersion: () => Promise; + openFolder: (path: string) => Promise; showOpenDialog: ( options: Electron.OpenDialogOptions ) => Promise; diff --git a/src/renderer/src/pages/settings/settings-behavior.scss b/src/renderer/src/pages/settings/settings-behavior.scss index 2ebe3cc0..88453996 100644 --- a/src/renderer/src/pages/settings/settings-behavior.scss +++ b/src/renderer/src/pages/settings/settings-behavior.scss @@ -21,4 +21,8 @@ cursor: pointer; } } + + &__button-container { + margin-top: 16px; + } } diff --git a/src/renderer/src/pages/settings/settings-behavior.tsx b/src/renderer/src/pages/settings/settings-behavior.tsx index 61fcf1f8..9a2fc2fc 100644 --- a/src/renderer/src/pages/settings/settings-behavior.tsx +++ b/src/renderer/src/pages/settings/settings-behavior.tsx @@ -1,7 +1,7 @@ import { useContext, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import { CheckboxField } from "@renderer/components"; +import { CheckboxField, Button } from "@renderer/components"; import { useAppSelector } from "@renderer/hooks"; import { settingsContext } from "@renderer/context"; import "./settings-behavior.scss"; @@ -210,6 +210,18 @@ export function SettingsBehavior() { + +
+ +
); }