From c24f6be1b7b99ace92838b8033da66d6cefbd4ac Mon Sep 17 00:00:00 2001 From: Zamitto <167933696+zamitto@users.noreply.github.com> Date: Sun, 13 Oct 2024 22:22:36 -0300 Subject: [PATCH] feat: comparing achievements --- .../achievement/achievements-content.tsx | 191 +++++++++++------- .../src/pages/achievement/achievements.css.ts | 4 +- 2 files changed, 121 insertions(+), 74 deletions(-) diff --git a/src/renderer/src/pages/achievement/achievements-content.tsx b/src/renderer/src/pages/achievement/achievements-content.tsx index 3520ffcc..51dda100 100644 --- a/src/renderer/src/pages/achievement/achievements-content.tsx +++ b/src/renderer/src/pages/achievement/achievements-content.tsx @@ -6,7 +6,7 @@ import { useTranslation } from "react-i18next"; import * as styles from "./achievements.css"; import { formatDownloadProgress } from "@renderer/helpers"; import { TrophyIcon } from "@primer/octicons-react"; -import { vars } from "@renderer/theme.css"; +import { SPACING_UNIT, vars } from "@renderer/theme.css"; import { gameDetailsContext } from "@renderer/context"; import { GameShop, UserAchievement } from "@types"; import { average } from "color.js"; @@ -19,6 +19,107 @@ interface AchievementsContentProps { displayName: string | null; } +interface AchievementListProps { + achievements: UserAchievement[]; +} + +interface AchievementPanelProps { + achievements: UserAchievement[]; + displayName: string | null; +} + +function AchievementPanel({ + achievements, + displayName, +}: AchievementPanelProps) { + const { t } = useTranslation("achievement"); + + const unlockedAchievementCount = achievements.filter( + (achievement) => achievement.unlocked + ).length; + + const totalAchievementCount = achievements.length; + return ( +
+

+ {displayName + ? t("user_achievements", { + displayName, + }) + : t("your_achievements")} +

+
+
+ + + {unlockedAchievementCount} / {totalAchievementCount} + +
+ + + {formatDownloadProgress( + unlockedAchievementCount / totalAchievementCount + )} + +
+ +
+ ); +} + +function AchievementList({ achievements }: AchievementListProps) { + const { formatDateTime } = useDate(); + + return ( + + ); +} + export function AchievementsContent({ userId, displayName, @@ -31,13 +132,9 @@ export function AchievementsContent({ [] ); - const { t } = useTranslation("achievement"); - const { gameTitle, objectId, shop, achievements, gameColor, setGameColor } = useContext(gameDetailsContext); - const { formatDateTime } = useDate(); - const dispatch = useAppDispatch(); useEffect(() => { @@ -93,12 +190,6 @@ export function AchievementsContent({ const userAchievements = userId ? pageAchievements : achievements; - const unlockedAchievementCount = userAchievements.filter( - (achievement) => achievement.unlocked - ).length; - - const totalAchievementCount = userAchievements.length; - return (
-

- {displayName - ? t("user_achievements", { - displayName, - }) - : t("your_achievements")} -

-
-
- - - {unlockedAchievementCount} / {totalAchievementCount} - -
- - - {formatDownloadProgress( - unlockedAchievementCount / totalAchievementCount - )} - -
- + {pageAchievements.length > 0 && ( + + )}
+
+ {pageAchievements.length > 0 && ( + + )} -
    - {userAchievements.map((achievement, index) => ( -
  • - {achievement.displayName} -
    -

    {achievement.displayName}

    -

    {achievement.description}

    - - {achievement.unlockTime && - formatDateTime(achievement.unlockTime)} - -
    -
  • - ))} -
+ +
); diff --git a/src/renderer/src/pages/achievement/achievements.css.ts b/src/renderer/src/pages/achievement/achievements.css.ts index 9dc6ac00..8c6683b6 100644 --- a/src/renderer/src/pages/achievement/achievements.css.ts +++ b/src/renderer/src/pages/achievement/achievements.css.ts @@ -66,10 +66,10 @@ export const panel = recipe({ width: "100%", height: "100px", minHeight: "100px", - padding: `${SPACING_UNIT * 2}px ${SPACING_UNIT * 2}px`, + padding: `${SPACING_UNIT * 2}px 0`, backgroundColor: vars.color.darkBackground, display: "flex", - flexDirection: "column", + flexDirection: "row", transition: "all ease 0.2s", borderBottom: `solid 1px ${vars.color.border}`, position: "sticky",