feat: sync game data when opening game page

This commit is contained in:
Zamitto
2025-05-26 10:06:19 -03:00
parent 4893d61ee3
commit 1c6bc49ed0
6 changed files with 52 additions and 3 deletions

View File

@@ -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";

View File

@@ -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<UserGameDetails>(
`/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);

View File

@@ -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) =>

View File

@@ -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,

View File

@@ -155,6 +155,7 @@ declare global {
shop: GameShop,
objectId: string
) => Promise<LibraryGame | null>;
syncGameByObjectId: (shop: GameShop, objectId: string) => Promise<void>;
onGamesRunning: (
cb: (
gamesRunning: Pick<GameRunning, "id" | "sessionDurationInMillis">[]

View File

@@ -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";