From ab27fd21d78dbec96c19f2a8fec04468c67ed5a4 Mon Sep 17 00:00:00 2001
From: Zamitto <167933696+zamitto@users.noreply.github.com>
Date: Fri, 18 Oct 2024 09:52:43 -0300
Subject: [PATCH] feat: redoing page
---
src/renderer/src/hooks/use-user-details.ts | 13 +-
.../achievements/achievements-content.tsx | 337 ++++++++----------
.../pages/achievements/achievements.css.ts | 25 +-
3 files changed, 170 insertions(+), 205 deletions(-)
diff --git a/src/renderer/src/hooks/use-user-details.ts b/src/renderer/src/hooks/use-user-details.ts
index 649d24a4..1872c95d 100644
--- a/src/renderer/src/hooks/use-user-details.ts
+++ b/src/renderer/src/hooks/use-user-details.ts
@@ -1,4 +1,4 @@
-import { useCallback } from "react";
+import { useCallback, useMemo } from "react";
import { useAppDispatch, useAppSelector } from "./redux";
import {
setProfileBackground,
@@ -129,7 +129,16 @@ export function useUserDetails() {
const unblockUser = (userId: string) => window.electron.unblockUser(userId);
- const hasActiveSubscription = userDetails?.subscription?.status === "active";
+ const hasActiveSubscription = useMemo(() => {
+ if (!userDetails?.subscription) {
+ return false;
+ }
+
+ return (
+ userDetails.subscription.expiresAt == null ||
+ new Date(userDetails.subscription.expiresAt) > new Date()
+ );
+ }, [userDetails]);
return {
userDetails,
diff --git a/src/renderer/src/pages/achievements/achievements-content.tsx b/src/renderer/src/pages/achievements/achievements-content.tsx
index fbf9da9f..874368a8 100644
--- a/src/renderer/src/pages/achievements/achievements-content.tsx
+++ b/src/renderer/src/pages/achievements/achievements-content.tsx
@@ -5,15 +5,19 @@ import { useContext, useEffect, useMemo, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import * as styles from "./achievements.css";
import { formatDownloadProgress } from "@renderer/helpers";
-import { LockIcon, PersonIcon, TrophyIcon } from "@primer/octicons-react";
+import {
+ CheckCircleIcon,
+ LockIcon,
+ PersonIcon,
+ TrophyIcon,
+ UnlockIcon,
+} from "@primer/octicons-react";
import { SPACING_UNIT, vars } from "@renderer/theme.css";
import { gameDetailsContext } from "@renderer/context";
import { UserAchievement } from "@types";
import { average } from "color.js";
import Color from "color";
-const HERO_ANIMATION_THRESHOLD = 25;
-
interface UserInfo {
userId: string;
displayName: string;
@@ -32,180 +36,85 @@ interface AchievementListProps {
interface AchievementPanelProps {
user: UserInfo;
- otherUser: UserInfo | null;
}
-function AchievementPanel({ user, otherUser }: AchievementPanelProps) {
- const { t } = useTranslation("achievement");
- const { userDetails } = useUserDetails();
+function AchievementPanel({ user }: AchievementPanelProps) {
+ const { userDetails, hasActiveSubscription } = useUserDetails();
const userTotalAchievementCount = user.achievements.length;
const userUnlockedAchievementCount = user.achievements.filter(
(achievement) => achievement.unlocked
).length;
- if (!otherUser) {
+ const getProfileImage = (user: UserInfo) => {
return (
-
-
-
- {t("your_achievements")}
-
-
-
-
-
- {userUnlockedAchievementCount} / {userTotalAchievementCount}
-
-
-
-
- {formatDownloadProgress(
- userUnlockedAchievementCount / userTotalAchievementCount
- )}
-
-
-
+ ) : (
+
+ )}
);
- }
+ };
- const otherUserUnlockedAchievementCount = otherUser.achievements.filter(
- (achievement) => achievement.unlocked
- ).length;
- const otherUserTotalAchievementCount = otherUser.achievements.length;
+ if (userDetails?.id == user.userId && !hasActiveSubscription) {
+ return <>>;
+ }
return (
-
+ {getProfileImage(user)}
+
+
{user.displayName}
-
- {otherUser.displayName}
-
-
-
-
- {otherUserUnlockedAchievementCount} /{" "}
- {otherUserTotalAchievementCount}
-
-
-
+
- {formatDownloadProgress(
- otherUserUnlockedAchievementCount /
- otherUserTotalAchievementCount
- )}
+ {userUnlockedAchievementCount} / {userTotalAchievementCount}
-
-
-
-
- {userDetails?.displayName}
-
-
-
-
-
- {userUnlockedAchievementCount} / {userTotalAchievementCount}
-
-
-
- {formatDownloadProgress(
- userUnlockedAchievementCount / userTotalAchievementCount
- )}
-
-
-
+
+ {formatDownloadProgress(
+ userUnlockedAchievementCount / userTotalAchievementCount
+ )}
+
+
);
@@ -220,18 +129,6 @@ function AchievementList({ user, otherUser }: AchievementListProps) {
const { userDetails } = useUserDetails();
- const getProfileImage = (imageUrl: string | null | undefined) => {
- return (
-
- {imageUrl ? (
-

- ) : (
-
- )}
-
- );
- };
-
if (!otherUserAchievements || otherUserAchievements.length === 0) {
return (
@@ -271,7 +168,7 @@ function AchievementList({ user, otherUser }: AchievementListProps) {
-
-
+
{otherUserAchievement.unlockTime ? (
-
- {getProfileImage(otherUser.profileImageUrl)}
-
{t("unlocked_at")}
-
{formatDateTime(otherUserAchievement.unlockTime)}
+
+
+ {formatDateTime(otherUserAchievement.unlockTime)}
) : (
)}
-
+
{userDetails?.subscription && achievements[index].unlockTime ? (
- {getProfileImage(user.profileImageUrl)}
-
{t("unlocked_at")}
+
{formatDateTime(achievements[index].unlockTime)}
) : (
)}
@@ -334,7 +245,6 @@ export function AchievementsContent({ otherUser }: AchievementsContentProps) {
const heroRef = useRef
(null);
const containerRef = useRef(null);
const [isHeaderStuck, setIsHeaderStuck] = useState(false);
- const [backdropOpactiy, setBackdropOpacity] = useState(1);
const { gameTitle, objectId, shop, achievements, gameColor, setGameColor } =
useContext(gameDetailsContext);
@@ -380,11 +290,6 @@ export function AchievementsContent({ otherUser }: AchievementsContentProps) {
const heroHeight = heroRef.current?.clientHeight ?? styles.HERO_HEIGHT;
const scrollY = (event.target as HTMLDivElement).scrollTop;
- const opacity = Math.max(
- 0,
- 1 - scrollY / (heroHeight - HERO_ANIMATION_THRESHOLD)
- );
-
if (scrollY >= heroHeight && !isHeaderStuck) {
setIsHeaderStuck(true);
}
@@ -392,8 +297,22 @@ export function AchievementsContent({ otherUser }: AchievementsContentProps) {
if (scrollY <= heroHeight && isHeaderStuck) {
setIsHeaderStuck(false);
}
+ };
- setBackdropOpacity(opacity);
+ const getProfileImage = (user: UserInfo) => {
+ return (
+
+ {user.profileImageUrl ? (
+

+ ) : (
+
+ )}
+
+ );
};
if (!objectId || !shop || !gameTitle || !userDetails) return null;
@@ -402,6 +321,7 @@ export function AchievementsContent({ otherUser }: AchievementsContentProps) {
})
-
-
-
-
+
-
+ {otherUser && (
+
+
+
+
{getProfileImage(otherUser)}
+
+ {getProfileImage({
+ ...userDetails,
+ userId: userDetails.id,
+ achievements: sortedAchievements,
+ })}
+
+
+
+ )}
+