diff --git a/src/renderer/src/pages/achievement/achievements-content.tsx b/src/renderer/src/pages/achievement/achievements-content.tsx index 1a3fbd14..6b2bd1e1 100644 --- a/src/renderer/src/pages/achievement/achievements-content.tsx +++ b/src/renderer/src/pages/achievement/achievements-content.tsx @@ -18,7 +18,7 @@ interface UserInfo { userId: string; displayName: string; achievements: UserAchievement[]; - profileImageUrl: string; + profileImageUrl: string | null; } interface AchievementsContentProps { @@ -31,26 +31,14 @@ interface AchievementListProps { } interface AchievementPanelProps { - achievements: UserAchievement[]; - displayName: string | null; - profileImageUrl: string | null; + user: UserInfo; + otherUser: UserInfo | null; } -function AchievementPanel({ - achievements, - displayName, - profileImageUrl, -}: AchievementPanelProps) { +function AchievementPanel({ user, otherUser }: AchievementPanelProps) { const { t } = useTranslation("achievement"); - const unlockedAchievementCount = achievements.filter( - (achievement) => achievement.unlocked - ).length; - - const { userDetails } = useUserDetails(); - - const getProfileImage = () => { - const imageUrl = profileImageUrl || userDetails?.profileImageUrl; + const getProfileImage = (imageUrl: string | null | undefined) => { return (
{imageUrl ? ( @@ -62,67 +50,195 @@ function AchievementPanel({ ); }; - const totalAchievementCount = achievements.length; - return ( -
- {getProfileImage()} + const userTotalAchievementCount = user.achievements.length; + const userUnlockedAchievementCount = user.achievements.filter( + (achievement) => achievement.unlocked + ).length; + + if (!otherUser) { + return (
-

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

+ {getProfileImage(user.profileImageUrl)}
+

+ {t("your_achievements")} +

- +
+ + + {userUnlockedAchievementCount} / {userTotalAchievementCount} + +
+ - {unlockedAchievementCount} / {totalAchievementCount} + {formatDownloadProgress( + userUnlockedAchievementCount / userTotalAchievementCount + )}
- - - {formatDownloadProgress( - unlockedAchievementCount / totalAchievementCount - )} - +
-
-
+ ); + } + + const otherUserUnlockedAchievementCount = otherUser.achievements.filter( + (achievement) => achievement.unlocked + ).length; + const otherUserTotalAchievementCount = otherUser.achievements.length; + + return ( + <> +
+ {getProfileImage(otherUser.profileImageUrl)} +
+

+ {t("user_achievements", { + displayName: otherUser.displayName, + })} +

+
+
+ + + {otherUserUnlockedAchievementCount} /{" "} + {otherUserTotalAchievementCount} + +
+ + + {formatDownloadProgress( + otherUserUnlockedAchievementCount / + otherUserTotalAchievementCount + )} + +
+ +
+
+
+ {getProfileImage(user.profileImageUrl)} +
+

+ {t("your_achievements")} +

+
+
+ + + {userUnlockedAchievementCount} / {userTotalAchievementCount} + +
+ + + {formatDownloadProgress( + userUnlockedAchievementCount / userTotalAchievementCount + )} + +
+ +
+
+ ); } @@ -258,6 +374,8 @@ export function AchievementsContent({ otherUser }: AchievementsContentProps) { const dispatch = useAppDispatch(); + const { userDetails } = useUserDetails(); + useEffect(() => { if (gameTitle) { dispatch(setHeaderTitle(gameTitle)); @@ -297,7 +415,7 @@ export function AchievementsContent({ otherUser }: AchievementsContentProps) { setBackdropOpacity(opacity); }; - if (!objectId || !shop || !gameTitle) return null; + if (!objectId || !shop || !gameTitle || !userDetails) return null; return (
@@ -337,18 +455,13 @@ export function AchievementsContent({ otherUser }: AchievementsContentProps) {
- {otherUser && ( - - )} -