import type { MetaFunction } from "@remix-run/node"; import { useState } from "react"; import { Loader2, Ban, RotateCcw } from "lucide-react"; import { useAdminUsers, useAdminUserUpdate, } from "~/requestHandler/use-admin-hooks"; import type { AdminUserRow } from "~/requestHandler/use-admin-hooks"; import { AdminTable, AdminPagination, AdminToolbar, AdminSearch, AdminSelect, AdminPageTitle, StatusBadge, faDate, useDebouncedValue, type Column, } from "~/components/admin/DataTable"; export const meta: MetaFunction = () => [ { title: "کاربران | پنل مدیریت" }, { name: "robots", content: "noindex, nofollow" }, ]; const PAGE_SIZE = 25; export default function AdminUsers() { const [page, setPage] = useState(1); const [search, setSearch] = useState(""); const [active, setActive] = useState(""); const [role, setRole] = useState(""); const debouncedSearch = useDebouncedValue(search); const update = useAdminUserUpdate(); const { data, isLoading } = useAdminUsers({ page, page_size: PAGE_SIZE, search: debouncedSearch, is_active: active, is_seller: role === "seller" ? "true" : undefined, is_staff: role === "staff" ? "true" : undefined, }); 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: (u) => ( {u.phoneNumber} ), }, { header: "نام کاربری", render: (u) => {u.username || "—"}, }, { header: "نقش", render: (u) => (
{u.isSuperuser && } {u.isStaff && !u.isSuperuser && } {u.isSeller && } {!u.isSeller && !u.isStaff && !u.isSuperuser && ( کاربر )}
), }, { header: "وضعیت", render: (u) => u.isActive ? ( ) : ( ), }, { header: "عضویت", render: (u) => {faDate(u.createdAt)}, }, { header: "عملیات", className: "text-left", render: (u) => { const busy = pendingId === u.id; if (busy) return ; return (
{u.isActive ? ( ) : ( )}
); }, }, ]; return (
کاربران reset(() => setSearch(v))} placeholder="جستجوی تلفن، نام کاربری یا ایمیل…" /> reset(() => setActive(v))} options={[ { value: "", label: "همه" }, { value: "true", label: "فعال" }, { value: "false", label: "مسدود" }, ]} /> reset(() => setRole(v))} options={[ { value: "", label: "همه نقش‌ها" }, { value: "seller", label: "فروشنده" }, { value: "staff", label: "ادمین" }, ]} /> u.id} />
); }