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}
)}
);
}