import Link from 'next/link'; import type { CoffeeItem } from '../hooks/getActiveCoffees'; type Props = { coffees: CoffeeItem[]; loading: boolean; error: string | null; selections: Record; bump: Record; selectedPlanCapsules: number; totalCapsules: number; onToggleCoffee: (id: string) => void; onChangeQuantity: (id: string, delta: number) => void; title: string; }; export default function CoffeeSelectionGrid({ coffees, loading, error, selections, bump, selectedPlanCapsules, totalCapsules, onToggleCoffee, onChangeQuantity, title, }: Props) { return (

{title}

{error && (
{error}
)} {loading ? (
) : (
{coffees.map((coffee) => { const active = coffee.id in selections; const qty = selections[coffee.id] || 0; const remainingCapsules = selectedPlanCapsules - totalCapsules; const maxForCoffee = active ? Math.min(120, qty + remainingCapsules) : 0; const sliderMax = Math.max(10, maxForCoffee); const sliderProgress = sliderMax <= 10 ? 100 : Math.min(100, Math.max(0, ((qty - 10) / (sliderMax - 10)) * 100)); const canAddCoffee = active || remainingCapsules >= 10; return (
{coffee.image ? ( {coffee.name} ) : (
)}
Details
EUR {coffee.pricePer10} per 10

{coffee.name}

{coffee.description}

View
{active && (
Quantity (10-{maxForCoffee} pcs) {qty} pcs
onChangeQuantity(coffee.id, parseInt(e.target.value, 10) - qty)} className="w-full appearance-none cursor-pointer bg-transparent" style={{ background: 'linear-gradient(to right,#0f172a 0%,#0f172a ' + sliderProgress + '%,#e2e8f0 ' + sliderProgress + '%,#e2e8f0 100%)', height: '6px', borderRadius: '999px', }} />
Subtotal EUR {((qty / 10) * coffee.pricePer10).toFixed(2)}
)}
); })}
)}
); }