Skip to content

Commit 3730468

Browse files
authored
Merge pull request #3459 from ava-labs/rebase_voyager_badges_multi_req
Rebase voyager badges multi req
2 parents 40e8027 + d4684bf commit 3730468

File tree

4 files changed

+71
-50
lines changed

4 files changed

+71
-50
lines changed

components/login/user-button/UserButton.tsx

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,27 @@ import { signOut, useSession } from 'next-auth/react';
1111
import Image from 'next/image';
1212
import Link from 'next/link';
1313
import SignOutComponent from '../sign-out/SignOut';
14-
import { useState } from 'react';
14+
import { useState, useMemo } from 'react';
1515
import { CircleUserRound } from 'lucide-react';
1616
import { Separator } from '@radix-ui/react-dropdown-menu';
1717
export function UserButton() {
1818
const { data: session, status } = useSession() ?? {};
1919
const [isDialogOpen, setIsDialogOpen] = useState(false);
2020
const isAuthenticated = status === 'authenticated';
21+
22+
// Dividir el correo por @ para evitar cortes no deseados
23+
const formattedEmail = useMemo(() => {
24+
const email = session?.user?.email;
25+
if (!email) return null;
26+
27+
const atIndex = email.indexOf('@');
28+
if (atIndex === -1) return { localPart: email, domain: null };
29+
30+
return {
31+
localPart: email.substring(0, atIndex),
32+
domain: email.substring(atIndex), // Incluye el @
33+
};
34+
}, [session?.user?.email]);
2135
const handleSignOut = (): void => {
2236
// Clean up any stored redirect URLs before logout
2337
if (typeof window !== "undefined") {
@@ -66,9 +80,18 @@ export function UserButton() {
6680
shadow-lg p-1 rounded-md w-48'
6781
>
6882
<div className="px-2 py-1.5">
69-
<p className="text-sm break-words">
70-
{session.user.email || 'No email available'}
71-
</p>
83+
{formattedEmail ? (
84+
<div className="text-sm">
85+
<div className="break-words">{formattedEmail.localPart}</div>
86+
{formattedEmail.domain && (
87+
<div className="break-words">{formattedEmail.domain}</div>
88+
)}
89+
</div>
90+
) : (
91+
<p className="text-sm break-words">
92+
{session.user.email || 'No email available'}
93+
</p>
94+
)}
7295

7396
<p className="text-sm break-words mt-1">
7497
{session.user.name || 'No name available'}

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

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,44 +18,44 @@ 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+
const allRequirementsCompleted = userBadge?.requirements && userBadge.requirements.length > 0 &&
27+
userBadge.requirements.every((requirement) => requirement.unlocked === true);
28+
return {
29+
...badge,
30+
is_unlocked: !!allRequirementsCompleted,
31+
requirements: userBadge?.requirements || badge.requirements,
32+
};
33+
});
3334

3435
const academyBadgesUnlocked = academyBadges.map((badge) => {
3536
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;
37+
const allRequirementsCompleted = userBadge?.requirements && userBadge.requirements.length > 0 &&
38+
userBadge.requirements.every((requirement) => requirement.unlocked === true);
3839
return {
3940
...badge,
40-
is_unlocked: isUnlocked,
41+
is_unlocked: !!allRequirementsCompleted,
4142
requirements: userBadge?.requirements || badge.requirements,
4243
};
4344

4445
}).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-
// ));
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+
));
5959

6060
const academyRewards = academyBadgesUnlocked.map((reward) => (
6161

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)