"use client"; import { useEffect, useState } from "react"; import Shell from "@/components/Shell"; import EditableTable, { Col } from "@/components/EditableTable"; import { api } from "@/lib/api"; 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: "c1", label: "رنگ ۱ (hex)" }, { key: "c2", label: "رنگ ۲ (hex)" }, { key: "sort", label: "ترتیب", type: "number" }, { key: "enabled", label: "فعال", type: "bool" }, ]; const hex = (s: unknown) => { const v = String(s || "").replace("#", "").trim(); return /^[0-9a-fA-F]{6}$/.test(v) ? `#${v}` : null; }; function FramePreview({ row }: { row: Record }) { const a = hex(row.c1); const b = hex(row.c2); if (!a || !b) { return رتبه; } return (
); } export default function FramesPage() { const [rows, setRows] = useState([]); async function load() { const r = await api.get<{ frames: Row[] }>("/frames"); setRows(r.frames || []); } useEffect(() => { load(); }, []); return (

قابِ آواتار (کازمتیک). رنگِ گرادیان را با دو کدِ hex (مثلِ F3D27A) تعیین کنید؛ قابِ جدید بدونِ به‌روزرسانیِ اپ در بازی دیده می‌شود. شناسهٔ none = قابِ رتبه.

{ await api.post("/frames", row); await load(); }} onDelete={async (id) => { if (!confirm("حذف قاب؟")) return; await api.del(`/frames?id=${encodeURIComponent(id)}`); await load(); }} preview={(row) => } />
); }