"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { Users, ShoppingBag, Gamepad2, Coins, Trophy, RotateCcw, Wallet, } from "lucide-react"; import Shell from "@/components/Shell"; import StatCard from "@/components/StatCard"; import Badge from "@/components/Badge"; import RevenueChart from "@/components/RevenueChart"; import { fmtNum } from "@/components/NumberInput"; import { api } from "@/lib/api"; import { KIND_LABEL, KIND_TONE } from "@/lib/labels"; type Recent = { id: number; mobile: string; name: string; kind: string; product_id: string; product_title: string; price_toman: number; created_local: string; }; type Dash = { users: number; purchases: number; games: number; coins: number; tournaments: number; season: number; revenue: number; revenue_today: { count: number; revenue: number }; revenue_14d: { date: string; revenue: number; count: number }[]; recent: Recent[]; }; export default function DashboardPage() { const [d, setD] = useState(null); const [err, setErr] = useState(""); useEffect(() => { api .get("/dashboard") .then(setD) .catch((e) => setErr(e.message)); }, []); async function resetSeason() { if (!confirm("فصلِ رتبه‌بندی صفر شود؟ این کار برگشت‌ناپذیر است.")) return; await api.post("/season/reset"); const nd = await api.get("/dashboard"); setD(nd); } const cards = [ { label: "درآمد کل", value: d ? fmtNum(d.revenue) : undefined, suffix: "تومان", icon: Wallet, c: "var(--gold)" }, { label: "کاربران", value: d ? fmtNum(d.users) : undefined, icon: Users, c: "#60a5fa" }, { label: "خریدها", value: d ? fmtNum(d.purchases) : undefined, icon: ShoppingBag, c: "#c084fc" }, { label: "بازی‌ها", value: d ? fmtNum(d.games) : undefined, icon: Gamepad2, c: "#4ade80" }, { label: "کل سکه‌ها", value: d ? fmtNum(d.coins) : undefined, icon: Coins, c: "var(--gold)" }, { label: "تورنومنت‌ها", value: d ? fmtNum(d.tournaments) : undefined, icon: Trophy, c: "#fbbf24" }, ]; return ( {err &&

{err}

}
{cards.map((c) => ( } color={c.c} loading={!d && !err} /> ))}
درآمدِ ۱۴ روزِ گذشته
بر اساسِ پرداخت‌های تأییدشده
{d && (
{fmtNum(d.revenue_today.revenue)} تومان امروز
)}
{d ? ( ) : (
)}
آخرین خریدها
همه‌ی تراکنش‌ها
{d?.recent.map((r) => ( ))} {d && d.recent.length === 0 && ( )}
کاربر محصول نوع مبلغ زمان (تهران)
{r.name || "—"}
{r.mobile}
{r.product_title || r.product_id} {KIND_LABEL[r.kind] ?? (r.kind || "نامشخص")} {fmtNum(r.price_toman)} {" "} تومان {r.created_local}
هنوز خریدی ثبت نشده
فصل رتبه‌بندی: {d?.season ?? "—"}
با ریست، امتیازِ رتبه‌ی همه صفر و فصلِ جدید آغاز می‌شود.
); }