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