import React from 'react'; import { View, Text, Pressable } from 'react-native'; import { Image } from 'expo-image'; import Svg, { Path } from 'react-native-svg'; import type { AuctionListing as AuctionListingType, ComponentSize } from '../types/algorand'; import { formatCurrency, formatRelativeTime } from '../utils/format'; import { SizeContainer } from '../ui/SizeContainer'; import { StatusBadge } from '../ui/StatusBadge'; function GavelIcon({ size = 16, color = '#a1a1aa' }: { size?: number; color?: string }) { return ( ); } function TrophyIcon({ size = 16, color = '#eab308' }: { size?: number; color?: string }) { return ( ); } function TrendingUpIcon({ size = 12, color = '#60a5fa' }: { size?: number; color?: string }) { return ( ); } function CalendarIcon({ size = 16, color = '#71717a' }: { size?: number; color?: string }) { return ( ); } function TimerIcon({ size = 12, color = '#fb923c' }: { size?: number; color?: string }) { return ( ); } interface AuctionListingProps { data: AuctionListingType; showBidButton?: boolean; size?: ComponentSize; className?: string; imageUrl?: string; onBid?: (auction: AuctionListingType) => void; } export function AuctionListingComponent({ data: auction, showBidButton = true, size = 'full', className, imageUrl, onBid, }: AuctionListingProps) { const isActive = auction.status === 'active'; const isUpcoming = auction.status === 'upcoming'; const timeRemaining = new Date(auction.endTime).getTime() - new Date().getTime(); const isEndingSoon = timeRemaining < 24 * 60 * 60 * 1000 && timeRemaining > 0; const statusVariant = isActive ? 'success' : isUpcoming ? 'info' : 'neutral'; const isFullscreen = size === 'fullscreen'; return ( {/* Header */} {imageUrl && ( )} Auction Event {isActive && isEndingSoon && ( )} {auction.bidCount} bids {auction.title} {auction.description} {/* Auction Item */} Auction Item {auction.prizes.map((prize, index) => ( {prize.name} #{prize.id} ))} {/* Bid Stats */} {formatCurrency(auction.currentHighestBid, auction.bidAsset.unitName)} Current Bid {formatCurrency(auction.minimumNextBid, auction.bidAsset.unitName)} Min Next Bid {auction.bidCount} Total Bids {/* Bid Fee Pool */} {auction.bidFeePercentage && auction.currentBidFeePool > 0 && ( Bid Fee Pool ({auction.bidFeePercentage}%) {formatCurrency(auction.currentBidFeePool, auction.bidAsset.unitName)} collected )} {/* Timing */} {isUpcoming ? 'Starts' : isActive ? 'Ends' : 'Ended'}{' '} {formatRelativeTime(isUpcoming ? auction.startTime : auction.endTime)} {auction.timeExtended && ( Extended )} {/* Bid Button */} {showBidButton && (isActive || isUpcoming) && ( isActive && onBid?.(auction)} disabled={!isActive} className={`flex-row items-center justify-center gap-2 py-3 px-4 rounded-xl ${ !isActive ? 'bg-zinc-800/50' : 'bg-purple-600' }`} > {!isActive ? ( <> {isUpcoming ? 'Not Started' : 'Auction Ended'} ) : ( <> Place Bid )} )} ); }