diff --git a/src/main/events/autoupdater/check-for-updates.ts b/src/main/events/autoupdater/check-for-updates.ts index 6c8d3cb0..1dcc80f3 100644 --- a/src/main/events/autoupdater/check-for-updates.ts +++ b/src/main/events/autoupdater/check-for-updates.ts @@ -1,4 +1,4 @@ -import { AppUpdaterEvent } from "@types"; +import type { AppUpdaterEvent } from "@types"; import { registerEvent } from "../register-event"; import updater, { UpdateInfo } from "electron-updater"; import { WindowManager } from "@main/services"; diff --git a/src/main/events/catalogue/get-game-achievements.ts b/src/main/events/catalogue/get-game-achievements.ts deleted file mode 100644 index 734366c8..00000000 --- a/src/main/events/catalogue/get-game-achievements.ts +++ /dev/null @@ -1,147 +0,0 @@ -import type { - AchievementData, - GameShop, - RemoteUnlockedAchievement, - UnlockedAchievement, - UserAchievement, -} from "@types"; -import { registerEvent } from "../register-event"; -import { - gameAchievementRepository, - userPreferencesRepository, -} from "@main/repository"; -import { getGameAchievementData } from "@main/services/achievements/get-game-achievement-data"; -import { HydraApi } from "@main/services"; - -const getAchievementLocalUser = async (shop: string, objectId: string) => { - const cachedAchievements = await gameAchievementRepository.findOne({ - where: { objectId, shop }, - }); - - const achievementsData = await getGameAchievementData(objectId, shop); - - const unlockedAchievements = JSON.parse( - cachedAchievements?.unlockedAchievements || "[]" - ) as UnlockedAchievement[]; - - return achievementsData - .map((achievementData) => { - const unlockedAchiementData = unlockedAchievements.find( - (localAchievement) => { - return ( - localAchievement.name.toUpperCase() == - achievementData.name.toUpperCase() - ); - } - ); - - const icongray = achievementData.icongray.endsWith("/") - ? achievementData.icon - : achievementData.icongray; - - if (unlockedAchiementData) { - return { - ...achievementData, - unlocked: true, - unlockTime: unlockedAchiementData.unlockTime, - }; - } - - return { - ...achievementData, - unlocked: false, - unlockTime: null, - icongray: icongray, - } as UserAchievement; - }) - .sort((a, b) => { - if (a.unlocked && !b.unlocked) return -1; - if (!a.unlocked && b.unlocked) return 1; - if (a.unlocked && b.unlocked) { - return b.unlockTime! - a.unlockTime!; - } - return Number(a.hidden) - Number(b.hidden); - }); -}; - -const getAchievementsRemoteUser = async ( - shop: string, - objectId: string, - userId: string -) => { - const userPreferences = await userPreferencesRepository.findOne({ - where: { id: 1 }, - }); - - const achievementsData: AchievementData[] = await getGameAchievementData( - objectId, - shop - ); - - const unlockedAchievements = await HydraApi.get( - `/users/${userId}/games/achievements`, - { shop, objectId, language: userPreferences?.language || "en" } - ); - - return achievementsData - .map((achievementData) => { - const unlockedAchiementData = unlockedAchievements.find( - (localAchievement) => { - return ( - localAchievement.name.toUpperCase() == - achievementData.name.toUpperCase() - ); - } - ); - - const icongray = achievementData.icongray.endsWith("/") - ? achievementData.icon - : achievementData.icongray; - - if (unlockedAchiementData) { - return { - ...achievementData, - unlocked: true, - unlockTime: unlockedAchiementData.unlockTime, - }; - } - - return { - ...achievementData, - unlocked: false, - unlockTime: null, - icongray: icongray, - } as UserAchievement; - }) - .sort((a, b) => { - if (a.unlocked && !b.unlocked) return -1; - if (!a.unlocked && b.unlocked) return 1; - if (a.unlocked && b.unlocked) { - return b.unlockTime! - a.unlockTime!; - } - return Number(a.hidden) - Number(b.hidden); - }); -}; - -export const getGameAchievements = async ( - objectId: string, - shop: GameShop, - userId?: string -): Promise => { - if (!userId) { - return getAchievementLocalUser(shop, objectId); - } - - return getAchievementsRemoteUser(shop, objectId, userId); -}; - -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/events/catalogue/get-game-stats.ts b/src/main/events/catalogue/get-game-stats.ts index b64a42ce..9961a0b2 100644 --- a/src/main/events/catalogue/get-game-stats.ts +++ b/src/main/events/catalogue/get-game-stats.ts @@ -1,8 +1,6 @@ -import type { GameShop } from "@types"; - +import type { GameShop, GameStats } from "@types"; import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import type { GameStats } from "@types"; const getGameStats = async ( _event: Electron.IpcMainInvokeEvent, diff --git a/src/main/events/catalogue/get-trending-games.ts b/src/main/events/catalogue/get-trending-games.ts index 8f8e02c0..acfebfd6 100644 --- a/src/main/events/catalogue/get-trending-games.ts +++ b/src/main/events/catalogue/get-trending-games.ts @@ -1,7 +1,7 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; import { userPreferencesRepository } from "@main/repository"; -import { TrendingGame } from "@types"; +import type { TrendingGame } from "@types"; const getTrendingGames = async (_event: Electron.IpcMainInvokeEvent) => { const userPreferences = await userPreferencesRepository.findOne({ diff --git a/src/main/events/catalogue/search-games.ts b/src/main/events/catalogue/search-games.ts index 8f81d40e..4ce42fd8 100644 --- a/src/main/events/catalogue/search-games.ts +++ b/src/main/events/catalogue/search-games.ts @@ -1,6 +1,6 @@ import { registerEvent } from "../register-event"; import { convertSteamGameToCatalogueEntry } from "../helpers/search-games"; -import { CatalogueEntry } from "@types"; +import type { CatalogueEntry } from "@types"; import { HydraApi } from "@main/services"; const searchGamesEvent = async ( diff --git a/src/main/events/cloud-save/get-game-backup-preview.ts b/src/main/events/cloud-save/get-game-backup-preview.ts index ee95059f..13a00758 100644 --- a/src/main/events/cloud-save/get-game-backup-preview.ts +++ b/src/main/events/cloud-save/get-game-backup-preview.ts @@ -1,5 +1,5 @@ import { registerEvent } from "../register-event"; -import { GameShop } from "@types"; +import type { GameShop } from "@types"; import { Ludusavi } from "@main/services"; import path from "node:path"; import { backupsPath } from "@main/constants"; diff --git a/src/main/events/cloud-save/upload-save-game.ts b/src/main/events/cloud-save/upload-save-game.ts index 6cf68596..a573b3ba 100644 --- a/src/main/events/cloud-save/upload-save-game.ts +++ b/src/main/events/cloud-save/upload-save-game.ts @@ -4,7 +4,7 @@ import fs from "node:fs"; import path from "node:path"; import * as tar from "tar"; import crypto from "node:crypto"; -import { GameShop } from "@types"; +import type { GameShop } from "@types"; import axios from "axios"; import os from "node:os"; import { backupsPath } from "@main/constants"; diff --git a/src/main/events/index.ts b/src/main/events/index.ts index ffdfc354..87fbdbe0 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -9,7 +9,6 @@ import "./catalogue/get-random-game"; import "./catalogue/search-games"; import "./catalogue/get-game-stats"; import "./catalogue/get-trending-games"; -import "./catalogue/get-game-achievements"; import "./hardware/get-disk-free-space"; import "./library/add-game-to-library"; import "./library/create-game-shortcut"; @@ -50,6 +49,7 @@ import "./user/unblock-user"; import "./user/get-user-friends"; import "./user/get-user-stats"; import "./user/report-user"; +import "./user/get-unlocked-achievements"; import "./user/get-compared-unlocked-achievements"; import "./profile/get-friend-requests"; import "./profile/get-me"; diff --git a/src/main/events/profile/get-friend-requests.ts b/src/main/events/profile/get-friend-requests.ts index 11d8a884..39573b67 100644 --- a/src/main/events/profile/get-friend-requests.ts +++ b/src/main/events/profile/get-friend-requests.ts @@ -1,6 +1,6 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import { FriendRequest } from "@types"; +import type { FriendRequest } from "@types"; const getFriendRequests = async ( _event: Electron.IpcMainInvokeEvent diff --git a/src/main/events/profile/get-me.ts b/src/main/events/profile/get-me.ts index 65aa1d5a..474effbb 100644 --- a/src/main/events/profile/get-me.ts +++ b/src/main/events/profile/get-me.ts @@ -1,7 +1,7 @@ import { registerEvent } from "../register-event"; import * as Sentry from "@sentry/electron/main"; import { HydraApi, logger } from "@main/services"; -import { ProfileVisibility, UserDetails } from "@types"; +import type { ProfileVisibility, UserDetails } from "@types"; import { userAuthRepository, userSubscriptionRepository, diff --git a/src/main/events/profile/sync-friend-requests.ts b/src/main/events/profile/sync-friend-requests.ts index c7dfbd81..ffe995e6 100644 --- a/src/main/events/profile/sync-friend-requests.ts +++ b/src/main/events/profile/sync-friend-requests.ts @@ -1,7 +1,7 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; import { UserNotLoggedInError } from "@shared"; -import { FriendRequestSync } from "@types"; +import type { FriendRequestSync } from "@types"; const syncFriendRequests = async (_event: Electron.IpcMainInvokeEvent) => { return HydraApi.get(`/profile/friend-requests/sync`).catch( diff --git a/src/main/events/profile/update-friend-request.ts b/src/main/events/profile/update-friend-request.ts index 24929544..b265f88c 100644 --- a/src/main/events/profile/update-friend-request.ts +++ b/src/main/events/profile/update-friend-request.ts @@ -1,6 +1,6 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import { FriendRequestAction } from "@types"; +import type { FriendRequestAction } from "@types"; const updateFriendRequest = async ( _event: Electron.IpcMainInvokeEvent, diff --git a/src/main/events/user/get-blocked-users.ts b/src/main/events/user/get-blocked-users.ts index 7df6bf9a..9696cd7b 100644 --- a/src/main/events/user/get-blocked-users.ts +++ b/src/main/events/user/get-blocked-users.ts @@ -1,7 +1,7 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; import { UserNotLoggedInError } from "@shared"; -import { UserBlocks } from "@types"; +import type { UserBlocks } from "@types"; export const getBlockedUsers = async ( _event: Electron.IpcMainInvokeEvent, diff --git a/src/main/events/user/get-unlocked-achievements.ts b/src/main/events/user/get-unlocked-achievements.ts new file mode 100644 index 00000000..b6f3e0b7 --- /dev/null +++ b/src/main/events/user/get-unlocked-achievements.ts @@ -0,0 +1,68 @@ +import type { GameShop, UnlockedAchievement, UserAchievement } from "@types"; +import { registerEvent } from "../register-event"; +import { gameAchievementRepository } from "@main/repository"; +import { getGameAchievementData } from "@main/services/achievements/get-game-achievement-data"; + +export const getUnlockedAchievements = async ( + objectId: string, + shop: GameShop +): Promise => { + const cachedAchievements = await gameAchievementRepository.findOne({ + where: { objectId, shop }, + }); + + const achievementsData = await getGameAchievementData(objectId, shop); + + const unlockedAchievements = JSON.parse( + cachedAchievements?.unlockedAchievements || "[]" + ) as UnlockedAchievement[]; + + return achievementsData + .map((achievementData) => { + const unlockedAchiementData = unlockedAchievements.find( + (localAchievement) => { + return ( + localAchievement.name.toUpperCase() == + achievementData.name.toUpperCase() + ); + } + ); + + const icongray = achievementData.icongray.endsWith("/") + ? achievementData.icon + : achievementData.icongray; + + if (unlockedAchiementData) { + return { + ...achievementData, + unlocked: true, + unlockTime: unlockedAchiementData.unlockTime, + }; + } + + return { + ...achievementData, + unlocked: false, + unlockTime: null, + icongray: icongray, + } as UserAchievement; + }) + .sort((a, b) => { + if (a.unlocked && !b.unlocked) return -1; + if (!a.unlocked && b.unlocked) return 1; + if (a.unlocked && b.unlocked) { + return b.unlockTime! - a.unlockTime!; + } + return Number(a.hidden) - Number(b.hidden); + }); +}; + +const getGameAchievementsEvent = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop +): Promise => { + return getUnlockedAchievements(objectId, shop); +}; + +registerEvent("getUnlockedAchievements", getGameAchievementsEvent); diff --git a/src/main/events/user/get-user-friends.ts b/src/main/events/user/get-user-friends.ts index 5ff4c8a4..9a6f156c 100644 --- a/src/main/events/user/get-user-friends.ts +++ b/src/main/events/user/get-user-friends.ts @@ -1,7 +1,7 @@ import { userAuthRepository } from "@main/repository"; import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import { UserFriends } from "@types"; +import type { UserFriends } from "@types"; export const getUserFriends = async ( userId: string, diff --git a/src/main/services/achievements/achievement-watcher.ts b/src/main/services/achievements/achievement-watcher.ts index 7e0009eb..f3b3ac51 100644 --- a/src/main/services/achievements/achievement-watcher.ts +++ b/src/main/services/achievements/achievement-watcher.ts @@ -16,7 +16,7 @@ import { IsNull, Not } from "typeorm"; const fileStats: Map = new Map(); const fltFiles: Map> = new Map(); -const watchAchiievementsWindows = async () => { +const watchAchievementsWindows = async () => { const games = await gameRepository.find({ where: { isDeleted: false, @@ -53,12 +53,17 @@ const watchAchievementsWithWine = async () => { if (games.length === 0) return; + // const user = app.getPath("home").split("/").pop() + + // for (const game of games) { + // } + // TODO: watch achievements with wine }; export const watchAchievements = async () => { if (process.platform === "win32") { - return watchAchiievementsWindows(); + return watchAchievementsWindows(); } watchAchievementsWithWine(); @@ -101,10 +106,9 @@ const compareFltFolder = async (game: Game, file: AchievementFile) => { } }; -const compareFile = async (game: Game, file: AchievementFile) => { +const compareFile = (game: Game, file: AchievementFile) => { if (file.type === Cracker.flt) { - await compareFltFolder(game, file); - return; + return compareFltFolder(game, file); } try { @@ -121,8 +125,7 @@ const compareFile = async (game: Game, file: AchievementFile) => { currentStat.mtimeMs ); - await processAchievementFileDiff(game, file); - return; + return processAchievementFileDiff(game, file); } } @@ -136,8 +139,9 @@ const compareFile = async (game: Game, file: AchievementFile) => { previousStat, currentStat.mtimeMs ); - await processAchievementFileDiff(game, file); + return processAchievementFileDiff(game, file); } catch (err) { fileStats.set(file.filePath, -1); + return; } }; diff --git a/src/main/services/achievements/get-game-achievement-data.ts b/src/main/services/achievements/get-game-achievement-data.ts index 552e66b7..b08914e8 100644 --- a/src/main/services/achievements/get-game-achievement-data.ts +++ b/src/main/services/achievements/get-game-achievement-data.ts @@ -3,13 +3,13 @@ import { userPreferencesRepository, } from "@main/repository"; import { HydraApi } from "../hydra-api"; -import { AchievementData } from "@types"; +import type { AchievementData, GameShop } from "@types"; import { UserNotLoggedInError } from "@shared"; import { logger } from "../logger"; export const getGameAchievementData = async ( objectId: string, - shop: string + shop: GameShop ) => { const userPreferences = await userPreferencesRepository.findOne({ where: { id: 1 }, diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts index 367a5550..5c37d436 100644 --- a/src/main/services/achievements/merge-achievements.ts +++ b/src/main/services/achievements/merge-achievements.ts @@ -6,11 +6,11 @@ import { import type { AchievementData, GameShop, UnlockedAchievement } from "@types"; import { WindowManager } from "../window-manager"; import { HydraApi } from "../hydra-api"; -import { getGameAchievements } from "@main/events/catalogue/get-game-achievements"; +import { getUnlockedAchievements } from "@main/events/user/get-unlocked-achievements"; const saveAchievementsOnLocal = async ( objectId: string, - shop: string, + shop: GameShop, achievements: any[] ) => { return gameAchievementRepository @@ -23,7 +23,7 @@ const saveAchievementsOnLocal = async ( ["objectId", "shop"] ) .then(() => { - return getGameAchievements(objectId, shop as GameShop) + return getUnlockedAchievements(objectId, shop) .then((achievements) => { WindowManager.mainWindow?.webContents.send( `on-update-achievements-${objectId}-${shop}`, @@ -36,12 +36,12 @@ const saveAchievementsOnLocal = async ( export const mergeAchievements = async ( objectId: string, - shop: string, + shop: GameShop, achievements: UnlockedAchievement[], publishNotification: boolean ) => { const game = await gameRepository.findOne({ - where: { objectID: objectId, shop: shop as GameShop }, + where: { objectID: objectId, shop: shop }, }); if (!game) return; diff --git a/src/main/services/download/python-instance.ts b/src/main/services/download/python-instance.ts index 4a41c2dc..f59b20b8 100644 --- a/src/main/services/download/python-instance.ts +++ b/src/main/services/download/python-instance.ts @@ -7,7 +7,7 @@ import { startTorrentClient as startRPCClient, } from "./torrent-client"; import { gameRepository } from "@main/repository"; -import { DownloadProgress } from "@types"; +import type { DownloadProgress } from "@types"; import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity"; import { calculateETA } from "./helpers"; import axios from "axios"; diff --git a/src/main/workers/steam-games.worker.ts b/src/main/workers/steam-games.worker.ts index 9085082b..55792454 100644 --- a/src/main/workers/steam-games.worker.ts +++ b/src/main/workers/steam-games.worker.ts @@ -1,4 +1,4 @@ -import { SteamGame } from "@types"; +import type { SteamGame } from "@types"; import { slice } from "lodash-es"; import fs from "node:fs"; diff --git a/src/preload/index.ts b/src/preload/index.ts index 0eadd409..6d541b0b 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -51,8 +51,6 @@ contextBridge.exposeInMainWorld("electron", { getGameStats: (objectId: string, shop: GameShop) => ipcRenderer.invoke("getGameStats", objectId, shop), getTrendingGames: () => ipcRenderer.invoke("getTrendingGames"), - getGameAchievements: (objectId: string, shop: GameShop, userId?: string) => - ipcRenderer.invoke("getGameAchievements", objectId, shop, userId), onAchievementUnlocked: ( cb: ( objectId: string, @@ -270,6 +268,8 @@ contextBridge.exposeInMainWorld("electron", { shop, userId ), + getUnlockedAchievements: (objectId: string, shop: GameShop) => + ipcRenderer.invoke("getUnlockedAchievements", objectId, shop), /* Auth */ signOut: () => ipcRenderer.invoke("signOut"), diff --git a/src/renderer/src/components/header/auto-update-sub-header.tsx b/src/renderer/src/components/header/auto-update-sub-header.tsx index 5dcfe841..005cdfda 100644 --- a/src/renderer/src/components/header/auto-update-sub-header.tsx +++ b/src/renderer/src/components/header/auto-update-sub-header.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import { SyncIcon } from "@primer/octicons-react"; import { Link } from "../link/link"; import * as styles from "./header.css"; -import { AppUpdaterEvent } from "@types"; +import type { AppUpdaterEvent } from "@types"; export const releasesPageUrl = "https://github.com/hydralauncher/hydra/releases/latest"; diff --git a/src/renderer/src/components/hero/hero.tsx b/src/renderer/src/components/hero/hero.tsx index 9986a7d8..9bc5514d 100644 --- a/src/renderer/src/components/hero/hero.tsx +++ b/src/renderer/src/components/hero/hero.tsx @@ -1,7 +1,7 @@ import { useNavigate } from "react-router-dom"; import * as styles from "./hero.css"; import { useEffect, useState } from "react"; -import { TrendingGame } from "@types"; +import type { TrendingGame } from "@types"; import { useTranslation } from "react-i18next"; import Skeleton from "react-loading-skeleton"; 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 c308ab2f..1cd8a529 100644 --- a/src/renderer/src/context/game-details/game-details.context.tsx +++ b/src/renderer/src/context/game-details/game-details.context.tsx @@ -155,14 +155,15 @@ export function GameDetailsContextProvider({ setStats(result); }); - window.electron - .getGameAchievements(objectId, shop as GameShop) - .then((achievements) => { - if (abortController.signal.aborted) return; - if (!userDetails) return; - setAchievements(achievements); - }) - .catch(() => {}); + if (userDetails) { + window.electron + .getUnlockedAchievements(objectId, shop as GameShop) + .then((achievements) => { + if (abortController.signal.aborted) return; + setAchievements(achievements); + }) + .catch(() => {}); + } updateGame(); }, [ diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index e6a47959..31ff375e 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -66,11 +66,6 @@ declare global { searchGameRepacks: (query: string) => Promise; getGameStats: (objectId: string, shop: GameShop) => Promise; getTrendingGames: () => Promise; - getGameAchievements: ( - objectId: string, - shop: GameShop, - userId?: string - ) => Promise; onAchievementUnlocked: ( cb: ( objectId: string, @@ -208,6 +203,10 @@ declare global { shop: GameShop, userId: string ) => Promise; + getUnlockedAchievements: ( + objectId: string, + shop: GameShop + ) => Promise; /* Profile */ getMe: () => Promise; diff --git a/src/renderer/src/features/running-game-slice.ts b/src/renderer/src/features/running-game-slice.ts index b3fb0a9d..e1dd609f 100644 --- a/src/renderer/src/features/running-game-slice.ts +++ b/src/renderer/src/features/running-game-slice.ts @@ -1,5 +1,5 @@ import { PayloadAction, createSlice } from "@reduxjs/toolkit"; -import { GameRunning } from "@types"; +import type { GameRunning } from "@types"; export interface GameRunningState { gameRunning: GameRunning | null; diff --git a/src/renderer/src/pages/achievements/achievements-content.tsx b/src/renderer/src/pages/achievements/achievements-content.tsx index 7a37358b..aa93bc30 100644 --- a/src/renderer/src/pages/achievements/achievements-content.tsx +++ b/src/renderer/src/pages/achievements/achievements-content.tsx @@ -11,14 +11,14 @@ import { import { LockIcon, PersonIcon, TrophyIcon } from "@primer/octicons-react"; import { SPACING_UNIT, vars } from "@renderer/theme.css"; import { gameDetailsContext } from "@renderer/context"; -import { ComparedAchievements, UserAchievement } from "@types"; +import type { ComparedAchievements, UserAchievement } from "@types"; import { average } from "color.js"; import Color from "color"; import { Link } from "@renderer/components"; import { ComparedAchievementList } from "./compared-achievement-list"; interface UserInfo { - userId: string; + id: string; displayName: string; profileImageUrl: string | null; totalAchievementCount: number; @@ -43,7 +43,9 @@ function AchievementSummary({ user, isComparison }: AchievementSummaryProps) { const { t } = useTranslation("achievement"); const { userDetails, hasActiveSubscription } = useUserDetails(); - const getProfileImage = (user: UserInfo) => { + const getProfileImage = ( + user: Pick + ) => { return (
{user.profileImageUrl ? ( @@ -59,11 +61,7 @@ function AchievementSummary({ user, isComparison }: AchievementSummaryProps) { ); }; - if ( - isComparison && - userDetails?.id == user.userId && - !hasActiveSubscription - ) { + if (isComparison && userDetails?.id == user.id && !hasActiveSubscription) { return (
{ - if (gameTitle) { - dispatch(setHeaderTitle(gameTitle)); - } + dispatch(setHeaderTitle(gameTitle)); }, [dispatch, gameTitle]); const handleHeroLoad = async () => { @@ -247,16 +242,15 @@ export function AchievementsContent({ }; const getProfileImage = ( - profileImageUrl: string | null, - displayName: string + user: Pick ) => { return (
- {profileImageUrl ? ( + {user.profileImageUrl ? ( {displayName} ) : ( @@ -315,7 +309,6 @@ export function AchievementsContent({
{hasActiveSubscription && (
- {getProfileImage( - userDetails.profileImageUrl, - userDetails.displayName - )} + {getProfileImage({ ...userDetails })}
)}
- {getProfileImage( - otherUser.profileImageUrl, - otherUser.displayName - )} + {getProfileImage(otherUser)}
)} -
- {otherUser ? ( - - ) : ( - - )} -
+ {otherUser ? ( + + ) : ( + + )} ); diff --git a/src/renderer/src/pages/achievements/achievements-skeleton.tsx b/src/renderer/src/pages/achievements/achievements-skeleton.tsx index f26f3951..f9ae81ac 100644 --- a/src/renderer/src/pages/achievements/achievements-skeleton.tsx +++ b/src/renderer/src/pages/achievements/achievements-skeleton.tsx @@ -4,7 +4,7 @@ import * as styles from "./achievements.css"; export function AchievementsSkeleton() { return (
-
+
diff --git a/src/renderer/src/pages/achievements/achievements.css.ts b/src/renderer/src/pages/achievements/achievements.css.ts index c4b66384..d5bed1e6 100644 --- a/src/renderer/src/pages/achievements/achievements.css.ts +++ b/src/renderer/src/pages/achievements/achievements.css.ts @@ -3,8 +3,8 @@ import { style } from "@vanilla-extract/css"; import { recipe } from "@vanilla-extract/recipes"; export const HERO_HEIGHT = 150; -export const LOGO_HEIGHT = 100; -export const LOGO_MAX_WIDTH = 200; +const LOGO_HEIGHT = 100; +const LOGO_MAX_WIDTH = 200; export const wrapper = style({ display: "flex", @@ -104,6 +104,7 @@ export const list = style({ gap: `${SPACING_UNIT * 2}px`, padding: `${SPACING_UNIT * 2}px`, width: "100%", + backgroundColor: vars.color.background, }); export const listItem = style({ @@ -162,12 +163,7 @@ export const heroLogoBackdrop = style({ }); export const heroImageSkeleton = style({ - height: "300px", - "@media": { - "(min-width: 1250px)": { - height: "350px", - }, - }, + height: "150px", }); export const heroPanelSkeleton = style({ diff --git a/src/renderer/src/pages/achievements/achievements.tsx b/src/renderer/src/pages/achievements/achievements.tsx index c831dd0e..605300ef 100644 --- a/src/renderer/src/pages/achievements/achievements.tsx +++ b/src/renderer/src/pages/achievements/achievements.tsx @@ -52,7 +52,7 @@ export default function Achievements() { if (!otherUserId || !comparedAchievements) return null; return { - userId: otherUserId, + id: otherUserId, displayName: comparedAchievements.target.displayName, profileImageUrl: comparedAchievements.target.profileImageUrl, totalAchievementCount: comparedAchievements.target.totalAchievementCount, diff --git a/src/renderer/src/pages/downloads/downloads.tsx b/src/renderer/src/pages/downloads/downloads.tsx index 925fb175..ed541745 100644 --- a/src/renderer/src/pages/downloads/downloads.tsx +++ b/src/renderer/src/pages/downloads/downloads.tsx @@ -7,7 +7,7 @@ import { BinaryNotFoundModal } from "../shared-modals/binary-not-found-modal"; import * as styles from "./downloads.css"; import { DeleteGameModal } from "./delete-game-modal"; import { DownloadGroup } from "./download-group"; -import { LibraryGame } from "@types"; +import type { LibraryGame } from "@types"; import { orderBy } from "lodash-es"; import { ArrowDownIcon } from "@primer/octicons-react"; diff --git a/src/renderer/src/pages/game-details/game-details.tsx b/src/renderer/src/pages/game-details/game-details.tsx index bab9452f..d32841c7 100644 --- a/src/renderer/src/pages/game-details/game-details.tsx +++ b/src/renderer/src/pages/game-details/game-details.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import { useNavigate, useParams, useSearchParams } from "react-router-dom"; -import { GameRepack, GameShop, Steam250Game } from "@types"; +import type { GameRepack, GameShop, Steam250Game } from "@types"; import { Button, ConfirmationModal } from "@renderer/components"; import { buildGameDetailsPath } from "@renderer/helpers"; diff --git a/src/renderer/src/pages/game-details/modals/remove-from-library-modal.tsx b/src/renderer/src/pages/game-details/modals/remove-from-library-modal.tsx index 09bf5d43..39789872 100644 --- a/src/renderer/src/pages/game-details/modals/remove-from-library-modal.tsx +++ b/src/renderer/src/pages/game-details/modals/remove-from-library-modal.tsx @@ -1,7 +1,7 @@ import { useTranslation } from "react-i18next"; import { Button, Modal } from "@renderer/components"; import * as styles from "./remove-from-library-modal.css"; -import { Game } from "@types"; +import type { Game } from "@types"; interface RemoveGameFromLibraryModalProps { visible: boolean; diff --git a/src/renderer/src/pages/profile/profile-content/profile-content.tsx b/src/renderer/src/pages/profile/profile-content/profile-content.tsx index a989b81d..d6b55490 100644 --- a/src/renderer/src/pages/profile/profile-content/profile-content.tsx +++ b/src/renderer/src/pages/profile/profile-content/profile-content.tsx @@ -14,7 +14,7 @@ import { LockedProfile } from "./locked-profile"; import { ReportProfile } from "../report-profile/report-profile"; import { FriendsBox } from "./friends-box"; import { RecentGamesBox } from "./recent-games-box"; -import { UserGame } from "@types"; +import type { UserGame } from "@types"; import { buildGameAchievementPath, buildGameDetailsPath, diff --git a/src/renderer/src/pages/settings/add-download-source-modal.tsx b/src/renderer/src/pages/settings/add-download-source-modal.tsx index 5ec22827..5b05d5b8 100644 --- a/src/renderer/src/pages/settings/add-download-source-modal.tsx +++ b/src/renderer/src/pages/settings/add-download-source-modal.tsx @@ -9,7 +9,7 @@ import { useForm } from "react-hook-form"; import * as yup from "yup"; import { yupResolver } from "@hookform/resolvers/yup"; import { downloadSourcesTable } from "@renderer/dexie"; -import { DownloadSourceValidationResult } from "@types"; +import type { DownloadSourceValidationResult } from "@types"; import { downloadSourcesWorker } from "@renderer/workers"; interface AddDownloadSourceModalProps { diff --git a/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-modal-list.tsx b/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-modal-list.tsx index 36ff7e14..d104e676 100644 --- a/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-modal-list.tsx +++ b/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-modal-list.tsx @@ -1,5 +1,5 @@ import { SPACING_UNIT, vars } from "@renderer/theme.css"; -import { UserFriend } from "@types"; +import type { UserFriend } from "@types"; import { useEffect, useRef, useState } from "react"; import { UserFriendItem } from "./user-friend-item"; import { useNavigate } from "react-router-dom"; diff --git a/src/renderer/src/workers/repacks.worker.ts b/src/renderer/src/workers/repacks.worker.ts index 6c3aca73..c2394510 100644 --- a/src/renderer/src/workers/repacks.worker.ts +++ b/src/renderer/src/workers/repacks.worker.ts @@ -1,6 +1,6 @@ import { repacksTable } from "@renderer/dexie"; import { formatName } from "@shared"; -import { GameRepack } from "@types"; +import type { GameRepack } from "@types"; import flexSearch from "flexsearch"; interface SerializedGameRepack extends Omit {