import { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; import { adminApi } from './adminApi.js'; import Modal from './Modal.jsx'; import StatusBadge from './StatusBadge.jsx'; const FIELDS = [ ['full_name', 'Name'], ['email', 'Email'], ['agreement_date', 'Agreement date'], ['age', 'Age'], ['address', 'Address'], ['registration_no', 'Registration number'], ['medical_council', 'Medical council'], ['pan', 'PAN'], ['gstin', 'GSTIN'], ['bank_name', 'Bank'], ['account_holder', 'Account holder'], ['account_number', 'Account number'], ['ifsc', 'IFSC'], ['rejection_reason', 'Rejection reason'], ]; export default function ApplicationDetailPage() { const { id } = useParams(); const [application, setApplication] = useState(null); const [error, setError] = useState(''); const [confirming, setConfirming] = useState(false); const [rejecting, setRejecting] = useState(false); const [reason, setReason] = useState(''); const [busy, setBusy] = useState(false); useEffect(() => { adminApi(`/api/admin/applications/${id}`) .then(setApplication) .catch((loadError) => setError(loadError.message)); }, [id]); async function resendSurveyLink() { setBusy(true); setError(''); try { setApplication( await adminApi(`/api/admin/applications/${id}/resend-survey-link`, { method: 'POST' }), ); } catch (resendError) { setError(resendError.message); } finally { setBusy(false); } } async function approve() { setBusy(true); setError(''); try { setApplication(await adminApi(`/api/admin/applications/${id}/approve`, { method: 'POST' })); setConfirming(false); } catch (approveError) { setError(approveError.message); } finally { setBusy(false); } } async function reject(event) { event.preventDefault(); setBusy(true); setError(''); try { setApplication( await adminApi(`/api/admin/applications/${id}/reject`, { method: 'POST', body: { reason }, }), ); setRejecting(false); setReason(''); } catch (rejectError) { setError(rejectError.message); } finally { setBusy(false); } } if (!application && !error) { return

Loading application…

; } if (!application) { return

{error}

; } const canDecide = application.status === 'SUBMITTED'; return (

{application.full_name || 'Application'}

{error ?

{error}

: null}
{FIELDS.map(([key, label]) => (
{label}
{application[key] || '—'}
))}

Signature

{application.signature ? (

{application.signature.type} at {application.signature.signedAt}
IP {application.signature.ip || '—'}
{application.signature.userAgent || 'Device not recorded'}

) : (

No signature

)} {canDecide ? (
) : null}

Events

    {application.audit.map((event) => (
  1. {event.action} · {event.createdAt}
  2. ))}

Emails

{application.emails.some( (email) => email.status === 'bounced' || email.status === 'dropped', ) ? (

An email bounced or was dropped. Check the address before sending again.

) : null}
    {application.emails.map((email) => (
  1. {email.template} to {email.to_email} · {email.status} · {email.created_at}
  2. ))}
{application.status === 'APPROVED' ? ( ) : null}
{application.pdfUrl ? (