diff --git a/client/components/admin/AdminStaffAchievements.tsx b/client/components/admin/AdminStaffAchievements.tsx new file mode 100644 index 00000000..d47fd378 --- /dev/null +++ b/client/components/admin/AdminStaffAchievements.tsx @@ -0,0 +1,259 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Progress } from "@/components/ui/progress"; +import { Trophy, TrendingUp, Star } from "lucide-react"; +import { useState } from "react"; + +interface Achievement { + id: string; + name: string; + description: string; + icon: string; + progress: number; + target: number; + completed: boolean; + earnedBy: number; + rarity: "common" | "rare" | "epic" | "legendary"; +} + +export default function AdminStaffAchievements() { + const [filterRarity, setFilterRarity] = useState("all"); + + const achievements: Achievement[] = [ + { + id: "first-step", + name: "First Step", + description: "Complete your first task", + icon: "👣", + progress: 1, + target: 1, + completed: true, + earnedBy: 12, + rarity: "common", + }, + { + id: "community-champion", + name: "Community Champion", + description: "Help 10 community members", + icon: "🏆", + progress: 7, + target: 10, + completed: false, + earnedBy: 3, + rarity: "epic", + }, + { + id: "code-master", + name: "Code Master", + description: "Contribute 50 code reviews", + icon: "💻", + progress: 25, + target: 50, + completed: false, + earnedBy: 2, + rarity: "legendary", + }, + { + id: "documentation-king", + name: "Documentation King", + description: "Write 20 documentation entries", + icon: "📚", + progress: 15, + target: 20, + completed: false, + earnedBy: 4, + rarity: "rare", + }, + { + id: "bug-squasher", + name: "Bug Squasher", + description: "Fix 25 reported bugs", + icon: "🐛", + progress: 12, + target: 25, + completed: false, + earnedBy: 5, + rarity: "rare", + }, + { + id: "mentor", + name: "Mentor", + description: "Mentor 5 junior developers", + icon: "🎓", + progress: 2, + target: 5, + completed: false, + earnedBy: 1, + rarity: "epic", + }, + ]; + + const getRarityColor = (rarity: Achievement["rarity"]) => { + const colors: Record = { + common: "bg-gray-100 text-gray-900 dark:bg-gray-900/30", + rare: "bg-blue-100 text-blue-900 dark:bg-blue-900/30", + epic: "bg-purple-100 text-purple-900 dark:bg-purple-900/30", + legendary: "bg-yellow-100 text-yellow-900 dark:bg-yellow-900/30", + }; + return colors[rarity]; + }; + + const filteredAchievements = + filterRarity === "all" + ? achievements + : achievements.filter((a) => a.rarity === filterRarity); + + const completedCount = achievements.filter((a) => a.completed).length; + const totalProgress = achievements.reduce((acc, a) => acc + a.progress, 0); + const totalTarget = achievements.reduce((acc, a) => acc + a.target, 0); + + return ( +
+
+

Achievement Tracking

+

+ Team achievements and progress tracking +

+
+ + {/* Overview Stats */} +
+ + + + + Completed + + + +
{completedCount}
+

+ of {achievements.length} achievements +

+
+
+ + + + + Overall Progress + + + +
+ {Math.round((totalProgress / totalTarget) * 100)}% +
+ +
+
+ + + + + Team Average + + + +
+ {( + achievements.reduce((acc, a) => acc + a.earnedBy, 0) / + achievements.length + ).toFixed(1)} +
+

members per achievement

+
+
+
+ + {/* Filter */} +
+ + {["common", "rare", "epic", "legendary"].map((rarity) => ( + + ))} +
+ + {/* Achievements Grid */} +
+ {filteredAchievements.map((achievement) => ( + + +
+
+
{achievement.icon}
+
+ + {achievement.name} + + + {achievement.description} + +
+
+ + {achievement.rarity} + +
+
+ +
+
+ Progress + + {achievement.progress}/{achievement.target} + +
+ +
+
+ Earned by {achievement.earnedBy} members + {achievement.completed && ( + + ✓ Completed + + )} +
+
+
+ ))} +
+ + {filteredAchievements.length === 0 && ( + +

+ No achievements with this rarity level +

+
+ )} +
+ ); +}