/* Orlina — main app shell, manages cart + checkout state */ const { useState, useEffect, useMemo } = React; function App() { const [cartOpen, setCartOpen] = useState(false); const [checkoutOpen, setCheckoutOpen] = useState(false); const [confirmation, setConfirmation] = useState(null); const [items, setItems] = useState([]); const [promoCode, setPromoCode] = useState(''); const [promoApplied, setPromoApplied] = useState(false); const [toast, setToast] = useState(null); // PDP state const [pdpPack, setPdpPack] = useState('three'); const [pdpQty, setPdpQty] = useState(1); // sticky buy visibility const [showSticky, setShowSticky] = useState(false); useEffect(() => { const onScroll = () => { const pdpEl = document.querySelector('.pdp'); if (!pdpEl) return; const rect = pdpEl.getBoundingClientRect(); // show when PDP scrolls off-screen setShowSticky(rect.bottom < 0 || rect.top > window.innerHeight); }; window.addEventListener('scroll', onScroll, { passive: true }); onScroll(); return () => window.removeEventListener('scroll', onScroll); }, []); const addToCart = (packId, qty) => { const pack = PACKS.find(p => p.id === packId); setItems(prev => { const existing = prev.find(it => it.packId === packId); if (existing) { return prev.map(it => it.packId === packId ? { ...it, qty: it.qty + qty } : it); } return [...prev, { packId, name: pack.name, price: pack.price, qty }]; }); setToast(`Added ${pack.name} × ${qty}`); setTimeout(() => setToast(null), 2200); setCartOpen(true); }; const updateQty = (packId, newQty) => { if (newQty <= 0) return removeItem(packId); setItems(prev => prev.map(it => it.packId === packId ? { ...it, qty: newQty } : it)); }; const removeItem = (packId) => setItems(prev => prev.filter(it => it.packId !== packId)); const subtotal = useMemo(() => items.reduce((s, it) => s + it.price * it.qty, 0), [items]); const discount = promoApplied ? Math.round(subtotal * 0.10) : 0; const freeShip = subtotal >= 1500; const shipping = freeShip ? 0 : (items.length > 0 ? 49 : 0); const total = Math.max(0, subtotal - discount + shipping); const applyPromo = () => { if (promoCode.trim().toUpperCase() === 'ORLINA10') { setPromoApplied(true); } else if (promoCode.trim()) { setToast('Invalid promo code'); setTimeout(() => setToast(null), 2000); } }; const handleCheckout = () => { setCartOpen(false); setTimeout(() => setCheckoutOpen(true), 200); }; const handlePlaceOrder = (order) => { setCheckoutOpen(false); setConfirmation(order); setItems([]); setPromoApplied(false); setPromoCode(''); }; return ( <>