import type { MetaFunction } from "@remix-run/node"; import { useState } from "react"; import { useAdminOrders } from "~/requestHandler/use-admin-hooks"; import type { AdminOrderRow } from "~/requestHandler/use-admin-hooks"; import { AdminTable, AdminPagination, AdminToolbar, AdminSearch, AdminSelect, AdminPageTitle, StatusBadge, faToman, faDate, useDebouncedValue, type Column, } from "~/components/admin/DataTable"; export const meta: MetaFunction = () => [ { title: "سفارش‌ها | پنل مدیریت" }, { name: "robots", content: "noindex, nofollow" }, ]; const PAGE_SIZE = 25; const STATUS: Record = { pending: { label: "در انتظار", tone: "yellow" }, confirmed: { label: "تأییدشده", tone: "blue" }, shipped: { label: "ارسال‌شده", tone: "blue" }, delivered: { label: "تحویل‌شده", tone: "green" }, cancelled: { label: "لغوشده", tone: "red" }, }; const PAYMENT: Record = { paid: { label: "پرداخت‌شده", tone: "green" }, pending: { label: "در انتظار", tone: "yellow" }, failed: { label: "ناموفق", tone: "red" }, }; export default function AdminOrders() { const [page, setPage] = useState(1); const [search, setSearch] = useState(""); const [status, setStatus] = useState(""); const [payment, setPayment] = useState(""); const debouncedSearch = useDebouncedValue(search); const { data, isLoading } = useAdminOrders({ page, page_size: PAGE_SIZE, search: debouncedSearch, status, payment_status: payment, }); const reset = (fn: () => void) => { fn(); setPage(1); }; const columns: Column[] = [ { header: "کد", render: (o) => {o.id.slice(0, 8)}, }, { header: "خریدار", render: (o) => (

{o.userName || "—"}

{o.userPhone || ""}

), }, { header: "فروشگاه", render: (o) => {o.sellerName || o.sellerUsername || "—"}, }, { header: "مبلغ", render: (o) => {faToman(o.totalPrice)}, }, { header: "پرداخت", render: (o) => { const p = PAYMENT[o.paymentStatus] || { label: o.paymentStatus, tone: "gray" as const }; return ; }, }, { header: "وضعیت", render: (o) => { const s = STATUS[o.status] || { label: o.status, tone: "gray" as const }; return ; }, }, { header: "تاریخ", render: (o) => {faDate(o.createdAt)}, }, ]; return (
سفارش‌ها reset(() => setSearch(v))} placeholder="جستجوی خریدار یا فروشگاه…" /> reset(() => setStatus(v))} options={[ { value: "", label: "همه وضعیت‌ها" }, { value: "pending", label: "در انتظار" }, { value: "confirmed", label: "تأییدشده" }, { value: "shipped", label: "ارسال‌شده" }, { value: "delivered", label: "تحویل‌شده" }, { value: "cancelled", label: "لغوشده" }, ]} /> reset(() => setPayment(v))} options={[ { value: "", label: "همه پرداخت‌ها" }, { value: "paid", label: "پرداخت‌شده" }, { value: "pending", label: "در انتظار" }, { value: "failed", label: "ناموفق" }, ]} /> o.id} />
); }