"use client"; import { useEffect, useRef, useState } from "react"; import { Upload, Loader2 } from "lucide-react"; import Shell from "@/components/Shell"; import EditableTable, { Col } from "@/components/EditableTable"; import { TableSkeleton } from "@/components/Skeleton"; import Thumb from "@/components/Thumb"; import { api, getAuth, ASSET_BASE } from "@/lib/api"; import { toastError, toastSuccess } from "@/lib/toast"; type Row = Record; const COLS: Col[] = [ { key: "id", label: "شناسه" }, { key: "title", label: "عنوان" }, { key: "price_coins", label: "قیمت (سکه)", type: "number" }, { key: "vip", label: "VIP رایگان", type: "bool" }, { key: "sort", label: "ترتیب", type: "number" }, ]; const API = process.env.NEXT_PUBLIC_API_URL || "https://hakem.approagency.ir/admin/api"; export default function AvatarsPage() { const [rows, setRows] = useState([]); const [ver, setVer] = useState(1); // تازه‌سازیِ کشِ تصویر پس از آپلود const [loading, setLoading] = useState(true); async function load() { setLoading(true); try { const r = await api.get<{ avatars: Row[] }>("/avatars"); setRows(r.avatars || []); setVer((v) => v + 1); } finally { setLoading(false); } } useEffect(() => { load(); }, []); return (

شخصیتِ آواتار که کاربر می‌خرد و در کلِ بازی (سرِ میز، پروفایل و لابی) دیده می‌شود. ابتدا ردیف را با شناسه و قیمت بسازید، سپس یک تصویرِ{" "} png یا svg (ترجیحاً مربع و با پس‌زمینه‌ی شفاف) آپلود کنید.

{loading ? ( ) : ( { await api.post("/avatars", row); await load(); }} onDelete={async (id) => { if (!confirm("حذف شخصیت؟")) return; await api.del(`/avatars?id=${encodeURIComponent(id)}`); await load(); }} preview={(row) => ( )} extra={(row) => } /> )}
); } function UploadBtn({ id, onDone }: { id: string; onDone: () => void }) { const ref = useRef(null); const [busy, setBusy] = useState(false); async function upload(file: File) { setBusy(true); try { const fd = new FormData(); fd.append("image", file); const auth = getAuth(); const res = await fetch(`${API}/avatars/${encodeURIComponent(id)}/upload`, { method: "POST", headers: auth ? { Authorization: `Basic ${auth}` } : {}, body: fd, }); if (!res.ok) throw new Error("آپلود ناموفق بود"); toastSuccess("تصویر آپلود شد"); onDone(); } catch (e) { toastError((e as Error).message); } finally { setBusy(false); } } return ( <> { const f = e.target.files?.[0]; if (f) upload(f); e.target.value = ""; }} /> ); }