import React, { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import { MagnifyingGlassIcon, EyeIcon, CalendarIcon, ClockIcon, CheckCircleIcon, XCircleIcon, } from '@heroicons/react/24/outline'; import { api } from '../lib/api'; import type { PaginatedResponse } from '../lib/api'; import type { Appointment } from '../types'; import { formatDate, formatRial, maskMobile } from '../lib/utils'; import DataTable, { Column } from '../components/ui/DataTable'; import StatusBadge from '../components/ui/StatusBadge'; import Pagination from '../components/ui/Pagination'; const STATUS_FILTERS = [ { value: '', label: 'همه' }, { value: 'waiting_for_payment', label: 'در انتظار پرداخت' }, { value: 'reserved', label: 'رزرو شده' }, { value: 'visited', label: 'ویزیت شده' }, { value: 'cancelled_by_user', label: 'لغو شده' }, ]; export default function AppointmentsPage() { const navigate = useNavigate(); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const limit = 15; const { data, isLoading } = useQuery({ queryKey: ['appointments', page, search, statusFilter], queryFn: () => { const params = new URLSearchParams({ page: String(page), limit: String(limit) }); if (search) params.set('search', search); if (statusFilter) params.set('status', statusFilter); return api.get>(`/api/v1/admin/appointments?${params}`); }, }); const columns: Column[] = [ { key: 'patient', header: 'بیمار', render: (a) => (
{(a.patient_name ?? '؟').slice(0, 2)}
{a.patient_name || '—'}
{maskMobile(a.patient_mobile)}
), }, { key: 'doctor_name', header: 'پزشک', render: (a) => `دکتر ${a.doctor_name}` }, { key: 'clinic_name', header: 'کلینیک', render: (a) => {a.clinic_name ?? '—'} }, { key: 'appointment_date', header: 'تاریخ نوبت', render: (a) => (
{formatDate(a.appointment_date)}
{a.appointment_time}
), }, { key: 'status', header: 'وضعیت', render: (a) => , }, { key: 'amount', header: 'مبلغ', render: (a) => <>{formatRial(a.amount)} تومان, }, { key: 'created_at', header: 'تاریخ ثبت', render: (a) => {formatDate(a.created_at)} }, ]; const items = data?.data ?? []; const total = data?.meta?.totalRecords ?? 0; const statCards = [ { label: 'کل نوبت‌ها', value: total > 0 ? String(total) : null, bg: 'var(--info-bg)', color: 'var(--info)', Icon: CalendarIcon }, { label: 'در انتظار', value: null, bg: 'var(--warning-bg)', color: 'var(--warning)', Icon: ClockIcon }, { label: 'ویزیت شده', value: null, bg: 'var(--success-bg)', color: 'var(--success)', Icon: CheckCircleIcon }, { label: 'لغو شده', value: null, bg: 'var(--danger-bg)', color: 'var(--danger)', Icon: XCircleIcon }, ]; return (
{/* Header */}

نوبت‌ها

مدیریت و پیگیری نوبت‌های درمانی
{/* Stat cards */}
{statCards.map((c) => (
{c.label}
{isLoading ? : c.value ?? '—'}
))}
{/* Main card */}
{ setSearch(e.target.value); setPage(1); }} />
{STATUS_FILTERS.map((f) => ( ))}
columns={columns} data={items} loading={isLoading} emptyMessage="هیچ نوبتی یافت نشد" actions={(appt) => ( )} />
); }