Skip to content

Commit 72869b2

Browse files
SebasianDevAndyvargtz
authored andcommitted
Refactor badge unlocking logic in RewardBoard and BadgeNotification components
- Updated the RewardBoard component to determine badge unlocking based on completion of all requirements instead of mere existence of user badges. - Introduced a default image for badges in the BadgeNotification component to ensure consistent display when no image is provided. - Cleaned up code for improved readability and maintainability across both components.
1 parent 40e8027 commit 72869b2

File tree

3 files changed

+45
-46
lines changed

3 files changed

+45
-46
lines changed

components/profile/reward-board/component/reward-board.tsx

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,44 +18,45 @@ export default async function RewardBoard() {
1818
const badges = await getAllBadges();
1919

2020
const academyBadges = badges.filter((badge) => badge.category == "academy")?.sort((a, b) => a.id.localeCompare(b.id));
21-
// COMMENTED OUT: Hackathon badges feature disabled
22-
// const hackathonBadges: Badge[] = badges.filter((badge) => badge.category == "hackathon")?.sort((a, b) => a.id.localeCompare(b.id));
21+
const hackathonBadges: Badge[] = badges.filter((badge) => badge.category == "hackathon")?.sort((a, b) => a.id.localeCompare(b.id));
2322
// COMMENTED OUT: Points feature disabled
2423
// const totalPoints = userBadges.reduce((acc, userBadge) => acc + userBadge.points, 0);
25-
// const hackathonBadgesUnlocked = hackathonBadges.map((badge) => {
26-
// const userBadge = userBadges.find((userBadge) => userBadge.badge_id == badge.id);
27-
// return {
28-
// ...badge,
29-
// is_unlocked: !!userBadge,
30-
// requirements: userBadge?.requirements || badge.requirements,
31-
// };
32-
// });
24+
const hackathonBadgesUnlocked = hackathonBadges.map((badge) => {
25+
const userBadge = userBadges.find((userBadge) => userBadge.badge_id == badge.id);
26+
27+
const allRequirementsCompleted = userBadge?.requirements && userBadge.requirements.length > 0 &&
28+
userBadge.requirements.every((requirement) => requirement.unlocked === true);
29+
return {
30+
...badge,
31+
is_unlocked: !!allRequirementsCompleted,
32+
requirements: userBadge?.requirements || badge.requirements,
33+
};
34+
});
3335

3436
const academyBadgesUnlocked = academyBadges.map((badge) => {
3537
const userBadge = userBadges.find((userBadge) => userBadge.badge_id == badge.id);
36-
// Only consider badge unlocked if status is approved (not pending)
37-
const isUnlocked = userBadge?.status === BadgeAwardStatus.approved;
38+
const allRequirementsCompleted = userBadge?.requirements && userBadge.requirements.length > 0 &&
39+
userBadge.requirements.every((requirement) => requirement.unlocked === true);
3840
return {
3941
...badge,
40-
is_unlocked: isUnlocked,
42+
is_unlocked: !!allRequirementsCompleted,
4143
requirements: userBadge?.requirements || badge.requirements,
4244
};
4345

4446
}).sort(element=>element.is_unlocked ? -1 : 1);
45-
// COMMENTED OUT: Hackathon badges feature disabled
46-
// const rewards = hackathonBadgesUnlocked.map((reward) => (
47-
// <RewardCard
48-
// key={reward.name}
49-
// icon={reward.image_path}
50-
// name={reward.name}
51-
// description={reward.description}
52-
// category={reward.category}
53-
// is_unlocked={reward.is_unlocked}
54-
// image={reward.image_path}
55-
// requirements={reward.requirements}
56-
// id={reward.id}
57-
// />
58-
// ));
47+
const rewards = hackathonBadgesUnlocked.map((reward) => (
48+
<RewardCard
49+
key={reward.name}
50+
icon={reward.image_path}
51+
name={reward.name}
52+
description={reward.description}
53+
category={reward.category}
54+
is_unlocked={reward.is_unlocked}
55+
image={reward.image_path}
56+
requirements={reward.requirements}
57+
id={reward.id}
58+
/>
59+
));
5960

6061
const academyRewards = academyBadgesUnlocked.map((reward) => (
6162

components/quizzes/components/BadgeNotification.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,22 @@ export const BadgeNotification = ({
2020
const [isModalOpen, setIsModalOpen] = useState(false);
2121

2222
const [badges, setBadges] = useState<BadgeData[]>([]);
23-
23+
const badgeDefaultImage = "/wolfie/wolfie-hack.png";
2424
useEffect(() => {
2525
if (isCompleted && session) {
2626
awardBadge()
2727
.then((badge) => {
28-
28+
2929
if (
3030
badge.result &&
3131
Array.isArray(badge.result.badges) &&
3232
badge.result.badges.length > 0
3333
) {
34-
34+
3535
setBadges(badge.result.badges);
3636
setShowFireworks(true);
3737
setIsModalOpen(true);
38-
38+
3939
}
4040
})
4141
.catch((error) => {
@@ -109,7 +109,7 @@ export const BadgeNotification = ({
109109
{badges.map((badge, index) => (
110110
<div key={index} className="flex flex-col items-center px-2 py-2 gap-4 w-[250px]">
111111
<Image
112-
src={badge.image_path}
112+
src={badge.image_path && badge.image_path != '' ? badge.image_path : badgeDefaultImage as string}
113113
alt={badge.name}
114114
width={80}
115115
height={80}
@@ -136,7 +136,7 @@ export const BadgeNotification = ({
136136
)}
137137
</div>
138138
}
139-
className="z-50 inline-block! w-auto! max-w-[75vw]! border border-red-500"
139+
className="z-50 inline-block! w-auto! max-w-[75vw]! border border-red-500"
140140
/>
141141
</div>
142142
);

components/showcase/assign-badge.tsx

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,17 @@ export const AssignBadge = ({
2626
const [isLoading, setIsLoading] = useState(false);
2727
useEffect(() => {
2828
const fetchBadges = async () => {
29-
// COMMENTED OUT: Hackathon badges feature disabled
30-
// const response = await axios.get("/api/badge/get-all");
31-
// const filteredBadges = response.data.filter(
32-
// (badge: Badge) => badge.category == "hackathon"
33-
// );
34-
// setOptionsWithLabel(
35-
// filteredBadges.map((option: Badge) => ({
36-
// label: option.name,
37-
// value: option.id,
38-
// }))
39-
// );
40-
// Return empty array since hackathon badges are disabled
41-
setOptionsWithLabel([]);
29+
30+
const response = await axios.get("/api/badge/get-all");
31+
const filteredBadges = response.data.filter(
32+
(badge: Badge) => badge.category == "hackathon"
33+
);
34+
setOptionsWithLabel(
35+
filteredBadges.map((option: Badge) => ({
36+
label: option.name,
37+
value: option.id,
38+
}))
39+
);
4240
};
4341
fetchBadges();
4442
}, []);

0 commit comments

Comments
 (0)