/* 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 (
<>