feat: pinning and showing featuring games in profile

This commit is contained in:
Moyasee
2025-09-23 15:21:32 +03:00
parent 2604dfea22
commit 33c15baf0e
15 changed files with 192 additions and 3 deletions

View File

@@ -16,6 +16,8 @@ import "./hardware/check-folder-write-permission";
import "./library/add-game-to-library";
import "./library/add-game-to-favorites";
import "./library/remove-game-from-favorites";
import "./library/add-game-to-pinned";
import "./library/remove-game-from-pinned";
import "./library/create-game-shortcut";
import "./library/close-game";
import "./library/delete-game-folder";

View File

@@ -0,0 +1,28 @@
import { registerEvent } from "../register-event";
import { gamesSublevel, levelKeys } from "@main/level";
import { HydraApi } from "@main/services";
import type { GameShop } from "@types";
const addGameToPinned = async (
_event: Electron.IpcMainInvokeEvent,
shop: GameShop,
objectId: string
) => {
const gameKey = levelKeys.game(shop, objectId);
const game = await gamesSublevel.get(gameKey);
if (!game) return;
HydraApi.put(`/profile/games/${shop}/${objectId}/pin`).catch(() => {});
try {
await gamesSublevel.put(gameKey, {
...game,
pinned: true,
});
} catch (error) {
throw new Error(`Failed to update game pinned status: ${error}`);
}
};
registerEvent("addGameToPinned", addGameToPinned);

View File

@@ -0,0 +1,28 @@
import { registerEvent } from "../register-event";
import { gamesSublevel, levelKeys } from "@main/level";
import { HydraApi } from "@main/services";
import type { GameShop } from "@types";
const removeGameFromPinned = async (
_event: Electron.IpcMainInvokeEvent,
shop: GameShop,
objectId: string
) => {
const gameKey = levelKeys.game(shop, objectId);
const game = await gamesSublevel.get(gameKey);
if (!game) return;
HydraApi.put(`/profile/games/${shop}/${objectId}/unpin`).catch(() => {});
try {
await gamesSublevel.put(gameKey, {
...game,
pinned: false,
});
} catch (error) {
throw new Error(`Failed to update game pinned status: ${error}`);
}
};
registerEvent("removeGameFromPinned", removeGameFromPinned);

View File

@@ -8,6 +8,7 @@ type ProfileGame = {
playTimeInMilliseconds: number;
hasManuallyUpdatedPlaytime: boolean;
isFavorite?: boolean;
isPinned?: boolean;
} & ShopAssets;
export const mergeWithRemoteGames = async () => {
@@ -36,6 +37,7 @@ export const mergeWithRemoteGames = async () => {
lastTimePlayed: updatedLastTimePlayed,
playTimeInMilliseconds: updatedPlayTime,
favorite: game.isFavorite ?? localGame.favorite,
pinned: game.isPinned ?? localGame.pinned,
});
} else {
await gamesSublevel.put(gameKey, {
@@ -49,6 +51,7 @@ export const mergeWithRemoteGames = async () => {
hasManuallyUpdatedPlaytime: game.hasManuallyUpdatedPlaytime,
isDeleted: false,
favorite: game.isFavorite ?? false,
pinned: game.isPinned ?? false,
});
}

View File

@@ -27,6 +27,7 @@ export const uploadGamesBatch = async () => {
shop: game.shop,
lastTimePlayed: game.lastTimePlayed,
isFavorite: game.favorite,
isPinned: game.pinned ?? false,
};
})
).catch(() => {});