"use client"; import { useCallback, useEffect, useState } from "react"; interface Tpl { id: string; name: string; slug: string; view_count?: number; use_count?: number; rate_avg?: number; rate_count?: number; sort?: number; } const card = "rounded-xl border border-[#1e2235] bg-[#0f1120]"; const inp = "rounded-lg border border-[#262b40] bg-[#0c0e1a] px-2 py-1 text-sm text-gray-100 outline-none focus:border-indigo-500"; const ghost = "rounded-lg border border-[#262b40] px-2.5 py-1 text-xs text-gray-300 hover:bg-[#161a2e] disabled:opacity-50"; const SORTS = [ { key: "use_count_desc", label: "محبوب‌ترین (استفاده)" }, { key: "view_count_desc", label: "پربازدیدترین" }, { key: "rating_desc", label: "بالاترین امتیاز" }, { key: "sort_asc", label: "ترتیب دستی" }, ]; export function RankingAdmin() { const [rows, setRows] = useState([]); const [sort, setSort] = useState("use_count_desc"); const [loading, setLoading] = useState(true); const [draft, setDraft] = useState>({}); const [msg, setMsg] = useState(null); const load = useCallback(async () => { setLoading(true); const r = await fetch(`/api/admin/resource/templates?sort=${sort}&pageSize=100&isPublished=true`, { cache: "no-store" }) .then((x) => x.json()).catch(() => null); const list: Tpl[] = r?.data ?? (Array.isArray(r) ? r : []); setRows(list); setDraft(Object.fromEntries(list.map((t) => [t.id, String(t.sort ?? 0)]))); setLoading(false); }, [sort]); useEffect(() => { load(); }, [load]); const saveSort = async (id: string) => { const res = await fetch(`/api/admin/resource/templates/${id}/sort`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ sort: Number(draft[id]) || 0 }), }); setMsg(res.ok ? "ترتیب ذخیره شد ✓" : "خطا"); setTimeout(() => setMsg(null), 2000); }; return (

رتبه‌بندی قالب‌ها

قالب‌ها را بر اساس محبوبیت ببینید و وزن ترتیب دستی را برای «ویژه/پین» تنظیم کنید.

{msg && {msg}}
{loading ? ( ) : rows.length === 0 ? ( ) : rows.map((t, i) => ( ))}
#قالب بازدیداستفادهامتیاز ترتیب دستی
در حال بارگذاری…
قالبی یافت نشد.
{i + 1} {t.name} {(t.view_count ?? 0).toLocaleString("fa-IR")} {(t.use_count ?? 0).toLocaleString("fa-IR")} {(t.rate_avg ?? 0).toFixed(1)} ({t.rate_count ?? 0})
setDraft({ ...draft, [t.id]: e.target.value })} />
); }