import { useState } from 'react'; import { Link } from 'react-router-dom'; import { Heart, MapPin } from 'lucide-react'; import { Badge } from '../ui/Badge'; import { api } from '../../api/client'; import { useAuth } from '../../context/AuthContext'; import type { Listing } from '../../types'; import { formatCurrency } from '../../utils/format'; interface ListingCardProps { listing: Listing; } export function ListingCard({ listing }: ListingCardProps) { const { isAuthenticated } = useAuth(); const [isFav, setIsFav] = useState(listing.isFavorited ?? false); const [toggling, setToggling] = useState(false); const conditionVariant = listing.condition === 'NEW' ? 'success' : listing.condition === 'LIKE_NEW' ? 'info' : 'default'; const categoryEmoji = listing.category === 'FURNITURE' ? '\uD83E\uDE91' : listing.category === 'ELECTRONICS' ? '\uD83C\uDFA7' : listing.category === 'CLOTHING' ? '\uD83D\uDC55' : listing.category === 'HOME_GARDEN' ? '\u2615' : listing.category === 'SPORTS' ? '\uD83D\uDEB4' : listing.category === 'BOOKS' ? '\uD83D\uDCDA' : listing.category === 'GAMES' ? '\uD83C\uDFAE' : '\uD83D\uDCE6'; const handleFavorite = async (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); if (!isAuthenticated || toggling) return; setToggling(true); try { const res = await api.post<{ isFavorited: boolean }>(`/listings/${listing.id}/favorite`); setIsFav(res.isFavorited); } catch {} setToggling(false); }; const hasImage = listing.images?.[0]?.url; return (
{/* Image */}
{hasImage ? ( {listing.title} ) : (
{categoryEmoji}
)} {isAuthenticated && ( )}
{/* Content */}

{listing.title}

{formatCurrency(listing.price)} {listing.obo && OBO}

{listing.condition.replace('_', ' ')} {listing.location}
); }