From 07c277c0336d770656e969a95ca68b94dc563f2c Mon Sep 17 00:00:00 2001
From: Moyasee
Date: Sat, 3 Jan 2026 20:11:22 +0200
Subject: [PATCH 1/5] refactor: remove karma description from translations
across multiple languages
---
src/locales/en/translation.json | 1 -
src/locales/es/translation.json | 1 -
src/locales/fi/translation.json | 3 +--
src/locales/hu/translation.json | 1 -
src/locales/lv/translation.json | 3 +--
src/locales/pt-BR/translation.json | 1 -
src/locales/ru/translation.json | 1 -
src/locales/tr/translation.json | 1 -
src/locales/uk/translation.json | 3 +--
src/locales/zh/translation.json | 1 -
.../src/pages/profile/profile-content/add-friend-modal.scss | 2 ++
.../src/pages/profile/profile-content/user-stats-box.tsx | 5 -----
12 files changed, 5 insertions(+), 18 deletions(-)
diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json
index 07029def..9a266247 100755
--- a/src/locales/en/translation.json
+++ b/src/locales/en/translation.json
@@ -728,7 +728,6 @@
"game_added_to_pinned": "Game added to pinned",
"karma": "Karma",
"karma_count": "karma",
- "karma_description": "Earned from positive likes on reviews",
"user_reviews": "Reviews",
"delete_review": "Delete Review",
"loading_reviews": "Loading reviews...",
diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json
index 12dae377..fbbe33cd 100644
--- a/src/locales/es/translation.json
+++ b/src/locales/es/translation.json
@@ -710,7 +710,6 @@
"amount_minutes_short": "{{amount}}m",
"karma": "Karma",
"karma_count": "karma",
- "karma_description": "Conseguido por me gustas positivos en reseñas",
"sort_by": "Filtrar por:",
"game_added_to_pinned": "Juego añadido a fijados",
"user_reviews": "Reseñas",
diff --git a/src/locales/fi/translation.json b/src/locales/fi/translation.json
index fee3ff22..05268771 100644
--- a/src/locales/fi/translation.json
+++ b/src/locales/fi/translation.json
@@ -673,8 +673,7 @@
"game_removed_from_pinned": "Peli poistettu kiinnitetyistä",
"game_added_to_pinned": "Peli lisätty kiinnitettyihin",
"karma": "Karma",
- "karma_count": "karmaa",
- "karma_description": "Ansittu positiivisilla arvosteluäänillä"
+ "karma_count": "karmaa"
},
"achievement": {
"achievement_unlocked": "Saavutus avattu",
diff --git a/src/locales/hu/translation.json b/src/locales/hu/translation.json
index b83fec51..532c77e7 100644
--- a/src/locales/hu/translation.json
+++ b/src/locales/hu/translation.json
@@ -718,7 +718,6 @@
"game_added_to_pinned": "Játék hozzáadva a kitűzöttekhez",
"karma": "Karma",
"karma_count": "karma",
- "karma_description": "Pozitív értékelésekkel szerzett pontok",
"user_reviews": "Vélemények",
"delete_review": "Vélemény Törlése",
"loading_reviews": "Vélemények betöltése..."
diff --git a/src/locales/lv/translation.json b/src/locales/lv/translation.json
index 26aacb74..4b87dade 100644
--- a/src/locales/lv/translation.json
+++ b/src/locales/lv/translation.json
@@ -673,8 +673,7 @@
"game_removed_from_pinned": "Spēle dzēsta no piespraustajiem",
"game_added_to_pinned": "Spēle pievienota piespraustajiem",
"karma": "Karma",
- "karma_count": "karma",
- "karma_description": "Nopelnīta ar pozitīviem atsauksmju vērtējumiem"
+ "karma_count": "karma"
},
"achievement": {
"achievement_unlocked": "Sasniegums atbloķēts",
diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json
index 719f72f7..7499bfeb 100755
--- a/src/locales/pt-BR/translation.json
+++ b/src/locales/pt-BR/translation.json
@@ -720,7 +720,6 @@
"achievements_earned": "Conquistas recebidas",
"karma": "Karma",
"karma_count": "karma",
- "karma_description": "Ganho a partir de curtidas positivas em avaliações",
"manual_playtime_tooltip": "Este tempo de jogo foi atualizado manualmente",
"user_reviews": "Avaliações",
"loading_reviews": "Carregando avaliações...",
diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json
index 1cf7ae2f..f0b7f764 100644
--- a/src/locales/ru/translation.json
+++ b/src/locales/ru/translation.json
@@ -709,7 +709,6 @@
"game_added_to_pinned": "Игра добавлена в закрепленные",
"karma": "Карма",
"karma_count": "карма",
- "karma_description": "Заработана положительными оценками отзывов",
"user_reviews": "Отзывы",
"loading_reviews": "Загрузка отзывов...",
"no_reviews": "Пока нет отзывов",
diff --git a/src/locales/tr/translation.json b/src/locales/tr/translation.json
index 52e1f10f..94d12ee3 100644
--- a/src/locales/tr/translation.json
+++ b/src/locales/tr/translation.json
@@ -706,7 +706,6 @@
"game_added_to_pinned": "Oyun sabitlenmişlere eklendi",
"karma": "Karma",
"karma_count": "karma",
- "karma_description": "İncelemelerdeki olumlu beğenilerden kazanılır",
"user_reviews": "İncelemeler",
"delete_review": "İncelemeyi Sil",
"loading_reviews": "İncelemeler yükleniyor..."
diff --git a/src/locales/uk/translation.json b/src/locales/uk/translation.json
index 323d8ad5..32c79f9c 100644
--- a/src/locales/uk/translation.json
+++ b/src/locales/uk/translation.json
@@ -668,8 +668,7 @@
"game_removed_from_pinned": "Гру видалено із закріплених",
"game_added_to_pinned": "Гру додано до закріплених",
"karma": "Карма",
- "karma_count": "карма",
- "karma_description": "Зароблена позитивними оцінками на відгуках"
+ "karma_count": "карма"
},
"achievement": {
"achievement_unlocked": "Досягнення розблоковано",
diff --git a/src/locales/zh/translation.json b/src/locales/zh/translation.json
index bfc353d9..094a49ca 100644
--- a/src/locales/zh/translation.json
+++ b/src/locales/zh/translation.json
@@ -689,7 +689,6 @@
"game_removed_from_pinned": "游戏已从置顶移除",
"karma": "业力",
"karma_count": "业力值",
- "karma_description": "通过评论获得的点赞",
"loading_reviews": "正在加载评价...",
"manual_playtime_tooltip": "该游戏时长已手动更新",
"pinned": "已置顶",
diff --git a/src/renderer/src/pages/profile/profile-content/add-friend-modal.scss b/src/renderer/src/pages/profile/profile-content/add-friend-modal.scss
index 6e89ae1a..8d2a38dc 100644
--- a/src/renderer/src/pages/profile/profile-content/add-friend-modal.scss
+++ b/src/renderer/src/pages/profile/profile-content/add-friend-modal.scss
@@ -100,8 +100,10 @@
padding: calc(globals.$spacing-unit * 1.5);
background-color: rgba(255, 255, 255, 0.05);
border-radius: 8px;
+ border: none;
cursor: pointer;
transition: all ease 0.2s;
+ text-align: left;
&:hover {
background-color: rgba(255, 255, 255, 0.1);
diff --git a/src/renderer/src/pages/profile/profile-content/user-stats-box.tsx b/src/renderer/src/pages/profile/profile-content/user-stats-box.tsx
index 6fbabdca..8b61cdd6 100644
--- a/src/renderer/src/pages/profile/profile-content/user-stats-box.tsx
+++ b/src/renderer/src/pages/profile/profile-content/user-stats-box.tsx
@@ -123,11 +123,6 @@ export function UserStatsBox() {
{t("karma_count")}
-
-
- {t("karma_description")}
-
-
)}
From b2bffeb2b0fa4b5d824c2f81a7425d3992431734 Mon Sep 17 00:00:00 2001
From: Moyasee
Date: Sat, 3 Jan 2026 21:01:39 +0200
Subject: [PATCH 2/5] fix: update API endpoint for deleting friend requests in
useUserDetails hook
---
src/renderer/src/hooks/use-user-details.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/renderer/src/hooks/use-user-details.ts b/src/renderer/src/hooks/use-user-details.ts
index d8b9bbd2..eb374e28 100644
--- a/src/renderer/src/hooks/use-user-details.ts
+++ b/src/renderer/src/hooks/use-user-details.ts
@@ -111,7 +111,7 @@ export function useUserDetails() {
);
const undoFriendship = (userId: string) =>
- window.electron.hydraApi.delete(`/profile/friends/${userId}`);
+ window.electron.hydraApi.delete(`/profile/friend-requests/${userId}`);
const blockUser = (userId: string) =>
window.electron.hydraApi.post(`/users/${userId}/block`);
From 8b3bcd88b1a503b9cae14814ce1166b16b4aa2c5 Mon Sep 17 00:00:00 2001
From: Zamitto <167933696+zamitto@users.noreply.github.com>
Date: Sat, 3 Jan 2026 16:42:49 -0300
Subject: [PATCH 3/5] feat: add workwonders
---
package.json | 1 +
src/renderer/src/app.tsx | 57 ++++++++++++++++------
src/renderer/src/hooks/use-user-details.ts | 1 +
src/types/index.ts | 1 +
yarn.lock | 12 +++++
5 files changed, 56 insertions(+), 16 deletions(-)
diff --git a/package.json b/package.json
index bb74198f..e60f83f8 100644
--- a/package.json
+++ b/package.json
@@ -91,6 +91,7 @@
"user-agents": "^1.1.387",
"uuid": "^13.0.0",
"winreg": "^1.2.5",
+ "workwonders-sdk": "0.0.9",
"ws": "^8.18.1",
"yaml": "^2.6.1",
"yup": "^1.5.0"
diff --git a/src/renderer/src/app.tsx b/src/renderer/src/app.tsx
index 9334b5b9..376818d3 100644
--- a/src/renderer/src/app.tsx
+++ b/src/renderer/src/app.tsx
@@ -1,6 +1,6 @@
import { useCallback, useEffect, useRef, useState } from "react";
import { Sidebar, BottomPanel, Header, Toast } from "@renderer/components";
-
+import { WorkWondersSdk } from "workwonders-sdk";
import {
useAppDispatch,
useAppSelector,
@@ -52,6 +52,8 @@ export function App() {
const { clearDownload, setLastPacket } = useDownload();
+ const wokwondersRef = useRef(null);
+
const {
hasActiveSubscription,
fetchUserDetails,
@@ -114,7 +116,24 @@ export function App() {
return () => unsubscribe();
}, [updateLibrary]);
- useEffect(() => {
+ const setupWorkWonders = useCallback(
+ async (token?: string, locale?: string) => {
+ if (wokwondersRef.current) return;
+
+ wokwondersRef.current = new WorkWondersSdk();
+ await wokwondersRef.current.init({
+ organization: "hydra",
+ token,
+ locale,
+ });
+
+ await wokwondersRef.current.initChangelogWidget();
+ wokwondersRef.current.initChangelogWidgetMini();
+ },
+ [wokwondersRef]
+ );
+
+ const setupExternalResources = useCallback(async () => {
const cachedUserDetails = window.localStorage.getItem("userDetails");
if (cachedUserDetails) {
@@ -125,21 +144,26 @@ export function App() {
dispatch(setProfileBackground(profileBackground));
}
- fetchUserDetails()
- .then((response) => {
- if (response) {
- updateUserDetails(response);
- }
- })
- .finally(() => {
- if (document.getElementById("external-resources")) return;
+ const userPreferences = await window.electron.getUserPreferences();
+ const userDetails = await fetchUserDetails().catch(() => null);
- const $script = document.createElement("script");
- $script.id = "external-resources";
- $script.src = `${import.meta.env.RENDERER_VITE_EXTERNAL_RESOURCES_URL}/bundle.js?t=${Date.now()}`;
- document.head.appendChild($script);
- });
- }, [fetchUserDetails, updateUserDetails, dispatch]);
+ if (userDetails) {
+ updateUserDetails(userDetails);
+ }
+
+ setupWorkWonders(userDetails?.workwondersJwt, userPreferences?.language);
+
+ if (!document.getElementById("external-resources")) {
+ const $script = document.createElement("script");
+ $script.id = "external-resources";
+ $script.src = `${import.meta.env.RENDERER_VITE_EXTERNAL_RESOURCES_URL}/bundle.js?t=${Date.now()}`;
+ document.head.appendChild($script);
+ }
+ }, [fetchUserDetails, updateUserDetails, dispatch, setupWorkWonders]);
+
+ useEffect(() => {
+ setupExternalResources();
+ }, [setupExternalResources]);
const onSignIn = useCallback(() => {
fetchUserDetails().then((response) => {
@@ -203,6 +227,7 @@ export function App() {
useEffect(() => {
if (contentRef.current) contentRef.current.scrollTop = 0;
+ wokwondersRef.current?.notifyUrlChange();
}, [location.pathname, location.search]);
useEffect(() => {
diff --git a/src/renderer/src/hooks/use-user-details.ts b/src/renderer/src/hooks/use-user-details.ts
index d8b9bbd2..3a60be22 100644
--- a/src/renderer/src/hooks/use-user-details.ts
+++ b/src/renderer/src/hooks/use-user-details.ts
@@ -59,6 +59,7 @@ export function useUserDetails() {
username: userDetails?.username || "",
subscription: userDetails?.subscription || null,
featurebaseJwt: userDetails?.featurebaseJwt || "",
+ workwondersJwt: userDetails?.workwondersJwt || "",
karma: userDetails?.karma || 0,
});
},
diff --git a/src/types/index.ts b/src/types/index.ts
index de792b05..d3d36006 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -187,6 +187,7 @@ export interface UserDetails {
profileVisibility: ProfileVisibility;
bio: string;
featurebaseJwt: string;
+ workwondersJwt: string;
subscription: Subscription | null;
karma: number;
quirks?: {
diff --git a/yarn.lock b/yarn.lock
index 9d354966..9950f599 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6354,6 +6354,11 @@ keyv@^4.0.0, keyv@^4.5.3:
dependencies:
json-buffer "3.0.1"
+ky@^1.11.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/ky/-/ky-1.14.1.tgz#16f20b3bf3939abcc04e2a9613f47360fe5f64c9"
+ integrity sha512-hYje4L9JCmpEQBtudo+v52X5X8tgWXUYyPcxKSuxQNboqufecl9VMWjGiucAFH060AwPXHZuH+WB2rrqfkmafw==
+
language-subtag-registry@^0.3.20:
version "0.3.23"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7"
@@ -9123,6 +9128,13 @@ word-wrap@^1.2.5:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+workwonders-sdk@0.0.9:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/workwonders-sdk/-/workwonders-sdk-0.0.9.tgz#ec2cf8f47304cc9c52b273383443f3978cd381a1"
+ integrity sha512-ZhzOXL+/Vq9wCzneE8NUvL3RVIaFMygFtjO5BKXSXsP1iSq2jZ9l3xedmxwZyyTvMYN5t4oIwCwFE0NWujtH9A==
+ dependencies:
+ ky "^1.11.0"
+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
From 7ed514b6ef49e8bc3ac496e05836b3c6dbce5c16 Mon Sep 17 00:00:00 2001
From: Zamitto <167933696+zamitto@users.noreply.github.com>
Date: Sat, 3 Jan 2026 16:54:42 -0300
Subject: [PATCH 4/5] feat: parse locale before ww init
---
src/renderer/src/app.tsx | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/renderer/src/app.tsx b/src/renderer/src/app.tsx
index 376818d3..ac7ded9f 100644
--- a/src/renderer/src/app.tsx
+++ b/src/renderer/src/app.tsx
@@ -120,11 +120,16 @@ export function App() {
async (token?: string, locale?: string) => {
if (wokwondersRef.current) return;
+ const possibleLocales = ["en", "pt", "ru"];
+
+ const parsedLocale =
+ possibleLocales.find((l) => l === locale?.slice(0, 2)) ?? "en";
+
wokwondersRef.current = new WorkWondersSdk();
await wokwondersRef.current.init({
organization: "hydra",
token,
- locale,
+ locale: parsedLocale,
});
await wokwondersRef.current.initChangelogWidget();
From e52f10a5ff858c36bdfdac62652d706800c8cdd2 Mon Sep 17 00:00:00 2001
From: Zamitto <167933696+zamitto@users.noreply.github.com>
Date: Sat, 3 Jan 2026 17:17:16 -0300
Subject: [PATCH 5/5] chore: bump ww version
---
package.json | 2 +-
yarn.lock | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package.json b/package.json
index e60f83f8..99545c6e 100644
--- a/package.json
+++ b/package.json
@@ -91,7 +91,7 @@
"user-agents": "^1.1.387",
"uuid": "^13.0.0",
"winreg": "^1.2.5",
- "workwonders-sdk": "0.0.9",
+ "workwonders-sdk": "0.0.10",
"ws": "^8.18.1",
"yaml": "^2.6.1",
"yup": "^1.5.0"
diff --git a/yarn.lock b/yarn.lock
index 9950f599..d98c554d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -9128,10 +9128,10 @@ word-wrap@^1.2.5:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
-workwonders-sdk@0.0.9:
- version "0.0.9"
- resolved "https://registry.yarnpkg.com/workwonders-sdk/-/workwonders-sdk-0.0.9.tgz#ec2cf8f47304cc9c52b273383443f3978cd381a1"
- integrity sha512-ZhzOXL+/Vq9wCzneE8NUvL3RVIaFMygFtjO5BKXSXsP1iSq2jZ9l3xedmxwZyyTvMYN5t4oIwCwFE0NWujtH9A==
+workwonders-sdk@0.0.10:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/workwonders-sdk/-/workwonders-sdk-0.0.10.tgz#377167370a39c905c5228f8972c37c19004b7b21"
+ integrity sha512-bnswhlLRz1TCiqGV8l+VEOBej7u1SAkzLMEv6A60Sp0+S4j4pnmSve92KeOts/GYtUeNDuNM7fLPwZwMKY3sAg==
dependencies:
ky "^1.11.0"