From ed2cd6065b3686eb08383cad2370761532532de8 Mon Sep 17 00:00:00 2001 From: "Builder.io" Date: Sat, 18 Oct 2025 05:25:06 +0000 Subject: [PATCH] Enhance Achievements section: load all achievements, show earned/locked with filters cgen-532968449b3340469c83922673877ab7 --- client/pages/Dashboard.tsx | 149 +++++++++++++++++++++++-------------- 1 file changed, 94 insertions(+), 55 deletions(-) diff --git a/client/pages/Dashboard.tsx b/client/pages/Dashboard.tsx index 3bd0b64c..30150261 100644 --- a/client/pages/Dashboard.tsx +++ b/client/pages/Dashboard.tsx @@ -83,7 +83,9 @@ export default function Dashboard() { const [projects, setProjects] = useState([]); const [teams, setTeams] = useState([]); const [invites, setInvites] = useState([]); - const [achievements, setAchievements] = useState([]); + const [achievements, setAchievements] = useState([]); // earned achievements + const [allAchievements, setAllAchievements] = useState([]); + const [achievementFilter, setAchievementFilter] = useState<"all" | "earned" | "locked">("earned"); const [profileCompletion, setProfileCompletion] = useState(0); const [stats, setStats] = useState({ activeProjects: 0, @@ -384,16 +386,21 @@ export default function Dashboard() { console.warn("checkAndAwardProjectAchievements failed:", e); } - // Load user's achievements with error handling - let userAchievements = []; + // Load achievements (all and earned) + let userAchievements: any[] = []; + let catalog: any[] = []; try { - userAchievements = await aethexAchievementService.getUserAchievements( - user!.id, - ); - setAchievements(userAchievements); + const [earnedList, allList] = await Promise.all([ + aethexAchievementService.getUserAchievements(user!.id), + aethexAchievementService.getAllAchievements(), + ]); + userAchievements = earnedList || []; + catalog = allList || []; } catch (achievementError) { console.warn("Could not load achievements:", achievementError); - setAchievements([]); + } finally { + setAchievements(userAchievements); + setAllAchievements(catalog); } // Load follower count for real collaboration insight @@ -1372,68 +1379,100 @@ export default function Dashboard() { {/* Achievements */} - Achievements - - Your progress and accomplishments - - - -
- {achievements.length === 0 ? ( -
- -

- No achievements unlocked yet. Complete projects to - earn achievements! -

-
- ) : ( - achievements.map((achievement: any, index) => { - const Icon = getAchievementIcon( - achievement.icon || "star", - ); + Achievements + + Your progress and accomplishments + + + +
+
+ Earned {achievements.length} / {allAchievements.length} +
+
+ + + +
+
+
+ {(() => { + const earnedIds = new Set((achievements || []).map((a: any) => a.id)); + const source = (achievementFilter === "earned" + ? (achievements || []) + : achievementFilter === "locked" + ? (allAchievements || []).filter((a: any) => !earnedIds.has(a.id)) + : (allAchievements || [])).map((a: any) => ({ ...a, earned: earnedIds.has(a.id) })); + if (!source.length) { + return ( +
+ +

No achievements to display.

+
+ ); + } + return source + .sort((a: any, b: any) => Number(b.earned) - Number(a.earned)) + .map((achievement: any, index: number) => { + const Icon = getAchievementIcon(achievement.icon || "star"); return (
-
-
- -
-
-

+
+
- {achievement.title} -

-

- {achievement.description} -

+ +
+
+

+ {achievement.title} +

+

{achievement.description}

+
{achievement.earned && ( - + )}
); - }) - )} -
-
+ }); + })()} + +
{/* Teams & Invitations */}