import { useTransactionContext } from '../hooks/useApprovalTransactionContext'; import { useCallApi } from '@/hooks'; import { apiConfig } from '@/config/api.config'; import { useEffect, useState } from 'react'; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; const API_URL = apiConfig.transaction; const DetailApprovalTransaction = () => { const { GetData } = useCallApi(); const { showDetailDialog, setShowDetailDialog, selectedTransactionId } = useTransactionContext(); const [transactionDetails, setTransactionDetails] = useState(null); useEffect(() => { const fetchTransactionDetails = async () => { if (selectedTransactionId) { try { const response = await GetData(`${API_URL}/transaction/history/detail/${selectedTransactionId}`, { id: selectedTransactionId }); setTransactionDetails(response?.data); } catch (error) { console.error('Error fetching transaction', error); } } }; if (showDetailDialog && selectedTransactionId) { fetchTransactionDetails(); } }, [showDetailDialog, selectedTransactionId, GetData]); const [activeTab, setActiveTab] = useState('detail'); // 'detail', 'log', 'approve' return ( Transaction Details {/* Tabs Navigation */}
{/* Tab Content */}
{activeTab === 'detail' && transactionDetails?.kind === 'P' && (

Transaction Information Info

Transaction Date

{transactionDetails?.transaction_date}

Full Name

{transactionDetails?.origin_customer?.fullname ?? "-"}

Amount

{new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(transactionDetails?.purchase?.amount) ?? new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(transactionDetails?.transfer.amount)}

Fee

{transactionDetails?.kind === 'P' ? transactionDetails?.purchase.fee_amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' }) : transactionDetails?.transfer.fee_amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })}

Status

{(() => { let status; let badgeClass; if (transactionDetails?.status === 'C') { status = 'COMPLETE'; badgeClass = 'bg-green-100 text-green-800'; } else if (transactionDetails?.status === 'F') { status = 'FAILED'; badgeClass = 'bg-red-100 text-red-800'; } else if (transactionDetails?.status === 'O') { status = 'ON PROCESS'; badgeClass = 'bg-blue-100 text-blue-800'; } else { status = 'PENDING'; badgeClass = 'bg-gray-100 text-gray-800'; } return ( {status} ); })()}

Transaction Type

{(() => { let kind; if (transactionDetails?.kind === 'T') { kind = 'TRANSFER'; } else if (transactionDetails?.kind === 'P') { kind = 'PURCHASE'; } else if (transactionDetails?.kind === 'W') { kind = 'WITHDRAW'; } else if (transactionDetails?.kind === 'U') { kind = 'TOP UP'; } else if (transactionDetails?.kind === 'R') { kind = 'RETURN'; } return kind; })()}

Description

{transactionDetails?.description}

Name

{transactionDetails?.type?.name || '-'}

Origin Wallet Wallet

Purchase Purchase

Amount

{new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(transactionDetails?.purchase.amount)}

Cashback

{new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(transactionDetails?.purchase.cashback)}

Cashback Point

{transactionDetails?.purchase.cashback_point}

Fee Amount

{new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(transactionDetails?.purchase.fee_amount)}

)} {activeTab === 'detail' && transactionDetails?.kind === 'P' && (

Product Information Product Info

Product Name

{transactionDetails?.purchase.product.name}

Price Cash

{new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(transactionDetails?.purchase.product.price_cash)}

Price Point

{transactionDetails?.purchase.product.price_point}

Product Type

{transactionDetails?.purchase.product.type}

Provider Name

{transactionDetails?.purchase.product.provider.description}

Provider Type

{(() => { let providertype; if (transactionDetails?.purchase.product.provider.type === 'h2h') { providertype = 'HOST TO HOST'; } else if (transactionDetails?.purchase.product.provider.type === 'agent') { providertype = 'AGENT'; } return providertype; })()}

)} {activeTab === 'detail' && transactionDetails?.kind != 'P' && transactionDetails?.transfer != null && (

Transaction Information Info

Transaction Date

{transactionDetails?.transaction_date}

Full Name

{transactionDetails?.origin_customer?.fullname ?? "-"}

Amount

{new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(transactionDetails?.transfer.amount)}

Fee

{transactionDetails?.transfer.fee_amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })}

Status

{(() => { let status; if (transactionDetails?.status === 'C') { status = 'COMPLETE'; } else if (transactionDetails?.status === 'F') { status = 'FAILED'; } else if (transactionDetails?.status === 'O') { status = 'ON PROCESS'; } else { status = 'PENDING'; } return status; })()}

Transaction Type

{(() => { let kind; if (transactionDetails?.kind === 'T') { kind = 'TRANSFER'; } else if (transactionDetails?.kind === 'P') { kind = 'PURCHASE'; } else if (transactionDetails?.kind === 'W') { kind = 'WITHDRAW'; } else if (transactionDetails?.kind === 'U') { kind = 'TOP UP'; } else if (transactionDetails?.kind === 'R') { kind = 'RETURN'; } return kind; })()}

Description

{transactionDetails?.description}

Name

{transactionDetails?.type?.name || '-'}

Reference

{transactionDetails?.transfer.reference}

Destination Iban

{transactionDetails?.transfer.destination_iban}

)} {activeTab === 'origincustomer' && (

Origin Customer

Full Name

{transactionDetails?.origin_customer?.fullname ?? "-"}

Phone Number

{transactionDetails?.origin_customer?.msisdn ?? "-"}

Email

{transactionDetails?.origin_customer?.email ?? "-"}

Username

{transactionDetails?.origin_customer?.username ?? "-"}

)} {activeTab === 'destinationcustomer' && (

Destination Customer

{transactionDetails?.transfer?.destination_customer ? (

Name

{transactionDetails.transfer.destination_customer.fullname ?? "-"}

MSISDN

{transactionDetails.transfer.destination_customer.msisdn ?? "-"}

Email

{transactionDetails.transfer.destination_customer.email ?? "-"}

Username

{transactionDetails.transfer.destination_customer.username ?? "-"}

) : (

No data available

)}
)} {activeTab === 'originwallet' && (

Origin Wallet

Name

{transactionDetails?.origin_wallet.name}

Description

{transactionDetails?.origin_wallet.description}

)} {activeTab === 'destinationwallet' && (

Destination Wallet

{!transactionDetails?.transfer ? (
No Data available
) : (

Name

{transactionDetails.transfer.destination_wallet.name}

Description

{transactionDetails.transfer.destination_wallet.description}

)}
)} {activeTab === 'log' && (

Transaction Logs

{transactionDetails?.log && transactionDetails?.log.length > 0 ? ( transactionDetails.log.map((log: { request_endpoint: string, status: string; request_date: string; response_date: string; request_body: string; response_body: string; response_code: number }, index: number) => ( )) ) : ( )}
Status Request Date Request Body Response Body Response Code Request End Point
{(() => { let status; if (log.status === 'P') { status = 'PENDING'; } else if (log.status === 'O') { status = 'ON PROCESS'; } else if (log.status === 'F') { status = 'FAILED'; } else if (log.status === 'C') { status = 'COMPLETE'; } return status; })()} {log.request_date ?? '-'} {log.response_date ?? '-'} {log.request_body ?? '-'} {log.response_body ?? '-'} {log.request_endpoint ?? '-'}
No logs available
)} {activeTab === 'approve' && (

Approval Logs

{transactionDetails?.log_approve.length === 0 ? (

No data available

) : (
{/* */} {transactionDetails?.log_approve && transactionDetails?.log_approve.length > 0 ? ( transactionDetails.log_approve.map((log: { created_at: string; status: string; updated_at: string }, index: number) => ( {/* */} )) ) : ( )}
Status DateUpdated At
{(() => { let status; if (log.status === 'W') { status = 'WAITING'; } else if (log.status === 'Y') { status = 'APPROVE'; } else if (log.status === 'N') { status = 'REJECT'; } else if (log.status === 'T') { status = 'NO NEED'; } return status; })()} {new Date(log.created_at).toLocaleString('sv-SE', { timeZone: 'Asia/Jakarta', // kalau kamu mau waktu lokal (optional) year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false, }).replace(' ', ' ')} {log.updated_at}
No logs available
)}
)} {activeTab === 'p24' && (

P24 Logs

{transactionDetails?.p24.length === 0 ? (

No data available

) : (
{transactionDetails?.p24 && transactionDetails?.p24.length > 0 ? ( transactionDetails.p24.map((log: { request_endpoint: string, type: string; request_date: string; response_date: string; request_body: string; response_body: string; response_code: number }, index: number) => ( )) ) : ( )}
Type Request Date Request Body Response Body Response Code Request Endpoint
{log.type} {log.request_date} {log.response_date} {log.request_body} {log.response_body} {log.request_endpoint ?? '-'}
No logs available
)}
)}
); }; export default DetailApprovalTransaction;