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"