import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import { EyeIcon, TrashIcon, PencilIcon } from '@heroicons/react/24/outline'; import { toast } from 'sonner'; import { api } from '../lib/api'; import type { ApiResponse, PaginatedResponse } from '../lib/api'; import type { User } from '../types'; import { formatDate, maskMobile } from '../lib/utils'; import PageHeader from '../components/ui/PageHeader'; import DataTable, { Column } from '../components/ui/DataTable'; import { ActiveBadge } from '../components/ui/StatusBadge'; import Pagination from '../components/ui/Pagination'; import ConfirmDialog from '../components/ui/ConfirmDialog'; export default function UsersPage() { const navigate = useNavigate(); const qc = useQueryClient(); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const [deleteTarget, setDeleteTarget] = useState(null); const limit = 15; const { data, isLoading } = useQuery({ queryKey: ['users', page, search], queryFn: () => api.get>( `/api/v1/admin/users?page=${page}&limit=${limit}${search ? `&search=${encodeURIComponent(search)}` : ''}`, ), }); const deleteMutation = useMutation({ mutationFn: (user: User) => api.delete>(`/api/v1/user/${user.id}`), onSuccess: () => { toast.success('کاربر حذف شد'); setDeleteTarget(null); qc.invalidateQueries({ queryKey: ['users'] }); }, onError: (err: Error) => toast.error(err.message), }); const columns: Column[] = [ { key: 'name', header: 'نام', render: (u) => ( {u.name || (u.first_name || u.last_name ? `${u.first_name ?? ''} ${u.last_name ?? ''}`.trim() : '—')} ), }, { key: 'mobile_number', header: 'موبایل', render: (u) => {maskMobile(u.mobile_number)}, }, { key: 'roles', header: 'نقش', render: (u) => ( {u.roles.includes('ROLE_ADMIN') ? 'ادمین' : u.roles.includes('ROLE_DOCTOR') ? 'پزشک' : 'کاربر'} ), }, { key: 'is_active', header: 'وضعیت', render: (u) => , }, { key: 'created_at', header: 'تاریخ ثبت', render: (u) => formatDate(u.created_at), }, ]; const items = data?.data ?? []; const total = data?.meta?.totalRecords ?? 0; return (
columns={columns} data={items} loading={isLoading} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو بر اساس نام یا موبایل..." emptyMessage="هیچ کاربری یافت نشد" actions={(user) => ( <> )} />
deleteTarget && deleteMutation.mutate(deleteTarget)} onCancel={() => setDeleteTarget(null)} />
); }