import React from 'react'; import { View, Text } from 'react-native'; import Svg, { Path } from 'react-native-svg'; import type { TransactionDetails as TransactionDetailsType, ComponentSize } from '../types/algorand'; import { formatAddress, formatCurrency, formatRelativeTime } from '../utils/format'; import { CopyButton } from '../ui/CopyButton'; import { SizeContainer } from '../ui/SizeContainer'; import { StatusBadge } from '../ui/StatusBadge'; function ArrowRightIcon({ size = 16, color = '#71717a' }: { size?: number; color?: string }) { return ( ); } function DollarIcon({ size = 16, color = '#a1a1aa' }: { size?: number; color?: string }) { return ( ); } function ZapIcon({ size = 16, color = '#a1a1aa' }: { size?: number; color?: string }) { return ( ); } function CheckCircleIcon({ size = 12, color = '#34d399' }: { size?: number; color?: string }) { return ( ); } function ClockIcon({ size = 12, color = '#facc15' }: { size?: number; color?: string }) { return ( ); } const TYPE_LABELS: Record = { payment: 'Payment', 'asset-transfer': 'Asset Transfer', 'application-call': 'App Call', 'asset-config': 'Asset Config', 'key-registration': 'Key Registration', 'asset-freeze': 'Asset Freeze', }; const CONTEXT_LABELS: Record = { 'nft-purchase': 'NFT Purchase', 'auction-won': 'Auction Won', 'raffle-entry': 'Raffle Entry', 'trade-offer': 'Trade Offer', vote: 'Vote Cast', }; interface TransactionDetailsProps { data: TransactionDetailsType; showContext?: boolean; showFee?: boolean; compact?: boolean; size?: ComponentSize; className?: string; } export function TransactionDetailsComponent({ data: transaction, showContext = true, showFee = true, compact = false, size = 'full', className, }: TransactionDetailsProps) { const typeLabel = TYPE_LABELS[transaction.type] || 'Transaction'; const contextLabel = transaction.context ? CONTEXT_LABELS[transaction.context.type] || 'Event' : null; function getTypeIcon() { switch (transaction.type) { case 'payment': return ; case 'application-call': return ; default: return ; } } if (compact) { return ( {transaction.confirmed ? ( ) : ( )} {formatAddress(transaction.id)} ); } const isFullscreen = size === 'fullscreen'; return ( {/* Header */} {getTypeIcon()} {typeLabel} ) : ( ) } /> {contextLabel && ( )} Transaction Details {formatAddress(transaction.id)} {/* Transaction Flow */} From {formatAddress(transaction.from)} To {transaction.to ? formatAddress(transaction.to) : 'N/A'} {/* Amount */} {transaction.amount !== undefined && ( {transaction.asset ? formatCurrency(transaction.amount, transaction.asset.unitName) : formatCurrency(transaction.amount / 1_000_000, 'ALGO')} {transaction.asset ? `${transaction.asset.name || transaction.asset.unitName} Transfer` : 'ALGO Payment'} )} {/* Context */} {showContext && transaction.context && ( {contextLabel} {transaction.context.metadata && Object.entries(transaction.context.metadata).map(([key, value]) => ( {key.replace('_', ' ')} {typeof value === 'number' ? formatCurrency(value) : String(value)} ))} )} {/* Details Grid */} #{transaction.round.toLocaleString()} Round {showFee && ( {formatCurrency(transaction.fee / 1_000_000, 'ALGO')} Fee )} {formatRelativeTime(transaction.timestamp)} Time {/* Note */} {transaction.note && ( Note {transaction.note} )} ); }