'use client'; import React, { useState, useMemo } from 'react'; import PageLayout from '../components/PageLayout'; import { useRouter } from 'next/navigation'; import { useActiveCoffees } from './hooks/getActiveCoffees'; export default function CoffeeAbonnementPage() { const [selections, setSelections] = useState>({}); const [bump, setBump] = useState>({}); const [selectedPlanCapsules, setSelectedPlanCapsules] = useState<60 | 120>(120); const router = useRouter(); // Fetch active coffees from the backend const { coffees, loading, error } = useActiveCoffees(); const selectedEntries = useMemo( () => Object.entries(selections).map(([id, qty]) => { const coffee = coffees.find((c) => c.id === id); if (!coffee) return null; return { coffee, quantity: qty }; }).filter(Boolean) as { coffee: ReturnType['coffees'][number]; quantity: number }[], [selections, coffees] ); const totalPrice = useMemo( () => selectedEntries.reduce( (sum, entry) => sum + (entry.quantity / 10) * entry.coffee.pricePer10, 0 ), [selectedEntries] ); // NEW: enforce selected plan size (60 or 120 capsules) const totalCapsules = useMemo( () => selectedEntries.reduce((sum, entry) => sum + entry.quantity, 0), [selectedEntries] ); const packsSelected = totalCapsules / 10; const requiredPacks = selectedPlanCapsules / 10; const canProceed = packsSelected === requiredPacks; const proceedToSummary = () => { if (!canProceed) return; try { sessionStorage.setItem('coffeeSelections', JSON.stringify(selections)); sessionStorage.setItem('coffeeAboSizeCapsules', String(selectedPlanCapsules)); } catch {} router.push('/coffee-abonnements/summary'); }; const toggleCoffee = (id: string) => { setSelections((prev) => { const copy = { ...prev }; if (id in copy) { delete copy[id]; } else { const total = Object.values(copy).reduce((sum, qty) => sum + qty, 0); if (total + 10 > selectedPlanCapsules) return prev; copy[id] = 10; } return copy; }); }; const changeQuantity = (id: string, delta: number) => { setSelections((prev) => { if (!(id in prev)) return prev; const otherTotal = Object.entries(prev).reduce((sum, [key, qty]) => key === id ? sum : sum + qty, 0); const maxForCoffee = Math.min(120, selectedPlanCapsules - otherTotal); const next = prev[id] + delta; if (next < 10 || next > maxForCoffee) return prev; const updated = { ...prev, [id]: next }; setBump((b) => ({ ...b, [id]: true })); setTimeout(() => setBump((b) => ({ ...b, [id]: false })), 250); return updated; }); }; return (

Configure Coffee Subscription

{/* Stepper */}
1 Selection
2 Summary
{/* Section 1: Multi coffee selection + per-coffee quantity */}

1. Select subscription size

2. Choose coffees & quantities

{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} ) : (
)} {/* price badge (per 10) */}
€{coffee.pricePer10} per 10 pcs

{coffee.name}

{coffee.description}

{active && (
Quantity (10–120) {qty} pcs
changeQuantity(coffee.id, parseInt(e.target.value, 10) - qty) } className="w-full appearance-none cursor-pointer bg-transparent" style={{ background: 'linear-gradient(to right,#1C2B4A 0%,#1C2B4A ' + sliderProgress + '%,#e5e7eb ' + sliderProgress + '%,#e5e7eb 100%)', height: '6px', borderRadius: '999px', }} />
Subtotal €{((qty / 10) * coffee.pricePer10).toFixed(2)}
)}
); })}
)}
{/* Section 2: Compact preview + next steps */}

3. Preview

{selectedEntries.length === 0 && (

No coffees selected yet.

)} {selectedEntries.map((entry) => (
{entry.coffee.name} {entry.quantity} Stk •{' '} €{entry.coffee.pricePer10}/10
€{((entry.quantity / 10) * entry.coffee.pricePer10).toFixed(2)}
))}
Total (net) €{totalPrice.toFixed(2)}
{/* Packs/capsules summary and validation hint (refined design) */}
Selected: {totalCapsules} capsules ({packsSelected} packs of 10). Target: {selectedPlanCapsules} capsules ({requiredPacks} packs). {packsSelected !== requiredPacks && ( Please select exactly {selectedPlanCapsules} capsules ({requiredPacks} packs). {packsSelected < requiredPacks ? ` ${requiredPacks - packsSelected} packs missing.` : ` ${packsSelected - requiredPacks} packs too many.`} )}
{!canProceed && (

You can continue once exactly {selectedPlanCapsules} capsules ({requiredPacks} packs) are selected.

)}
); }