// disbursement/history-transaction/blocks/DetailTransaction.tsx import { KeenIcon } from '@/components'; import { useTransactionContext } from '../hooks/useTransactionContext'; import { useCallApi } from '@/hooks'; import { apiConfig } from '@/config/api.config'; import { useEffect, useState } from 'react'; import moment from 'moment'; import { getAuth } from '@/auth'; import { toast } from 'sonner'; import { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; const API_URL = apiConfig.service_disbursement; type StatusCode = 'W' | 'O' | 'F' | 'D'; interface StatusInfo { label: string; bg: string; text: string; } const statusMap: Record = { W: { label: 'Waiting Schedule', bg: 'bg-yellow-100', text: 'text-yellow-600' }, O: { label: 'On Process', bg: 'bg-blue-100', text: 'text-blue-600' }, F: { label: 'Fail', bg: 'bg-red-100', text: 'text-red-600' }, D: { label: 'Done', bg: 'bg-green-100', text: 'text-green-600' } }; export const renderStatusBadge = (statusRaw: string | null | undefined) => { const status = statusRaw as StatusCode; const { label, bg, text } = statusMap[status] ?? { label: 'Unknown', bg: 'bg-gray-100', text: 'text-gray-600' }; return ( {label} ); }; const DetailTransaction = () => { const { GetData } = useCallApi(); const { showDetailDialog, setShowDetailDialog, selectedTransactionId, setShowDetailLogDialog, setDetailLogData } = useTransactionContext(); const [transactionDetails, setTransactionDetails] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isExporting, setIsExporting] = useState(false); useEffect(() => { const fetchTransactionDetails = async () => { setIsLoading(true); if (selectedTransactionId) { try { const response = await GetData( `${API_URL}/transaction/history/${selectedTransactionId}`, { id: selectedTransactionId } ); setTransactionDetails(response?.data); } catch (error) { console.error('Error fetching transaction', error); } finally { setIsLoading(false); } } }; if (showDetailDialog && selectedTransactionId) { fetchTransactionDetails(); } }, [showDetailDialog, selectedTransactionId, GetData]); const resetForm = () => { setTransactionDetails(null); }; useEffect(() => { if (!showDetailDialog) { resetForm(); } }, [showDetailDialog]); const handleExport = async () => { if (!selectedTransactionId || !transactionDetails) return; setIsExporting(true); try { const response = await fetch( `${API_URL}/transaction/export?id_disbursment=${selectedTransactionId}`, { method: 'GET', headers: { Authorization: `Bearer ${getAuth()?.access_token}` } } ); if (!response.ok) { throw new Error('Failed to fetch file'); } const blob = await response.blob(); const contentDisposition = response.headers.get('content-disposition'); const executionDate = transactionDetails.execution_date; const formattedDate = executionDate ? moment(executionDate).format('YYYYMMDD_HHmm') : moment().format('YYYYMMDD_HHmm'); let filename = `transaction_${formattedDate}.xlsx`; if (contentDisposition) { const filenameMatch = contentDisposition.match(/filename\*?=(?:UTF-8'')?"?([^;"\n]*)"?/); if (filenameMatch && filenameMatch[1]) { filename = decodeURIComponent(filenameMatch[1]); } } const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); window.URL.revokeObjectURL(url); toast.success('Export successful'); } catch (error) { console.error('Error exporting transaction:', error); toast.error('Failed to export transaction'); } finally { setIsExporting(false); } }; return ( Transaction Details
{/* Summary Info */} {transactionDetails && (

Filename Upload

{transactionDetails.file_name ?? '-'}

Total Amount

{transactionDetails.amount ?? '-'}

Total Record

{transactionDetails.total_record ?? '-'}

Success Record

{transactionDetails.total_success ?? '-'}

Fail Record

{transactionDetails.total_fail ?? '-'}

Pending Record

{transactionDetails.total_pending ?? '-'}

Status

{renderStatusBadge(transactionDetails.status)}

Execution Date

{transactionDetails.execution_date ? moment(transactionDetails.execution_date).format('DD/MM/YYYY HH:mm') : '-'}

Done Date

{transactionDetails.done_date ? moment(transactionDetails.done_date).format('DD/MM/YYYY HH:mm') : '-'}

)}
{isLoading ? (

Loading Logs Details...

) : ( <>
{transactionDetails?.log && transactionDetails.log.length > 0 ? ( transactionDetails.log.map((log: any, index: number) => ( )) ) : ( )}
Username Fullname Amount Status Process Date Invoice Number Remark 1 Remark 2 Remark 3 Actions
{log.customer?.username ?? 'Not Found'} {log.customer?.fullname ?? 'Not Found'} {log.amount ?? '-'} {renderStatusBadge(log.status) ?? '-'} {log.request_date && moment(log.request_date).isValid() ? moment(log.request_date).format('DD/MM/YYYY HH:mm') : '-'} {log.reference ?? '-'} {log.remark_1 ?? '-'} {log.remark_2 ?? '-'} {log.remark_3 ?? '-'}
No logs available
)}
); }; export default DetailTransaction;