mirror of
https://github.com/hydralauncher/hydra.git
synced 2026-01-15 16:33:02 -03:00
Compare commits
5 Commits
fix/librar
...
test
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20c0d3174b | ||
|
|
cd3fa10bf7 | ||
|
|
a57cc83076 | ||
|
|
c75a6ad439 | ||
|
|
05d68fa23b |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "hydralauncher",
|
||||
"version": "3.7.5",
|
||||
"version": "3.7.4",
|
||||
"description": "Hydra",
|
||||
"main": "./out/main/index.js",
|
||||
"author": "Los Broxas",
|
||||
|
||||
@@ -4,7 +4,6 @@ import {
|
||||
downloadsSublevel,
|
||||
gamesShopAssetsSublevel,
|
||||
gamesSublevel,
|
||||
gameAchievementsSublevel,
|
||||
} from "@main/level";
|
||||
|
||||
const getLibrary = async (): Promise<LibraryGame[]> => {
|
||||
@@ -19,33 +18,19 @@ const getLibrary = async (): Promise<LibraryGame[]> => {
|
||||
const download = await downloadsSublevel.get(key);
|
||||
const gameAssets = await gamesShopAssetsSublevel.get(key);
|
||||
|
||||
let unlockedAchievementCount = 0;
|
||||
let achievementCount = 0;
|
||||
|
||||
try {
|
||||
const achievements = await gameAchievementsSublevel.get(key);
|
||||
if (achievements) {
|
||||
achievementCount = achievements.achievements.length;
|
||||
unlockedAchievementCount =
|
||||
achievements.unlockedAchievements.length;
|
||||
}
|
||||
} catch {
|
||||
// No achievements data for this game
|
||||
}
|
||||
|
||||
return {
|
||||
id: key,
|
||||
...game,
|
||||
download: download ?? null,
|
||||
unlockedAchievementCount,
|
||||
achievementCount,
|
||||
unlockedAchievementCount: game.unlockedAchievementCount ?? 0,
|
||||
achievementCount: game.achievementCount ?? 0,
|
||||
// Spread gameAssets last to ensure all image URLs are properly set
|
||||
...gameAssets,
|
||||
// Preserve custom image URLs from game if they exist
|
||||
customIconUrl: game.customIconUrl,
|
||||
customLogoImageUrl: game.customLogoImageUrl,
|
||||
customHeroImageUrl: game.customHeroImageUrl,
|
||||
} as LibraryGame;
|
||||
};
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
@@ -9,6 +9,8 @@ type ProfileGame = {
|
||||
hasManuallyUpdatedPlaytime: boolean;
|
||||
isFavorite?: boolean;
|
||||
isPinned?: boolean;
|
||||
achievementCount: number;
|
||||
unlockedAchievementCount: number;
|
||||
} & ShopAssets;
|
||||
|
||||
export const mergeWithRemoteGames = async () => {
|
||||
@@ -39,6 +41,8 @@ export const mergeWithRemoteGames = async () => {
|
||||
playTimeInMilliseconds: updatedPlayTime,
|
||||
favorite: game.isFavorite ?? localGame.favorite,
|
||||
isPinned: game.isPinned ?? localGame.isPinned,
|
||||
achievementCount: game.achievementCount,
|
||||
unlockedAchievementCount: game.unlockedAchievementCount,
|
||||
});
|
||||
} else {
|
||||
await gamesSublevel.put(gameKey, {
|
||||
@@ -55,6 +59,8 @@ export const mergeWithRemoteGames = async () => {
|
||||
isDeleted: false,
|
||||
favorite: game.isFavorite ?? false,
|
||||
isPinned: game.isPinned ?? false,
|
||||
achievementCount: game.achievementCount,
|
||||
unlockedAchievementCount: game.unlockedAchievementCount,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ export function GameCard({ game, ...props }: GameCardProps) {
|
||||
>
|
||||
<div className="game-card__backdrop">
|
||||
<img
|
||||
src={game.libraryImageUrl}
|
||||
src={game.libraryImageUrl ?? undefined}
|
||||
alt={game.title}
|
||||
className="game-card__cover"
|
||||
loading="lazy"
|
||||
|
||||
@@ -50,14 +50,14 @@ export function Hero() {
|
||||
>
|
||||
<div className="hero__backdrop">
|
||||
<img
|
||||
src={game.libraryHeroImageUrl}
|
||||
src={game.libraryHeroImageUrl ?? undefined}
|
||||
alt={game.description ?? ""}
|
||||
className="hero__media"
|
||||
/>
|
||||
|
||||
<div className="hero__content">
|
||||
<img
|
||||
src={game.logoImageUrl}
|
||||
src={game.logoImageUrl ?? undefined}
|
||||
width="250px"
|
||||
alt={game.description ?? ""}
|
||||
loading="eager"
|
||||
|
||||
@@ -7,9 +7,25 @@ export function useLibrary() {
|
||||
const library = useAppSelector((state) => state.library.value);
|
||||
|
||||
const updateLibrary = useCallback(async () => {
|
||||
return window.electron
|
||||
.getLibrary()
|
||||
.then((updatedLibrary) => dispatch(setLibrary(updatedLibrary)));
|
||||
return window.electron.getLibrary().then(async (updatedLibrary) => {
|
||||
const libraryWithAchievements = await Promise.all(
|
||||
updatedLibrary.map(async (game) => {
|
||||
const unlockedAchievements =
|
||||
await window.electron.getUnlockedAchievements(
|
||||
game.objectId,
|
||||
game.shop
|
||||
);
|
||||
|
||||
return {
|
||||
...game,
|
||||
unlockedAchievementCount:
|
||||
game.unlockedAchievementCount || unlockedAchievements.length,
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
dispatch(setLibrary(libraryWithAchievements));
|
||||
});
|
||||
}, [dispatch]);
|
||||
|
||||
return { library, updateLibrary };
|
||||
|
||||
@@ -42,9 +42,9 @@ export interface ShopAssets {
|
||||
shop: GameShop;
|
||||
title: string;
|
||||
iconUrl: string | null;
|
||||
libraryHeroImageUrl: string;
|
||||
libraryImageUrl: string;
|
||||
logoImageUrl: string;
|
||||
libraryHeroImageUrl: string | null;
|
||||
libraryImageUrl: string | null;
|
||||
logoImageUrl: string | null;
|
||||
logoPosition: string | null;
|
||||
coverImageUrl: string | null;
|
||||
downloadSources: string[];
|
||||
|
||||
@@ -56,6 +56,8 @@ export interface Game {
|
||||
launchOptions?: string | null;
|
||||
favorite?: boolean;
|
||||
isPinned?: boolean;
|
||||
achievementCount?: number;
|
||||
unlockedAchievementCount?: number;
|
||||
pinnedDate?: Date | null;
|
||||
automaticCloudSync?: boolean;
|
||||
hasManuallyUpdatedPlaytime?: boolean;
|
||||
|
||||
Reference in New Issue
Block a user