From 1520e2b2ae10972c136a229397ea736c37fd5a83 Mon Sep 17 00:00:00 2001 From: Chubby Granny Chaser Date: Sun, 6 Apr 2025 22:13:26 +0100 Subject: [PATCH] feat: adding optional common redist install --- src/locales/en/translation.json | 5 +++- src/locales/pt-BR/translation.json | 5 +++- src/main/events/index.ts | 1 + .../events/misc/can-install-common-redist.ts | 7 +++++ src/main/services/common-redist-manager.ts | 4 +++ src/preload/index.ts | 1 + src/renderer/src/declaration.d.ts | 1 + .../src/pages/settings/settings-general.scss | 6 +++- .../src/pages/settings/settings-general.tsx | 28 +++++++++++++++---- 9 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 src/main/events/misc/can-install-common-redist.ts diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index f8e7a0d1..ab89a616 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -350,7 +350,10 @@ "error_importing_theme": "Error importing theme", "theme_imported": "Theme imported successfully", "enable_friend_request_notifications": "When a friend request is received", - "enable_auto_install": "Download updates automatically" + "enable_auto_install": "Download updates automatically", + "common_redist": "Common redistributables", + "common_redist_description": "Common redistributables are required to run some games. Installing them is recommended to avoid issues.", + "install_common_redist": "Install" }, "notifications": { "download_complete": "Download complete", diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json index 00c55da2..2adc0d1d 100644 --- a/src/locales/pt-BR/translation.json +++ b/src/locales/pt-BR/translation.json @@ -334,7 +334,10 @@ "error_importing_theme": "Erro ao importar tema", "theme_imported": "Tema importado com sucesso", "enable_friend_request_notifications": "Quando um pedido de amizade é recebido", - "enable_auto_install": "Baixar atualizações automaticamente" + "enable_auto_install": "Baixar atualizações automaticamente", + "common_redist": "Componentes recomendados", + "common_redist_description": "Componentes recomendados são necessários para executar alguns jogos. A instalação deles é recomendada para evitar problemas.", + "install_common_redist": "Instalar" }, "notifications": { "download_complete": "Download concluído", diff --git a/src/main/events/index.ts b/src/main/events/index.ts index d2ced3de..8465843f 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -40,6 +40,7 @@ import "./misc/get-features"; import "./misc/show-item-in-folder"; import "./misc/get-badges"; import "./misc/install-common-redist"; +import "./misc/can-install-common-redist"; import "./torrenting/cancel-game-download"; import "./torrenting/pause-game-download"; import "./torrenting/resume-game-download"; diff --git a/src/main/events/misc/can-install-common-redist.ts b/src/main/events/misc/can-install-common-redist.ts new file mode 100644 index 00000000..e2303966 --- /dev/null +++ b/src/main/events/misc/can-install-common-redist.ts @@ -0,0 +1,7 @@ +import { registerEvent } from "../register-event"; +import { CommonRedistManager } from "@main/services/common-redist-manager"; + +const canInstallCommonRedist = async (_event: Electron.IpcMainInvokeEvent) => + CommonRedistManager.canInstallCommonRedist(); + +registerEvent("canInstallCommonRedist", canInstallCommonRedist); diff --git a/src/main/services/common-redist-manager.ts b/src/main/services/common-redist-manager.ts index d23306da..cb9753a0 100644 --- a/src/main/services/common-redist-manager.ts +++ b/src/main/services/common-redist-manager.ts @@ -39,6 +39,10 @@ export class CommonRedistManager { const installationCompleteMessage = "Installation complete"; + if (!fs.existsSync(this.installationLog)) { + await fs.promises.writeFile(this.installationLog, ""); + } + fs.watch(this.installationLog, { signal: abortController.signal }, () => { fs.readFile(this.installationLog, "utf-8", (err, data) => { if (err) return logger.error("Error reading log file:", err); diff --git a/src/preload/index.ts b/src/preload/index.ts index 8d5e2e8d..01b0b9e6 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -295,6 +295,7 @@ contextBridge.exposeInMainWorld("electron", { ipcRenderer.invoke("showItemInFolder", path), getFeatures: () => ipcRenderer.invoke("getFeatures"), getBadges: () => ipcRenderer.invoke("getBadges"), + canInstallCommonRedist: () => ipcRenderer.invoke("canInstallCommonRedist"), installCommonRedist: () => ipcRenderer.invoke("installCommonRedist"), platform: process.platform, diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index 566e86d3..2fe336ae 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -234,6 +234,7 @@ declare global { showItemInFolder: (path: string) => Promise; getFeatures: () => Promise; getBadges: () => Promise; + canInstallCommonRedist: () => Promise; installCommonRedist: () => Promise; onCommonRedistProgress: ( cb: (value: { component: string; complete: boolean }) => void diff --git a/src/renderer/src/pages/settings/settings-general.scss b/src/renderer/src/pages/settings/settings-general.scss index 01f5e693..03798462 100644 --- a/src/renderer/src/pages/settings/settings-general.scss +++ b/src/renderer/src/pages/settings/settings-general.scss @@ -5,8 +5,12 @@ flex-direction: column; gap: globals.$spacing-unit * 2; - &__notifications-title { + &__section-title { margin-top: calc(globals.$spacing-unit * 2); margin-bottom: globals.$spacing-unit; } + + &__common-redist-button { + align-self: flex-start; + } } diff --git a/src/renderer/src/pages/settings/settings-general.tsx b/src/renderer/src/pages/settings/settings-general.tsx index 46662358..32b70614 100644 --- a/src/renderer/src/pages/settings/settings-general.tsx +++ b/src/renderer/src/pages/settings/settings-general.tsx @@ -12,6 +12,7 @@ import languageResources from "@locales"; import { orderBy } from "lodash-es"; import { settingsContext } from "@renderer/context"; import "./settings-general.scss"; +import { DesktopDownloadIcon } from "@primer/octicons-react"; interface LanguageOption { option: string; @@ -27,6 +28,8 @@ export function SettingsGeneral() { (state) => state.userPreferences.value ); + const [canInstallCommonRedist, setCanInstallCommonRedist] = useState(false); + const [form, setForm] = useState({ downloadsPath: "", downloadNotificationsEnabled: false, @@ -47,6 +50,10 @@ export function SettingsGeneral() { setDefaultDownloadsPath(path); }); + window.electron.canInstallCommonRedist().then((canInstall) => { + setCanInstallCommonRedist(canInstall); + }); + setLanguageOptions( orderBy( Object.entries(languageResources).map(([language, value]) => { @@ -90,7 +97,9 @@ export function SettingsGeneral() { } }, [userPreferences, defaultDownloadsPath]); - const handleLanguageChange = (event) => { + const handleLanguageChange = ( + event: React.ChangeEvent + ) => { const value = event.target.value; handleChange({ language: value }); @@ -139,9 +148,7 @@ export function SettingsGeneral() { }))} /> -

- {t("notifications")} -

+

{t("notifications")}

-