import React, { useState, useMemo } from 'react'; import { InvestigationCase, FinancialHop } from '../../types/forensics'; import { ReverseNetworkGraph } from '../ReverseNetworkGraph'; import { generateRelationalDatasets } from '../../services/relationalDataGenerator'; import { CreditCard, DollarSign, ArrowRight, AlertTriangle, ShieldAlert, Layers, RefreshCw, CheckCircle2, ExternalLink, GitFork } from 'lucide-react'; interface FinancialGraphTabProps { currentCase: InvestigationCase; onNavigateToWorkbook?: () => void; } export const FinancialGraphTab: React.FC = ({ currentCase, onNavigateToWorkbook, }) => { const ledger = currentCase.financialLedger; const [selectedHop, setSelectedHop] = useState( ledger.hops.length > 0 ? ledger.hops[0] : null ); const [graphMode, setGraphMode] = useState<'REVERSE_TOPOLOGY' | 'LINEAR_PIPELINE'>('REVERSE_TOPOLOGY'); // Generate Topological Graph const { graphNodes, graphEdges } = useMemo(() => { return generateRelationalDatasets([currentCase], currentCase); }, [currentCase]); const getHopTypeBadge = (type: string) => { switch (type) { case 'CRYPTO_MIXER': return CRYPTO MIXER; case 'SMURFING_DEPOSIT': return BSA SMURFING; case 'HAWALA_CORRIDOR': return HAWALA WIRE; case 'MERCHANT_CASH_OUT': return CASH-OUT ENDPOINT; default: return LAYERED NODE; } }; return (
{/* Top Banner: Financial Laundering & Structuring Summary */}

Terror Financing & Anti-Money Laundering (AML) Multi-Hop Graph

{ledger.detectedStructuring && ( BSA <$10K SMURFING DETECTED )} ${ledger.totalVolumeUsd.toLocaleString()} USD INTERCEPTED

{ledger.structuringSummary}

{ledger.sanctionsHits.length > 0 && (
OFAC / Watchlist Alert: Matching entities identified on global sanctions rosters: {ledger.sanctionsHits.join(', ')}
)}
{/* View Switcher: Reverse Network Graph vs Linear Pipeline */}
{onNavigateToWorkbook && ( )}
{/* Primary Graph View */} {graphMode === 'REVERSE_TOPOLOGY' ? ( { if (onNavigateToWorkbook) onNavigateToWorkbook(); }} /> ) : ( /* Linear Hop Flow Container */
TRANSACTION TOPOLOGY & ANONYMIZATION HOPS
Click a node or hop below to inspect payload
{ledger.hops.length === 0 ? (
No on-chain or fiat hops logged for this docket.
) : (
{ledger.hops.map((hop, index) => { const isSelected = selectedHop?.id === hop.id; return (
setSelectedHop(hop)} className={`p-3 rounded-lg border cursor-pointer transition-all min-w-[200px] flex-1 shrink-0 ${ isSelected ? 'bg-slate-800 border-cyan-500 shadow-md shadow-cyan-950/50' : 'bg-slate-900 border-slate-800 hover:border-slate-700' }`} >
HOP {index + 1} {getHopTypeBadge(hop.hopType)}
${hop.amountUsd.toLocaleString()} {hop.asset}
{hop.riskTag}
{hop.timestamp}
{index < ledger.hops.length - 1 && ( )}
); })}
{selectedHop && (
{selectedHop.id} DETAILS {getHopTypeBadge(selectedHop.hopType)}
${selectedHop.amountUsd.toLocaleString()} USD ({selectedHop.asset})
ORIGIN NODE / SOURCE {selectedHop.from}
DESTINATION NODE / TARGET {selectedHop.to}
AML RISK & SANCTIONS TAG:
{selectedHop.riskTag}
Recorded Timestamp: {selectedHop.timestamp} UTC • Sanctions Flag: {selectedHop.flaggedSanction ? 'STRICT COMPLIANCE ALERT' : 'Standard Monitoring'}
)}
)}
)} {/* Comprehensive Ledger Table */}
FULL FINANCIAL FORENSICS LEDGER ({ledger.hops.length} RECORDS)
{ledger.hops.map((hop) => ( ))}
Hop ID Timestamp Source Destination Amount & Asset Classification
{hop.id} {hop.timestamp} {hop.from} {hop.to} ${hop.amountUsd.toLocaleString()} ({hop.asset}) {getHopTypeBadge(hop.hopType)}
); };