import React from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { ArrowRightIcon } from '@heroicons/react/24/outline'; import { toast } from 'sonner'; import { api } from '../lib/api'; import type { ApiResponse } from '../lib/api'; import type { Payment } from '../types'; import { formatDateTime, formatRial } from '../lib/utils'; import PageHeader from '../components/ui/PageHeader'; import StatusBadge from '../components/ui/StatusBadge'; import ConfirmDialog from '../components/ui/ConfirmDialog'; const PAYMENT_TYPE_LABELS: Record = { appointment: 'نوبت', subscription: 'اشتراک', sms_wallet: 'کیف پول پیامک', }; function InfoRow({ label, value }: { label: string; value: React.ReactNode }) { return (
{label} {value ?? '—'}
); } export default function PaymentDetailPage() { const { uuid } = useParams<{ uuid: string }>(); const navigate = useNavigate(); const { data, isLoading } = useQuery({ queryKey: ['payment', uuid], queryFn: () => api.get>(`/api/v1/admin/payments/${uuid}`), enabled: !!uuid, }); const payment = data?.data; const queryClient = useQueryClient(); const [confirm, setConfirm] = React.useState(null); const action = useMutation({ mutationFn: (kind: 'refund' | 'reverse') => api.post>(`/api/v1/admin/payments/${uuid}/${kind}`, {}), onSuccess: (_res, kind) => { toast.success(kind === 'refund' ? 'درخواست استرداد وجه ثبت شد' : 'برگشت وجه انجام شد'); queryClient.invalidateQueries({ queryKey: ['payment', uuid] }); setConfirm(null); }, onError: (e: any) => { toast.error(e?.message || 'عملیات ناموفق بود'); setConfirm(null); }, }); const canRefund = payment?.status === 'success' && payment?.gateway === 'mellat'; return (
navigate('/admin/payments')} className="flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400 hover:text-slate-800 dark:hover:text-slate-100 transition-colors"> بازگشت } /> {isLoading ? (
{Array.from({ length: 6 }).map((_, i) => (
))}
) : payment ? (
{payment.uuid}} /> {payment.order_id} : null} /> {payment.patient_mobile}} /> } /> {payment.gateway}} /> {payment.ref_id} : null} /> {payment.card_pan} : null} /> {payment.appointment_uuid && ( مشاهده نوبت } /> )}
{payment.refunds && payment.refunds.length > 0 && (

استردادها

{payment.refunds.map((r, i) => ( {formatRial(r.amount)} {r.ref && ({r.ref})} } /> ))}
)} {canRefund && (
)} confirm && action.mutate(confirm)} onCancel={() => setConfirm(null)} />
) : (
پرداختی یافت نشد
)}
); }