saveinmed/marketplace/src/components/GroupedProductCard.tsx
Tiago Yamamoto e7b02f24e7 fix(marketplace): fix modal z-index and button colors
- Change modal z-index from z-50 to z-[1000] to appear above Leaflet map
- Replace bg-primary with bg-blue-600 for visible button styling
- Fix 'Adicionar' button in ProductOffersModal
- Fix 'Ver ofertas' button in GroupedProductCard
2025-12-23 16:23:59 -03:00

67 lines
3.6 KiB
TypeScript

import { GroupedProduct, ProductWithDistance } from '../types/product'
import { formatCents } from '../utils/format'
interface GroupedProductCardProps {
group: GroupedProduct
onClick: () => void
}
export const GroupedProductCard = ({ group, onClick }: GroupedProductCardProps) => {
const nearestOffer = group.offers.reduce((a, b) => a.distance_km < b.distance_km ? a : b)
const soonestExpiry = group.offers.reduce((a, b) =>
new Date(a.expires_at).getTime() < new Date(b.expires_at).getTime() ? a : b
)
const isExpiringSoon = new Date(soonestExpiry.expires_at).getTime() - Date.now() < 30 * 24 * 60 * 60 * 1000
return (
<div
className="bg-white rounded-lg shadow-md p-4 hover:shadow-xl transition-all cursor-pointer border border-gray-100 hover:border-blue-300"
onClick={onClick}
>
<div className="flex justify-between items-start mb-2">
<div>
<h3 className="text-lg font-semibold text-gray-800">{group.name}</h3>
<p className="text-sm text-gray-500">{group.description}</p>
</div>
<div className="flex flex-col items-end gap-1">
{isExpiringSoon && (
<span className="bg-amber-100 text-amber-800 text-xs px-2 py-1 rounded-full font-medium">
Vence em breve
</span>
)}
<span className="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded-full font-medium">
{group.offerCount} {group.offerCount === 1 ? 'oferta' : 'ofertas'}
</span>
</div>
</div>
<div className="mt-4 space-y-2">
<div className="flex items-center text-sm text-blue-600">
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 mr-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
<span>Mais próximo: {nearestOffer.distance_km} km</span>
</div>
<div className="flex justify-between items-end mt-4">
<div>
<p className="text-xs text-gray-500">A partir de</p>
<div className="text-2xl font-bold text-green-600">
{formatCents(group.minPriceCents)}
</div>
</div>
<button
className="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg text-sm font-medium transition-colors flex items-center gap-2"
>
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
</svg>
Ver ofertas
</button>
</div>
</div>
</div>
)
}