From 63aee44982c5bb4ab16efef4fd8dcc50d33342c8 Mon Sep 17 00:00:00 2001 From: Zamitto <167933696+zamitto@users.noreply.github.com> Date: Mon, 7 Oct 2024 20:16:12 -0300 Subject: [PATCH] feat: refactor achievement listeners --- .../events/catalogue/get-game-achievements.ts | 14 +++++++++++--- .../achievements/merge-achievements.ts | 8 ++++---- src/preload/index.ts | 17 +++++++++++++++++ .../game-details/game-details.context.tsx | 18 ++++++++---------- src/renderer/src/declaration.d.ts | 5 +++++ .../src/pages/game-details/sidebar/sidebar.tsx | 1 - 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/main/events/catalogue/get-game-achievements.ts b/src/main/events/catalogue/get-game-achievements.ts index 7d0baa5c..8ab6d5d9 100644 --- a/src/main/events/catalogue/get-game-achievements.ts +++ b/src/main/events/catalogue/get-game-achievements.ts @@ -38,8 +38,7 @@ const getAchievements = async ( return { achievementsData, unlockedAchievements }; }; -const getGameAchievements = async ( - _event: Electron.IpcMainInvokeEvent, +export const getGameAchievements = async ( objectId: string, shop: GameShop, userId?: string @@ -78,4 +77,13 @@ const getGameAchievements = async ( }); }; -registerEvent("getGameAchievements", getGameAchievements); +const getGameAchievementsEvent = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop, + userId?: string +): Promise => { + return getGameAchievements(objectId, shop, userId); +}; + +registerEvent("getGameAchievements", getGameAchievementsEvent); diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts index b611f2a2..6438a413 100644 --- a/src/main/services/achievements/merge-achievements.ts +++ b/src/main/services/achievements/merge-achievements.ts @@ -2,6 +2,7 @@ import { gameAchievementRepository, gameRepository } from "@main/repository"; import type { GameShop, UnlockedAchievement } from "@types"; import { WindowManager } from "../window-manager"; import { HydraApi } from "../hydra-api"; +import { getGameAchievements } from "@main/events/catalogue/get-game-achievements"; const saveAchievementsOnLocal = async ( objectId: string, @@ -17,11 +18,10 @@ const saveAchievementsOnLocal = async ( }, ["objectId", "shop"] ) - .then(() => { + .then(async () => { WindowManager.mainWindow?.webContents.send( - "on-achievement-unlocked", - objectId, - shop + `on-update-achievements-${objectId}-${shop}`, + await getGameAchievements(objectId, shop as GameShop) ); }); }; diff --git a/src/preload/index.ts b/src/preload/index.ts index 8c0486a4..40a6c101 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -14,6 +14,7 @@ import type { } from "@types"; import type { CatalogueCategory } from "@shared"; import type { AxiosProgressEvent } from "axios"; +import { GameAchievement } from "@main/entity"; contextBridge.exposeInMainWorld("electron", { /* Torrenting */ @@ -69,6 +70,22 @@ contextBridge.exposeInMainWorld("electron", { return () => ipcRenderer.removeListener("on-achievement-unlocked", listener); }, + onUpdateAchievements: ( + objectId: string, + shop: GameShop, + cb: (achievements: GameAchievement[]) => void + ) => { + const listener = ( + _event: Electron.IpcRendererEvent, + achievements: GameAchievement[] + ) => cb(achievements); + ipcRenderer.on(`on-update-achievements-${objectId}-${shop}`, listener); + return () => + ipcRenderer.removeListener( + `on-update-achievements-${objectId}-${shop}`, + listener + ); + }, /* User preferences */ getUserPreferences: () => ipcRenderer.invoke("getUserPreferences"), diff --git a/src/renderer/src/context/game-details/game-details.context.tsx b/src/renderer/src/context/game-details/game-details.context.tsx index 2a819e1b..7ff8bb09 100644 --- a/src/renderer/src/context/game-details/game-details.context.tsx +++ b/src/renderer/src/context/game-details/game-details.context.tsx @@ -132,13 +132,14 @@ export function GameDetailsContextProvider({ setIsLoading(false); }); - window.electron.getGameStats(objectId!, shop as GameShop).then((result) => { + window.electron.getGameStats(objectId, shop as GameShop).then((result) => { setStats(result); }); window.electron - .getGameAchievements(objectId!, shop as GameShop) + .getGameAchievements(objectId, shop as GameShop) .then((achievements) => { + // TODO: race condition setAchievements(achievements); }) .catch(() => { @@ -175,14 +176,11 @@ export function GameDetailsContextProvider({ }, [game?.id, isGameRunning, updateGame]); useEffect(() => { - const unsubscribe = window.electron.onAchievementUnlocked( - (objectId, shop) => { - if (objectId !== objectId || shop !== shop) return; - - window.electron - .getGameAchievements(objectId!, shop as GameShop) - .then(setAchievements) - .catch(() => {}); + const unsubscribe = window.electron.onUpdateAchievements( + objectId, + shop, + (achievements) => { + setAchievements(achievements); } ); diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index d83b2b6c..677c3ee2 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -76,6 +76,11 @@ declare global { achievements?: { displayName: string; iconUrl: string }[] ) => void ) => () => Electron.IpcRenderer; + onUpdateAchievements: ( + objectId: string, + shop: GameShop, + cb: (achievements: GameAchievement[]) => void + ) => () => Electron.IpcRenderer; /* Library */ addGameToLibrary: ( diff --git a/src/renderer/src/pages/game-details/sidebar/sidebar.tsx b/src/renderer/src/pages/game-details/sidebar/sidebar.tsx index a72d6c90..6c6dca33 100644 --- a/src/renderer/src/pages/game-details/sidebar/sidebar.tsx +++ b/src/renderer/src/pages/game-details/sidebar/sidebar.tsx @@ -82,7 +82,6 @@ export function Sidebar() { > Ver todas -