import type { MetaFunction } from "@remix-run/node"; import { useState } from "react"; import { Check, X, BadgeCheck, Loader2 } from "lucide-react"; import { useAdminSellers, useAdminSellerUpdate, } from "~/requestHandler/use-admin-hooks"; import type { AdminSellerRow } from "~/requestHandler/use-admin-hooks"; import SellerLogo from "~/components/SellerLogo"; import { AdminTable, AdminPagination, AdminToolbar, AdminSearch, AdminSelect, AdminPageTitle, StatusBadge, faNum, 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" }, approved: { label: "تأییدشده", tone: "green" }, rejected: { label: "ردشده", tone: "red" }, }; export default function AdminSellers() { const [page, setPage] = useState(1); const [search, setSearch] = useState(""); const [status, setStatus] = useState(""); const [verified, setVerified] = useState(""); const debouncedSearch = useDebouncedValue(search); const update = useAdminSellerUpdate(); const { data, isLoading } = useAdminSellers({ page, page_size: PAGE_SIZE, search: debouncedSearch, status, is_verified: verified, }); const reset = (fn: () => void) => { fn(); setPage(1); }; const pendingId = update.isPending ? update.variables?.id : null; const actBtn = "inline-flex items-center gap-1 px-2 py-1 rounded-lg text-[12px] font-semibold transition-colors disabled:opacity-40 cursor-pointer"; const columns: Column[] = [ { header: "فروشگاه", render: (s) => (

{s.storeName}

@{s.username}

), }, { header: "تلفن", render: (s) => ( {s.userPhone || "—"} ), }, { header: "وضعیت", render: (s) => { const st = STATUS[s.status] || { label: s.status, tone: "yellow" as const }; return (
{s.isVerified && }
); }, }, { header: "کمیسیون", render: (s) => {faNum(s.platformFee)}٪, }, { header: "محصولات", render: (s) => {faNum(s.productCount)}, }, { header: "دنبال‌کننده", render: (s) => {faNum(s.followerCount)}, }, { header: "تاریخ", render: (s) => {faDate(s.createdAt)}, }, { header: "عملیات", className: "text-left", render: (s) => { const busy = pendingId === s.id; if (busy) return ; return (
{s.status !== "approved" && ( )} {s.status !== "rejected" && ( )}
); }, }, ]; return (
فروشگاه‌ها reset(() => setSearch(v))} placeholder="جستجوی نام یا آیدی فروشگاه…" /> reset(() => setStatus(v))} options={[ { value: "", label: "همه وضعیت‌ها" }, { value: "pending", label: "در انتظار" }, { value: "approved", label: "تأییدشده" }, { value: "rejected", label: "ردشده" }, ]} /> reset(() => setVerified(v))} options={[ { value: "", label: "احراز: همه" }, { value: "true", label: "احرازشده" }, { value: "false", label: "احرازنشده" }, ]} /> s.id} />
); }