'use client'; import '../style.scss'; import { useEffect, useRef, useState } from 'react'; import { useSearchParams } from 'next/navigation'; import { fetchApi, getDateTime } from '@/lib/utils/client'; import { DanalConfirmRequest } from '@/types/request/payment/charge'; import { DanalConfirmResponse } from '@/types/response/payment/charge'; const METHOD_LABELS: Record = { CARD: '신용카드', KAKAOPAY: '카카오페이', NAVERPAY: '네이버페이', TRANSFER: '계좌이체', MOBILE: '휴대폰', VIRTUAL_ACCOUNT: '가상계좌' }; export default function ChargeSuccessPage() { const searchParams = useSearchParams(); const [status, setStatus] = useState<'loading'|'success'|'error'>('loading'); const [message, setMessage] = useState('결제 승인 처리 중...'); const [pointAmount, setPointAmount] = useState(0); const [paidAt, setPaidAt] = useState(null); const calledRef = useRef(false); useEffect(() => { if (calledRef.current) { return; } calledRef.current = true; confirmPayment(); }, []); const confirmPayment = async () => { const orderID = searchParams.get('orderId'); const transactionID = searchParams.get('transactionId'); const method = searchParams.get('method'); if (!orderID || !transactionID || !method) { setStatus('error'); setMessage('결제 정보가 올바르지 않습니다.'); return; } try { const res = await fetchApi('/api/payment/confirm', { method: 'POST', body: { orderID, transactionID, method } as DanalConfirmRequest }); if (res.success && res.data) { setPointAmount(res.data.pointAmount); setPaidAt(res.data.paidAt); setStatus('success'); setMessage('포인트 충전 완료'); if (window.opener) { window.opener.postMessage({ type: 'CHARGE_COMPLETE' }, '*'); } } else { setStatus('error'); setMessage(res.message || '결제 승인에 실패했습니다.'); } } catch { setStatus('error'); setMessage('결제 승인 중 오류가 발생했습니다.'); } }; const method = searchParams.get('method') ?? ''; const methodLabel = METHOD_LABELS[method] ?? method; const handleClose = () => { if (window.opener) { window.close(); } else { window.location.href = '/'; } }; return (
{status === 'loading' &&
} {status === 'success' &&
} {status === 'error' &&
}

{message}

{status === 'success' && (
결제 금액 {pointAmount.toLocaleString()} 원
결제 수단 {methodLabel}
결제 일시 {getDateTime(paidAt)}
)} {status !== 'loading' && ( )}
); }