import { useParams, useNavigate } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { withdrawalApi } from '../api/withdrawals'; import { AdminBackButton } from '../components/admin'; import { useCurrency } from '../hooks/useCurrency'; import { formatDate, getWithdrawalStatusBadge, getRiskColor, getRiskLevelColor, } from '../utils/withdrawalUtils'; // Type for parsed risk analysis interface RiskAnalysis { flags?: string[]; balance_stats?: Record; referral_deposits?: Record; suspicious_referrals?: Record; earnings_by_reason?: Record; [key: string]: unknown; } export default function AdminWithdrawalDetail() { const { t } = useTranslation(); const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { formatWithCurrency } = useCurrency(); // Fetch detail const { data: detail, isLoading, error, } = useQuery({ queryKey: ['admin-withdrawal-detail', id], queryFn: () => withdrawalApi.getDetail(Number(id)), enabled: !!id, }); // Mutations const approveMutation = useMutation({ mutationFn: () => withdrawalApi.approve(Number(id)), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-withdrawal-detail', id] }); queryClient.invalidateQueries({ queryKey: ['admin-withdrawals'] }); }, }); const completeMutation = useMutation({ mutationFn: () => withdrawalApi.complete(Number(id)), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-withdrawal-detail', id] }); queryClient.invalidateQueries({ queryKey: ['admin-withdrawals'] }); }, }); // Loading if (isLoading) { return (
); } // Error if (error || !detail) { return (

{t('admin.withdrawals.detail.title')}

{t('admin.withdrawals.detail.loadError')}

); } const badge = getWithdrawalStatusBadge(detail.status); const riskColor = getRiskColor(detail.risk_score); // Parse risk analysis const riskAnalysis = (detail.risk_analysis || {}) as RiskAnalysis; const flags = riskAnalysis.flags || []; const riskLevelKey = detail.risk_level; const riskLevelBadge = getRiskLevelColor(riskLevelKey); return (
{/* Header */}

{t('admin.withdrawals.detail.title')} #{detail.id}

{t(badge.labelKey)} {formatWithCurrency(detail.amount_kopeks / 100, 0)}
{/* User Info Section */}

{t('admin.withdrawals.detail.userInfo')}

{t('admin.withdrawals.detail.requestedAmount')}
{formatWithCurrency(detail.amount_kopeks / 100, 0)}
{t('admin.withdrawals.detail.username')}
{detail.username ? `@${detail.username}` : detail.first_name || '-'}
{t('admin.withdrawals.detail.telegramId')}
{detail.telegram_id ?? '-'}
{t('admin.withdrawals.detail.balance')}
{formatWithCurrency(detail.balance_kopeks / 100)}
{t('admin.withdrawals.detail.totalReferrals')}
{detail.total_referrals}
{t('admin.withdrawals.detail.totalEarnings')}
{formatWithCurrency(detail.total_earnings_kopeks / 100)}
{t('admin.withdrawals.detail.createdAt')}
{formatDate(detail.created_at)}
{/* Payment Details Section */}

{t('admin.withdrawals.detail.paymentDetails')}

{detail.payment_details || t('admin.withdrawals.detail.noPaymentDetails')}

{/* Risk Analysis Section */}

{t('admin.withdrawals.detail.riskAnalysis')}

{/* Risk Score Bar */}
{t('admin.withdrawals.detail.riskScore')} {detail.risk_score}
{t(`admin.withdrawals.detail.riskLevel.${riskLevelKey}`)}
{/* Flags */} {flags.length > 0 && (
{t('admin.withdrawals.detail.flags')}
{flags.map((flag, index) => (
{flag}
))}
)} {/* Detailed Breakdown */}
{riskAnalysis.balance_stats && (
{t('admin.withdrawals.detail.balanceStats')}
{Object.entries(riskAnalysis.balance_stats).map(([key, value]) => (
{key} {String(value)}
))}
)} {riskAnalysis.referral_deposits && (
{t('admin.withdrawals.detail.referralDeposits')}
{Object.entries(riskAnalysis.referral_deposits).map(([key, value]) => (
{key} {String(value)}
))}
)} {riskAnalysis.suspicious_referrals && (
{t('admin.withdrawals.detail.suspiciousReferrals')}
{Object.entries(riskAnalysis.suspicious_referrals).map(([key, value]) => (
{key} {String(value)}
))}
)} {riskAnalysis.earnings_by_reason && (
{t('admin.withdrawals.detail.earningsByReason')}
{Object.entries(riskAnalysis.earnings_by_reason).map(([key, value]) => (
{key} {String(value)}
))}
)}
{/* Admin Comment Section */} {detail.admin_comment && (

{t('admin.withdrawals.detail.adminComment')}

{detail.admin_comment}

)} {/* Processed At */} {detail.processed_at && (
{t('admin.withdrawals.detail.processedAt')} {formatDate(detail.processed_at)}
)} {/* Action Buttons */} {detail.status === 'pending' && (
)} {detail.status === 'approved' && (
)}
); }