diff --git a/src/main/events/index.ts b/src/main/events/index.ts index d0f900d9..ed77cadb 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -20,6 +20,7 @@ import "./library/create-game-shortcut"; import "./library/close-game"; import "./library/delete-game-folder"; import "./library/get-game-by-object-id"; +import "./library/sync-game-by-object-id"; import "./library/get-library"; import "./library/extract-game-download"; import "./library/open-game"; diff --git a/src/main/events/library/sync-game-by-object-id.ts b/src/main/events/library/sync-game-by-object-id.ts new file mode 100644 index 00000000..6aa1c77b --- /dev/null +++ b/src/main/events/library/sync-game-by-object-id.ts @@ -0,0 +1,26 @@ +import { registerEvent } from "../register-event"; +import { gamesSublevel, levelKeys } from "@main/level"; +import { HydraApi } from "@main/services"; +import type { GameShop, UserGameDetails } from "@types"; + +const syncGameByObjectId = async ( + _event: Electron.IpcMainInvokeEvent, + shop: GameShop, + objectId: string +) => { + return HydraApi.get( + `/profile/games/${shop}/${objectId}` + ).then(async (res) => { + const gameKey = levelKeys.game(shop, objectId); + const game = await gamesSublevel.get(gameKey); + + gamesSublevel.put(gameKey, { + ...(game ?? { remoteId: null }), + ...res, + }); + + return res; + }); +}; + +registerEvent("syncGameByObjectId", syncGameByObjectId); diff --git a/src/preload/index.ts b/src/preload/index.ts index 42f8d538..e660b7b9 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -187,6 +187,8 @@ contextBridge.exposeInMainWorld("electron", { ipcRenderer.invoke("deleteGameFolder", shop, objectId), getGameByObjectId: (shop: GameShop, objectId: string) => ipcRenderer.invoke("getGameByObjectId", shop, objectId), + syncGameByObjectId: (shop: GameShop, objectId: string) => + ipcRenderer.invoke("syncGameByObjectId", shop, objectId), resetGameAchievements: (shop: GameShop, objectId: string) => ipcRenderer.invoke("resetGameAchievements", shop, objectId), extractGameDownload: (shop: GameShop, objectId: string) => 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 21d11b33..e58ed673 100644 --- a/src/renderer/src/context/game-details/game-details.context.tsx +++ b/src/renderer/src/context/game-details/game-details.context.tsx @@ -108,7 +108,7 @@ export function GameDetailsContextProvider({ return window.electron .getGameByObjectId(shop, objectId) .then((result) => setGame(result)); - }, [setGame, shop, objectId]); + }, [shop, objectId]); const isGameDownloading = lastPacket?.gameId === game?.id && game?.download?.status === "active"; @@ -183,11 +183,13 @@ export function GameDetailsContextProvider({ .catch(() => {}); } - updateGame(); + window.electron.syncGameByObjectId(shop, objectId).then(() => { + if (abortController.signal.aborted) return; + updateGame(); + }); }, [ updateGame, dispatch, - gameTitle, objectId, shop, i18n.language, diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index 05d0cad0..509b34f3 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -155,6 +155,7 @@ declare global { shop: GameShop, objectId: string ) => Promise; + syncGameByObjectId: (shop: GameShop, objectId: string) => Promise; onGamesRunning: ( cb: ( gamesRunning: Pick[] diff --git a/src/types/index.ts b/src/types/index.ts index 19b3deab..2cb3618f 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -343,6 +343,23 @@ export type LibraryGame = Game & download: Download | null; }; +export type UserGameDetails = ShopAssets & { + userId: string; + playTimeInMilliseconds: number; + unlockedAchievementCount: number; + achievementsPointsEarnedSum: number; + lastTimePlayed: Date | null; + isDeleted: boolean; + isFavorite: boolean; + friendsWhoPlayed: { + id: string; + displayName: string; + profileImageUrl: string | null; + lastTimePlayed: Date | null; + playTimeInSeconds: number; + }[]; +}; + export * from "./game.types"; export * from "./steam.types"; export * from "./download.types";