import { useState, type CSSProperties } from "react"; import { CalendarCheck2, ChevronLeft, ChevronRight, CircleHelp, MessageCircle, Trophy, } from "lucide-react"; import Image from "next/image"; import { Button } from "@/components/ui/button"; import { ActivityBadgePaths } from "@/components/profile/ActivityBadgePaths"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { getGamificationBadgeImagePath, rankLevels, } from "@/lib/gamification-badges"; import { Link } from "@/lib/router"; import type { GamificationSummarySchema } from "@/lib/types"; import { formatNumberPersian } from "@/lib/utils"; function ScoreBreakdown({ icon: Icon, label, points, }: { icon: typeof CalendarCheck2; label: string; points: number; }) { return (
{formatNumberPersian(points)}
); } export function GamificationCard({ summary, isLoading, isError, onRetry, }: { summary?: GamificationSummarySchema; isLoading: boolean; isError: boolean; onRetry: () => void; }) { const [selectedRankIndex, setSelectedRankIndex] = useState(null); if (isLoading) { return (
); } if (isError || !summary) { return (

رتبه و نشان‌ها بارگذاری نشد

برای دریافت دوباره اطلاعات تلاش کنید.

); } const currentRankIndex = Math.max(rankLevels.findIndex((level) => level.id === summary.current_level.id), 0); const nextRankIndex = summary.next_level ? rankLevels.findIndex((level) => level.id === summary.next_level?.id) : -1; const defaultRankIndex = nextRankIndex >= 0 ? nextRankIndex : currentRankIndex; const visibleRankIndex = Math.min(selectedRankIndex ?? defaultRankIndex, rankLevels.length - 1); const visibleRank = rankLevels[visibleRankIndex]; const visibleRankImage = getGamificationBadgeImagePath(visibleRank.badgeId); const visibleRankPointTarget = visibleRank.minimumPoints; const visibleRankPoints = Math.min(Math.max(summary.points_total, 0), visibleRankPointTarget); const nextLevelPointTarget = summary.next_level?.minimum_points ?? 0; const nextLevelProgressPercent = nextLevelPointTarget > 0 ? Math.min(Math.max((summary.points_total / nextLevelPointTarget) * 100, 0), 100) : 100; const earnedBadgeIds = new Set(summary.badges.map((badge) => badge.id)); const visibleRankIsEarned = earnedBadgeIds.has(visibleRank.badgeId); const visibleRankIsNextLevel = summary.next_level?.id === visibleRank.id; return (
دستاوردهای من وضعیت نشان‌ها و جوایز شما بر اساس فعالیت‌ها و مشارکت‌ها در انجمن

{visibleRank.label}

{formatNumberPersian(visibleRankPoints).replace(/,/g, "")} از {formatNumberPersian(visibleRankPointTarget).replace(/,/g, "")} امتیاز

{visibleRankImage ? ( visibleRankIsNextLevel && !visibleRankIsEarned ? (
) : ( ) ) : null}
{summary.next_level ? (

{formatNumberPersian(summary.points_to_next)} امتیاز تا رسیدن به «{summary.next_level.label}»

) : (

بالاترین سطح را دریافت کرده‌اید.

)}
); }