import React, { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import { MagnifyingGlassIcon, EyeIcon, BanknotesIcon, ClockIcon, CreditCardIcon, ArrowDownTrayIcon, } from '@heroicons/react/24/outline'; import { api } from '../lib/api'; import type { PaginatedResponse } from '../lib/api'; import type { Payment } 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: 'pending', label: 'در انتظار' }, { value: 'success', label: 'موفق' }, { value: 'failed', label: 'ناموفق' }, { value: 'canceled', label: 'لغو شده' }, { value: 'refunded', label: 'استرداد' }, ]; export default function PaymentsPage() { const navigate = useNavigate(); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const limit = 15; const { data, isLoading } = useQuery({ queryKey: ['payments', 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/payments?${params}`); }, }); const columns: Column[] = [ { key: 'patient_mobile', header: 'بیمار', render: (p) => (
{maskMobile(p.patient_mobile).slice(0, 2)}
{maskMobile(p.patient_mobile)}
), }, { key: 'amount', header: 'مبلغ', render: (p) => {formatRial(p.amount)}, }, { key: 'status', header: 'وضعیت', render: (p) => , }, { key: 'gateway', header: 'درگاه', render: (p) => {p.gateway}, }, { key: 'ref_id', header: 'شماره مرجع', render: (p) => p.ref_id ? {p.ref_id} : , }, { key: 'paid_at', header: 'تاریخ پرداخت', render: (p) => {formatDate(p.paid_at)}, }, { key: 'created_at', header: 'تاریخ ثبت', render: (p) => {formatDate(p.created_at)}, }, ]; const items = data?.data ?? []; const total = data?.meta?.totalRecords ?? 0; const statCards = [ { label: 'کل تراکنش‌ها', value: total > 0 ? String(total) : null, bg: 'var(--primary-soft)', color: 'var(--primary)', Icon: CreditCardIcon }, { label: 'تأییدشده', value: null, bg: 'var(--success-bg)', color: 'var(--success)', Icon: BanknotesIcon }, { label: 'در انتظار', value: null, bg: 'var(--warning-bg)', color: 'var(--warning)', Icon: ClockIcon }, { label: 'استرداد شده', value: null, bg: 'var(--info-bg)', color: 'var(--info)', Icon: ArrowDownTrayIcon }, ]; 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={(payment) => ( )} />
); }