// Composants partagés : Header, Footer, CartDrawer, PizzaCard, Toast const { useState, useEffect, useRef } = React; const BADGE_LABEL = { spicy: '🌶 Piquante', veg: 'Végé', nouveau: 'Nouveau', premium: 'Premium', }; function PizzaCard({ pizza, onAdd }) { const [added, setAdded] = useState(false); const [showSaucePicker, setShowSaucePicker] = useState(false); const [pickedSauces, setPickedSauces] = useState([]); const eligible = itemHasSauce(pizza); const toggleSauce = (sid) => { setPickedSauces(arr => arr.includes(sid) ? arr.filter(x => x !== sid) : [...arr, sid]); }; const handleAddDirect = () => { if (eligible) { setShowSaucePicker(true); setPickedSauces([]); return; } addToCart(pizza.id); setAdded(true); onAdd && onAdd(pizza); setTimeout(() => setAdded(false), 1400); }; const confirmSauces = () => { addToCart(pizza.id, { sauceIds: pickedSauces }); setShowSaucePicker(false); setPickedSauces([]); setAdded(true); onAdd && onAdd(pizza); setTimeout(() => setAdded(false), 1400); }; const sauceExtra = pickedSauces.reduce((s, sid) => { const sa = SAUCES.find(x => x.id === sid); return s + (sa ? sa.price : 0); }, 0); return (
{pizza.photo && ( {`${pizza.name} )} {pizza.badge && ( {BADGE_LABEL[pizza.badge] || pizza.badge} )}
{pizza.name}
{pizza.italianName}
{formatPrice(pizza.price)}
{!pizza.photo &&

{pizza.ingredients}

} {showSaucePicker ? (
Choisissez vos sauces (plusieurs possibles)
{SAUCES.map(s => { const on = pickedSauces.includes(s.id); return ( ); })}
) : ( )}
); } function Header({ activePage, onCartOpen }) { const [cart] = useCart(); const [navOpen, setNavOpen] = useState(false); const count = cartCount(cart); return (
Pizzeria ILYES
0675 55 80 95
); } function Footer() { return ( ); } function CartDrawer({ open, onClose }) { const [cart] = useCart(); const [serviceMode, setServiceMode] = useServiceMode(); const [editingSauceUid, setEditingSauceUid] = useState(null); const [checkoutOpen, setCheckoutOpen] = useState(false); const [confirmed, setConfirmed] = useState(false); const [orderInfo, setOrderInfo] = useState({ name: '', phone: '', district: '', table: '', notes: '' }); const [orderNumber, setOrderNumber] = useState(null); useEffect(() => { if (!open) return; const handler = (e) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', handler); return () => document.removeEventListener('keydown', handler); }, [open, onClose]); useEffect(() => { if (open) document.body.style.overflow = 'hidden'; else document.body.style.overflow = ''; return () => { document.body.style.overflow = ''; }; }, [open]); const subtotal = cartSubtotal(cart); const fee = serviceFee(serviceMode); const total = subtotal + fee; const toggleLineSauce = (uid, sauceId) => { const line = cart.find(l => l.uid === uid); if (!line) return; const current = lineSauces(line); const next = current.includes(sauceId) ? current.filter(x => x !== sauceId) : [...current, sauceId]; setLineSauces(uid, next); }; return ( <>
{checkoutOpen && (
!confirmed && setCheckoutOpen(false)}>
e.stopPropagation()}> {confirmed ? (

Grazie mille !

Votre commande est enregistrée

Numéro de commande : {orderNumber}
{serviceMode === 'livraison' && <>Livraison estimée : 30–40 min
Nous vous appelons en arrivant.} {serviceMode === 'emporter' && <>Prête à emporter dans 15–20 min
Présentez votre numéro au comptoir.} {serviceMode === 'sur-place' && <>Commande envoyée pour la table {orderInfo.table}.
Nos équipes vous l'apportent !}

) : ( <>

Récapitulatif de commande

Vos articles

    {cart.map(line => { const it = ITEMS.find(i => i.id === line.itemId); if (!it) return null; return (
  • {line.qty}× {it.name}{lineSauces(line).length > 0 ? ` — sauces : ${lineSauces(line).map(sid => (SAUCES.find(x => x.id === sid) || {}).label).filter(Boolean).join(', ')}` : ''} {formatPrice(lineUnitPrice(line) * line.qty)}
  • ); })}

Mode : {(SERVICE_MODES.find(m => m.id === serviceMode) || {}).label}

{serviceMode === 'sur-place' ? 'Votre table' : 'Vos coordonnées'}

{serviceMode === 'sur-place' ? ( <> setOrderInfo({...orderInfo, table: e.target.value})} /> setOrderInfo({...orderInfo, name: e.target.value})} /> ) : serviceMode === 'livraison' ? ( <> setOrderInfo({...orderInfo, name: e.target.value})} /> setOrderInfo({...orderInfo, phone: e.target.value})} /> setOrderInfo({...orderInfo, district: e.target.value})} /> ) : ( <> setOrderInfo({...orderInfo, name: e.target.value})} /> setOrderInfo({...orderInfo, phone: e.target.value})} /> )}