import React, { useCallback, useState } from 'react'; import { View, Text } from 'react-native'; import type { TradeOffer, ASA, AlgorandAccount } from '../types/algorand'; import { formatAddress, formatRelativeTime } from '../utils/format'; import { SearchSheet } from '../ui/SearchSheet'; function isASA(item: ASA | AlgorandAccount): item is ASA { return 'unitName' in item; } function summarizeAssets(assets: (ASA | AlgorandAccount)[]): string { const asas = assets.filter(isASA); const accounts = assets.filter((a) => !isASA(a)); const parts: string[] = []; if (asas.length > 0) parts.push(`${asas.length} asset${asas.length > 1 ? 's' : ''}`); if (accounts.length > 0) parts.push(`${accounts.length} account${accounts.length > 1 ? 's' : ''}`); return parts.join(', ') || 'Empty'; } interface TradeSearchProps { data: TradeOffer[]; onSelect?: (offer: TradeOffer) => void; placeholder?: string; className?: string; } export function TradeSearch({ data, onSelect, placeholder = 'Search trade offers...', className, }: TradeSearchProps) { const [selected, setSelected] = useState(null); const handleSelect = useCallback( (offer: TradeOffer) => { setSelected(offer); onSelect?.(offer); }, [onSelect], ); const renderItem = useCallback( (offer: TradeOffer) => { const statusColor = offer.status === 'pending' ? 'text-blue-400' : offer.status === 'accepted' ? 'text-green-400' : offer.status === 'rejected' ? 'text-red-400' : 'text-zinc-400'; const statusBg = offer.status === 'pending' ? 'bg-blue-500/20' : offer.status === 'accepted' ? 'bg-green-500/20' : offer.status === 'rejected' ? 'bg-red-500/20' : 'bg-zinc-700'; return ( TR {summarizeAssets(offer.offering)} for {summarizeAssets(offer.requesting)} From {formatAddress(offer.creator)} - {formatRelativeTime(offer.createdAt)} {offer.status.charAt(0).toUpperCase() + offer.status.slice(1)} ); }, [], ); return ( {selected && ( Selected Trade {renderItem(selected)} )} ); }