"use client" import { useState, useEffect } from "react" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { Flame, Star, Trophy, Zap, TrendingUp } from "lucide-react" import { getApiUrl } from "@/lib/api-config" import { motion } from "framer-motion" interface LevelProgress { current_xp: number level: number level_name: string xp_for_next: number xp_progress: number progress_percent: number streak_days: number } const TIER_COLORS = { bronze: "bg-amber-700/20 text-amber-600 border-amber-600/30", silver: "bg-slate-400/20 text-slate-300 border-slate-400/30", gold: "bg-yellow-500/20 text-yellow-400 border-yellow-500/30", platinum: "bg-cyan-400/20 text-cyan-300 border-cyan-400/30", diamond: "bg-purple-500/20 text-purple-300 border-purple-500/30", } export function LevelProgressCard() { const [progress, setProgress] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { fetchProgress() }, []) const fetchProgress = async () => { const token = localStorage.getItem("token") if (!token) { setLoading(false) return } try { const res = await fetch(`${getApiUrl()}/gamification/me`, { headers: { Authorization: `Bearer ${token}` } }) if (res.ok) { const data = await res.json() setProgress(data) } } catch (err) { console.error("Failed to fetch level progress", err) } finally { setLoading(false) } } if (loading) { return
Loading...
} if (!progress) { return null } return (
Level Progress
{progress.streak_days > 0 && ( {progress.streak_days} day streak )}
{/* Level Badge */}
{progress.level}

{progress.level_name}

{progress.current_xp.toLocaleString()} XP total

{/* Progress Bar */}
Level {progress.level + 1} {progress.xp_progress} / {progress.xp_for_next} XP

{Math.round(progress.xp_for_next - progress.xp_progress)} XP until next level

{/* XP Tips */}

Earn XP by:

Rating performances
Writing reviews
Marking attendance
Daily streaks
) }