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 (
{label}
{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}»
) : (
بالاترین سطح را دریافت کردهاید.
)}
);
}