diff --git a/.env.example b/.env.example
index 34502a20..089c63ea 100644
--- a/.env.example
+++ b/.env.example
@@ -1,5 +1,4 @@
MAIN_VITE_API_URL=API_URL
MAIN_VITE_AUTH_URL=AUTH_URL
MAIN_VITE_STEAMGRIDDB_API_KEY=YOUR_API_KEY
-MAIN_VITE_SENTRY_DSN=YOUR_SENTRY_DSN
-SENTRY_AUTH_TOKEN=
+
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 539d1f0c..507e8e06 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -43,8 +43,6 @@ jobs:
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }}
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }}
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }}
- SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
- MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build Windows
@@ -54,8 +52,6 @@ jobs:
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }}
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }}
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }}
- SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
- MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create artifact
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index bc03a2db..754b4478 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -45,8 +45,6 @@ jobs:
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }}
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }}
- SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
- MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build Windows
@@ -56,8 +54,6 @@ jobs:
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }}
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }}
- SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
- MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create artifact
diff --git a/.gitignore b/.gitignore
index b9dcfecb..5645b3bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,5 +9,4 @@ out
*.log*
.env
.vite
-sentry.properties
ludusavi/
\ No newline at end of file
diff --git a/electron.vite.config.ts b/electron.vite.config.ts
index 60e6252f..be37cc40 100644
--- a/electron.vite.config.ts
+++ b/electron.vite.config.ts
@@ -6,16 +6,9 @@ import {
externalizeDepsPlugin,
} from "electron-vite";
import react from "@vitejs/plugin-react";
-import { sentryVitePlugin } from "@sentry/vite-plugin";
import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
import svgr from "vite-plugin-svgr";
-const sentryPlugin = sentryVitePlugin({
- authToken: process.env.SENTRY_AUTH_TOKEN,
- org: "hydra-launcher",
- project: "hydra-launcher",
-});
-
export default defineConfig(({ mode }) => {
loadEnv(mode);
@@ -35,7 +28,7 @@ export default defineConfig(({ mode }) => {
"@shared": resolve("src/shared"),
},
},
- plugins: [externalizeDepsPlugin(), swcPlugin(), sentryPlugin],
+ plugins: [externalizeDepsPlugin(), swcPlugin()],
},
preload: {
plugins: [externalizeDepsPlugin()],
@@ -51,7 +44,7 @@ export default defineConfig(({ mode }) => {
"@shared": resolve("src/shared"),
},
},
- plugins: [svgr(), react(), vanillaExtractPlugin(), sentryPlugin],
+ plugins: [svgr(), react(), vanillaExtractPlugin()],
},
};
});
diff --git a/package.json b/package.json
index d3be2a32..773e6df5 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,6 @@
"@hookform/resolvers": "^3.9.0",
"@primer/octicons-react": "^19.9.0",
"@reduxjs/toolkit": "^2.2.3",
- "@sentry/electron": "^5.1.0",
"@vanilla-extract/css": "^1.14.2",
"@vanilla-extract/dynamic": "^2.1.1",
"@vanilla-extract/recipes": "^0.5.2",
@@ -83,7 +82,6 @@
"@electron-toolkit/eslint-config-prettier": "^2.0.0",
"@electron-toolkit/eslint-config-ts": "^1.0.1",
"@electron-toolkit/tsconfig": "^1.0.1",
- "@sentry/vite-plugin": "^2.20.1",
"@swc/core": "^1.4.16",
"@types/auto-launch": "^5.0.5",
"@types/color": "^3.0.6",
diff --git a/sentry.properties b/sentry.properties
new file mode 100644
index 00000000..75209a67
--- /dev/null
+++ b/sentry.properties
@@ -0,0 +1,5 @@
+defaults.url=https://sentry.io/
+defaults.org=hydra-launcher
+defaults.project=hydra-launcher
+auth.token=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
+cli.executable=node_modules\\@sentry\\cli\\bin\\sentry-cli
diff --git a/src/main/events/auth/get-session-hash.ts b/src/main/events/auth/get-session-hash.ts
index 8fe68165..2a17bcf1 100644
--- a/src/main/events/auth/get-session-hash.ts
+++ b/src/main/events/auth/get-session-hash.ts
@@ -1,5 +1,4 @@
import jwt from "jsonwebtoken";
-import * as Sentry from "@sentry/electron/main";
import { userAuthRepository } from "@main/repository";
import { registerEvent } from "../register-event";
@@ -10,8 +9,6 @@ const getSessionHash = async (_event: Electron.IpcMainInvokeEvent) => {
if (!auth) return null;
const payload = jwt.decode(auth.accessToken) as jwt.JwtPayload;
- Sentry.setContext("sessionId", payload.sessionId);
-
return payload.sessionId;
};
diff --git a/src/main/events/auth/sign-out.ts b/src/main/events/auth/sign-out.ts
index ed399f6d..52fdf7a3 100644
--- a/src/main/events/auth/sign-out.ts
+++ b/src/main/events/auth/sign-out.ts
@@ -1,5 +1,4 @@
import { registerEvent } from "../register-event";
-import * as Sentry from "@sentry/electron/main";
import {
DownloadManager,
HydraApi,
@@ -29,9 +28,6 @@ const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
gamesPlaytime.clear();
});
- /* Removes user from Sentry */
- Sentry.setUser(null);
-
/* Cancels any ongoing downloads */
DownloadManager.cancelDownload();
diff --git a/src/main/index.ts b/src/main/index.ts
index 7f35c317..af11cd6b 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -1,5 +1,4 @@
import { app, BrowserWindow, net, protocol } from "electron";
-import { init } from "@sentry/electron/main";
import updater from "electron-updater";
import i18n from "i18next";
import path from "node:path";
@@ -26,12 +25,6 @@ autoUpdater.logger = logger;
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) app.quit();
-if (import.meta.env.MAIN_VITE_SENTRY_DSN) {
- init({
- dsn: import.meta.env.MAIN_VITE_SENTRY_DSN,
- });
-}
-
app.commandLine.appendSwitch("--no-sandbox");
i18n.init({
diff --git a/src/main/services/ludusavi.ts b/src/main/services/ludusavi.ts
index 746c6a22..55b1d116 100644
--- a/src/main/services/ludusavi.ts
+++ b/src/main/services/ludusavi.ts
@@ -24,6 +24,7 @@ export class Ludusavi {
workerData: {
binaryPath: this.binaryPath,
},
+ maxThreads: 1,
});
static async getConfig() {
diff --git a/src/main/services/user/get-user-data.ts b/src/main/services/user/get-user-data.ts
index c3ca6eb8..a283aecb 100644
--- a/src/main/services/user/get-user-data.ts
+++ b/src/main/services/user/get-user-data.ts
@@ -4,7 +4,6 @@ import {
userAuthRepository,
userSubscriptionRepository,
} from "@main/repository";
-import * as Sentry from "@sentry/electron/main";
import { UserNotLoggedInError } from "@shared";
import { logger } from "../logger";
@@ -39,8 +38,6 @@ export const getUserData = () => {
await userSubscriptionRepository.delete({ id: 1 });
}
- Sentry.setUser({ id: me.id, username: me.username });
-
return me;
})
.catch(async (err) => {
diff --git a/src/main/vite-env.d.ts b/src/main/vite-env.d.ts
index 698bb7db..c070dcc7 100644
--- a/src/main/vite-env.d.ts
+++ b/src/main/vite-env.d.ts
@@ -4,7 +4,6 @@ interface ImportMetaEnv {
readonly MAIN_VITE_STEAMGRIDDB_API_KEY: string;
readonly MAIN_VITE_API_URL: string;
readonly MAIN_VITE_AUTH_URL: string;
- readonly MAIN_VITE_SENTRY_DSN: string;
readonly MAIN_VITE_CHECKOUT_URL: string;
}
diff --git a/src/main/workers/ludusavi.worker.ts b/src/main/workers/ludusavi.worker.ts
index f101b8c9..dbe16968 100644
--- a/src/main/workers/ludusavi.worker.ts
+++ b/src/main/workers/ludusavi.worker.ts
@@ -5,8 +5,6 @@ import { workerData } from "node:worker_threads";
const { binaryPath } = workerData;
-let backupGameProcess: cp.ChildProcess | null = null;
-
export const backupGame = ({
title,
backupPath,
@@ -18,11 +16,6 @@ export const backupGame = ({
preview?: boolean;
winePrefix?: string;
}) => {
- if (backupGameProcess && !backupGameProcess.killed) {
- backupGameProcess.kill();
- backupGameProcess = null;
- }
-
return new Promise((resolve, reject) => {
const args = ["backup", title, "--api", "--force"];
@@ -30,16 +23,14 @@ export const backupGame = ({
if (backupPath) args.push("--path", backupPath);
if (winePrefix) args.push("--wine-prefix", winePrefix);
- backupGameProcess = cp.execFile(
+ cp.execFile(
binaryPath,
args,
(err: cp.ExecFileException | null, stdout: string) => {
if (err) {
- backupGameProcess = null;
return reject(err);
}
- backupGameProcess = null;
return resolve(JSON.parse(stdout) as LudusaviBackup);
}
);
diff --git a/src/renderer/src/components/badge/badge.css.ts b/src/renderer/src/components/badge/badge.css.ts
deleted file mode 100644
index 46cb7b87..00000000
--- a/src/renderer/src/components/badge/badge.css.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { style } from "@vanilla-extract/css";
-
-import { SPACING_UNIT } from "../../theme.css";
-
-export const badge = style({
- color: "#c0c1c7",
- fontSize: "10px",
- padding: `${SPACING_UNIT / 2}px ${SPACING_UNIT}px`,
- border: "solid 1px #c0c1c7",
- borderRadius: "4px",
- display: "flex",
- alignItems: "center",
-});
diff --git a/src/renderer/src/components/badge/badge.scss b/src/renderer/src/components/badge/badge.scss
new file mode 100644
index 00000000..f1ed89e9
--- /dev/null
+++ b/src/renderer/src/components/badge/badge.scss
@@ -0,0 +1,11 @@
+@use "../../scss/globals.scss";
+
+.badge {
+ color: globals.$muted-color;
+ font-size: 10px;
+ padding: calc(globals.$spacing-unit / 2) globals.$spacing-unit;
+ border: solid 1px globals.$border-color;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+}
diff --git a/src/renderer/src/components/badge/badge.tsx b/src/renderer/src/components/badge/badge.tsx
index 0ff34782..752a33ba 100644
--- a/src/renderer/src/components/badge/badge.tsx
+++ b/src/renderer/src/components/badge/badge.tsx
@@ -1,5 +1,6 @@
import React from "react";
-import * as styles from "./badge.css";
+
+import "./badge.scss";
export interface BadgeProps {
children: React.ReactNode;
@@ -7,7 +8,7 @@ export interface BadgeProps {
export function Badge({ children }: BadgeProps) {
return (
-
+
{children}
);
diff --git a/src/renderer/src/components/bottom-panel/bottom-panel.css.ts b/src/renderer/src/components/bottom-panel/bottom-panel.css.ts
deleted file mode 100644
index e70f3556..00000000
--- a/src/renderer/src/components/bottom-panel/bottom-panel.css.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { style } from "@vanilla-extract/css";
-
-import { SPACING_UNIT, vars } from "../../theme.css";
-
-export const bottomPanel = style({
- width: "100%",
- borderTop: `solid 1px ${vars.color.border}`,
- backgroundColor: vars.color.background,
- padding: `${SPACING_UNIT / 2}px ${SPACING_UNIT * 2}px`,
- display: "flex",
- alignItems: "center",
- transition: "all ease 0.2s",
- justifyContent: "space-between",
- position: "relative",
- zIndex: vars.zIndex.bottomPanel,
-});
-
-export const downloadsButton = style({
- color: vars.color.body,
- borderBottom: "1px solid transparent",
- ":hover": {
- borderBottom: `1px solid ${vars.color.body}`,
- cursor: "pointer",
- },
-});
diff --git a/src/renderer/src/components/bottom-panel/bottom-panel.scss b/src/renderer/src/components/bottom-panel/bottom-panel.scss
new file mode 100644
index 00000000..35a1a0ee
--- /dev/null
+++ b/src/renderer/src/components/bottom-panel/bottom-panel.scss
@@ -0,0 +1,24 @@
+@use "../../scss/globals.scss";
+
+.bottom-panel {
+ width: "100%";
+ border-top: solid 1px globals.$border-color;
+ background-color: globals.$background-color;
+ padding: calc(globals.$spacing-unit / 2) calc(globals.$spacing-unit * 2);
+ display: flex;
+ align-items: center;
+ transition: all ease 0.2s;
+ justify-content: space-between;
+ position: relative;
+ z-index: globals.$bottom-panel-z-index;
+
+ &__downloads-button {
+ color: globals.$body-color;
+ border-bottom: solid 1px transparent;
+
+ &:hover {
+ border-bottom: solid 1px globals.$body-color;
+ cursor: pointer;
+ }
+ }
+}
diff --git a/src/renderer/src/components/bottom-panel/bottom-panel.tsx b/src/renderer/src/components/bottom-panel/bottom-panel.tsx
index 0d28a26e..bf8f71d5 100644
--- a/src/renderer/src/components/bottom-panel/bottom-panel.tsx
+++ b/src/renderer/src/components/bottom-panel/bottom-panel.tsx
@@ -3,7 +3,7 @@ import { useTranslation } from "react-i18next";
import { useDownload, useUserDetails } from "@renderer/hooks";
-import * as styles from "./bottom-panel.css";
+import "./bottom-panel.scss";
import { useNavigate } from "react-router-dom";
import { VERSION_CODENAME } from "@renderer/constants";
@@ -72,10 +72,10 @@ export function BottomPanel() {
]);
return (
-