import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { ArrowPathIcon, UserPlusIcon } from '@heroicons/react/24/outline'; import { toast } from 'sonner'; import { api } from '../lib/api'; import type { ApiResponse, PaginatedResponse } from '../lib/api'; import { formatDate } from '../lib/utils'; import DataTable, { Column } from '../components/ui/DataTable'; import Pagination from '../components/ui/Pagination'; import Modal from '../components/ui/Modal'; interface DoctorClaim { uuid: string; status: 'pending' | 'completed' | 'failed'; doctor: { uuid: string; name: string }; mobile_masked: string; verification_method: string; failure_reason: string | null; created_at: number; completed_at: number | null; } const FILTERS = [ { value: '', label: 'همه' }, { value: 'completed', label: 'موفق' }, { value: 'failed', label: 'ناموفق' }, { value: 'pending', label: 'در جریان' }, ]; const STATUS_BADGE: Record = { completed: { cls: 'green', label: 'موفق' }, failed: { cls: 'red', label: 'ناموفق' }, pending: { cls: 'amber', label: 'در جریان' }, }; const METHOD_LABEL: Record = { 'apiir_personinfo+shahkar': 'استعلام هویت + شاهکار', 'apiir_personinfo': 'استعلام هویت', 'admin_manual': 'انتقال دستی ادمین', }; export default function DoctorClaimsPage() { const qc = useQueryClient(); const [page, setPage] = useState(1); const [status, setStatus] = useState(''); const [transferTarget, setTransferTarget] = useState(null); const [transferMobile, setTransferMobile] = useState(''); const limit = 20; const { data, isLoading, refetch, isFetching } = useQuery({ queryKey: ['doctor-claims', page, status], queryFn: () => { const p = new URLSearchParams({ page: String(page), limit: String(limit) }); if (status) p.set('status', status); return api.get>(`/api/v1/admin/doctor-claims?${p}`); }, }); const transferMut = useMutation({ mutationFn: ({ doctorUuid, mobile }: { doctorUuid: string; mobile: string }) => api.post>(`/api/v1/admin/doctors/${doctorUuid}/transfer`, { mobile }), onSuccess: () => { toast.success('پروفایل با موفقیت منتقل شد'); setTransferTarget(null); setTransferMobile(''); qc.invalidateQueries({ queryKey: ['doctor-claims'] }); qc.invalidateQueries({ queryKey: ['admin-doctors'] }); }, onError: (err: Error) => toast.error(err.message), }); const columns: Column[] = [ { key: 'doctor', header: 'پزشک', render: (c) => {c.doctor?.name} }, { key: 'status', header: 'وضعیت', render: (c) => {STATUS_BADGE[c.status].label}, }, { key: 'mobile_masked', header: 'موبایل', render: (c) => {c.mobile_masked} }, { key: 'verification_method', header: 'روش احراز', render: (c) => METHOD_LABEL[c.verification_method] ?? c.verification_method, }, { key: 'failure_reason', header: 'علت شکست', render: (c) => c.failure_reason ? {c.failure_reason} : '—', }, { key: 'created_at', header: 'تاریخ درخواست', render: (c) => formatDate(c.created_at) }, { key: 'completed_at', header: 'پایان', render: (c) => (c.completed_at ? formatDate(c.completed_at) : '—'), }, ]; const items = data?.data ?? []; const total = data?.meta?.totalRecords ?? 0; return (

تصاحب پروفایل پزشکان

{total} درخواست — پروفایل‌های ایمپورت‌شده از نظام پزشکی
{FILTERS.map((f) => ( ))}
columns={columns} data={items} loading={isLoading} emptyMessage="هیچ درخواست تصاحبی ثبت نشده است" actions={(claim) => ( claim.status !== 'completed' ? ( ) : null )} />
setTransferTarget(null)} title={`انتقال دستی پروفایل ${transferTarget?.doctor?.name ?? ''}`} >

مالکیت پروفایل بدون استعلام هویت به کاربرِ این شماره منتقل می‌شود (اگر کاربری با این موبایل نباشد، ساخته می‌شود). فقط برای پشتیبانی استفاده کنید.

setTransferMobile(e.target.value)} placeholder="09xxxxxxxxx" maxLength={11} />
); }