From f0e0abae8c1705f24d3853665d4f2992b30be677 Mon Sep 17 00:00:00 2001 From: Zamitto <167933696+zamitto@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:58:10 -0300 Subject: [PATCH] feat: showing achievements queue --- .../achievements/merge-achievements.ts | 3 ++ .../src/pages/achievement/achievement.tsx | 46 +++++++++++++------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts index 0005598a..dd4bd465 100644 --- a/src/main/services/achievements/merge-achievements.ts +++ b/src/main/services/achievements/merge-achievements.ts @@ -66,6 +66,9 @@ export const mergeAchievements = async ( if (newAchievements.length && publishNotification) { const achievementsInfo = newAchievements + .sort((a, b) => { + return a.unlockTime - b.unlockTime; + }) .map((achievement) => { return JSON.parse(localGameAchievement?.achievements || "[]").find( (steamAchievement) => { diff --git a/src/renderer/src/pages/achievement/achievement.tsx b/src/renderer/src/pages/achievement/achievement.tsx index fbdcaa89..27559e38 100644 --- a/src/renderer/src/pages/achievement/achievement.tsx +++ b/src/renderer/src/pages/achievement/achievement.tsx @@ -1,15 +1,18 @@ -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import achievementSound from "@renderer/assets/audio/achievement.wav"; import { useTranslation } from "react-i18next"; import { vars } from "@renderer/theme.css"; +interface AchievementInfo { + displayName: string; + iconUrl: string; +} + export function Achievement() { const { t } = useTranslation("achievement"); - const [achievementInfo, setAchievementInfo] = useState<{ - displayName: string; - icon: string; - } | null>(null); + const [achievements, setAchievements] = useState([]); + const achievementAnimation = useRef(-1); const audio = useMemo(() => { const audio = new Audio(achievementSound); @@ -24,11 +27,7 @@ export function Achievement() { if (!achievements) return; if (achievements.length) { - const achievement = achievements[0]; - setAchievementInfo({ - displayName: achievement.displayName, - icon: achievement.iconUrl, - }); + setAchievements((ach) => ach.concat(achievements)); } audio.play(); @@ -40,7 +39,26 @@ export function Achievement() { }; }, [audio]); - if (!achievementInfo) return null; + const hasAchievementsPending = achievements.length > 0; + + useEffect(() => { + if (hasAchievementsPending) { + let zero = performance.now(); + achievementAnimation.current = requestAnimationFrame( + function animateLock(time) { + if (time - zero > 3000) { + zero = performance.now(); + setAchievements((ach) => ach.slice(1)); + } + achievementAnimation.current = requestAnimationFrame(animateLock); + } + ); + } else { + cancelAnimationFrame(achievementAnimation.current); + } + }, [hasAchievementsPending]); + + if (!hasAchievementsPending) return null; return (
{achievementInfo.displayName}

{t("achievement_unlocked")}

-

{achievementInfo.displayName}

+

{achievements[0].displayName}

);