"use client"; import { useMemo, useState } from "react"; import type { Achievement, AchievementCategory, ScreenId } from "../../types/passport"; import EmptyState from "../shared/EmptyState"; import ProgressBar from "../shared/ProgressBar"; import StatusPill, { type StatusTone } from "../shared/StatusPill"; interface AchievementsScreenProps { achievements: Achievement[]; onClaimAchievement: (achievementId: string) => void; onNavigate: (screen: ScreenId) => void; } function rarityTone(rarity: Achievement["rarity"]): StatusTone { switch (rarity) { case "legendary": return "gold"; case "epic": return "epic"; case "rare": return "info"; case "uncommon": return "success"; case "common": default: return "neutral"; } } export default function AchievementsScreen({ achievements, onClaimAchievement, onNavigate, }: AchievementsScreenProps) { const [categoryFilter, setCategoryFilter] = useState("all"); const [stateFilter, setStateFilter] = useState<"all" | "unlocked" | "in-progress" | "claimed">( "all", ); const categories = useMemo( () => ["all", ...Array.from(new Set(achievements.map((achievement) => achievement.category)))] as const, [achievements], ); const filteredAchievements = achievements .filter((achievement) => categoryFilter === "all" || achievement.category === categoryFilter) .filter((achievement) => { if (stateFilter === "all") { return true; } if (stateFilter === "unlocked") { return achievement.unlocked && !achievement.claimed; } if (stateFilter === "claimed") { return Boolean(achievement.claimed); } return !achievement.unlocked; }); const unlockedCount = achievements.filter((achievement) => achievement.unlocked).length; const claimableCount = achievements.filter( (achievement) => achievement.unlocked && !achievement.claimed, ).length; return (

Achievements

Badges for every fan behaviour.

Achievements translate product goals into visible rewards: collecting, predicting, watching, answering, sharing, and saving memories.

{categories.map((category) => ( ))}
{(["all", "unlocked", "in-progress", "claimed"] as const).map((state) => ( ))}
{filteredAchievements.length === 0 ? ( ) : (
{filteredAchievements.map((achievement) => { const claimable = achievement.unlocked && !achievement.claimed; return (

{achievement.title}

{achievement.category}

{achievement.description}

{achievement.rarity} {achievement.claimed ? "Claimed" : achievement.unlocked ? "Unlocked" : "In progress"}

Reward: {achievement.reward}

{claimable ? ( ) : achievement.unlocked ? ( ) : ( )}
); })}
)}
); }