"use client"; import { useEffect, useState } from "react"; import { Trash2, Plus } from "lucide-react"; import Shell from "@/components/Shell"; import EditableTable, { Col } from "@/components/EditableTable"; import { api } from "@/lib/api"; type Row = Record; const PACK_COLS: Col[] = [ { key: "id", label: "شناسه" }, { key: "title", label: "عنوان" }, { key: "kind", label: "نوع (text/emoji)" }, { key: "price_coins", label: "قیمت (سکه)", type: "number" }, { key: "vip", label: "VIP رایگان", type: "bool" }, { key: "sort", label: "ترتیب", type: "number" }, ]; export default function ChatPage() { const [packs, setPacks] = useState([]); const [messages, setMessages] = useState([]); const [sel, setSel] = useState(""); const [newMsg, setNewMsg] = useState(""); async function load() { const r = await api.get<{ packs: Row[]; messages: Row[] }>("/chat"); setPacks(r.packs || []); setMessages(r.messages || []); if (!sel && r.packs?.length) setSel(String(r.packs[0].id)); } useEffect(() => { load(); }, []); // eslint-disable-line react-hooks/exhaustive-deps const packMsgs = messages.filter((m) => String(m.pack_id) === sel); async function addMsg() { if (!sel || !newMsg.trim()) return; await api.post("/chat/message", { pack_id: sel, body: newMsg.trim(), sort: packMsgs.length }); setNewMsg(""); await load(); } return (

بسته‌ها

{ await api.post("/chat/pack", row); await load(); }} onDelete={async (id) => { if (!confirm("حذف بسته و پیام‌هایش؟")) return; await api.del(`/chat/pack?id=${encodeURIComponent(id)}`); await load(); }} />

پیام‌ها

setNewMsg(e.target.value)} onKeyDown={(e) => e.key === "Enter" && addMsg()} />
{packMsgs.map((m) => ( {String(m.body)} ))} {packMsgs.length === 0 && ( پیامی نیست )}
); }