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 { Doctor } from '../types'; import { formatDate } 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 DoctorsPage() { 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: ['doctors', page, search], queryFn: () => api.get>( `/api/v1/doctors?page=${page}&limit=${limit}${search ? `&search=${encodeURIComponent(search)}` : ''}`, ), }); const deleteMutation = useMutation({ mutationFn: (d: Doctor) => api.delete>(`/api/v1/doctor/${d.uuid}`), onSuccess: () => { toast.success('پزشک حذف شد'); setDeleteTarget(null); qc.invalidateQueries({ queryKey: ['doctors'] }); }, onError: (err: Error) => toast.error(err.message), }); const columns: Column[] = [ { key: 'name', header: 'نام', render: (d) => (
{d.profile_image ? ( ) : (
{d.first_name?.[0] ?? '?'}
)} {d.first_name} {d.last_name}
), }, { key: 'medical_code', header: 'کد نظام پزشکی' }, { key: 'degree', header: 'درجه', render: (d) => {d.degree}, }, { key: 'gender', header: 'جنسیت', render: (d) => d.gender === 'male' ? 'آقا' : 'خانم', }, { key: 'specialties', header: 'تخصص‌ها', render: (d) => (
{d.specialties?.slice(0, 2).map((s) => ( {s.name} ))} {(d.specialties?.length ?? 0) > 2 && ( +{d.specialties.length - 2} )}
), }, { key: 'is_active', header: 'وضعیت', render: (d) => , }, { key: 'created_at', header: 'تاریخ ثبت', render: (d) => formatDate(d.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={(doctor) => ( <> )} />
deleteTarget && deleteMutation.mutate(deleteTarget)} onCancel={() => setDeleteTarget(null)} />
); }