/* ============================================================
App root — routing + global state
============================================================ */
function App() {
const [authed, setAuthed] = useState(false);
const [route, setRoute] = useState({ name: 'home', params: {} });
const [cart, setCart] = useState([]);
const [user, setUser] = useState(CURRENT_USER);
const [lastOrder, setLastOrder] = useState(null);
const navigate = (name, params = {}) => {
setRoute({ name, params });
window.scrollTo({ top: 0, behavior: 'instant' });
};
const login = () => { setAuthed(true); navigate('home'); };
const logout = () => { setAuthed(false); setCart([]); setRoute({ name: 'home', params: {} }); };
const addToCart = (product, color, size, qty) => {
const key = `${product.id}-${color}-${size}`;
setCart(prev => {
const ex = prev.find(i => i.key === key);
if (ex) return prev.map(i => i.key === key ? { ...i, qty: i.qty + qty } : i);
return [...prev, { key, product, color, size, qty }];
});
};
const updateQty = (key, delta) => setCart(prev => prev.map(i => i.key === key ? { ...i, qty: Math.max(1, i.qty + delta) } : i));
const removeItem = (key) => setCart(prev => prev.filter(i => i.key !== key));
const placeOrder = ({ method, loc, subtotal, over }) => {
const remaining = user.pointsTotal - user.pointsUsed;
const order = {
id: 'EV-' + Math.floor(20490 + Math.random() * 90),
method, loc, subtotal, over,
count: cart.reduce((n, i) => n + i.qty, 0),
remainingAfter: remaining - subtotal,
};
setUser(u => ({ ...u, pointsUsed: Math.min(u.pointsTotal, u.pointsUsed + subtotal) }));
setLastOrder(order);
setCart([]);
navigate('confirmation');
};
const ctx = { authed, route, cart, user, navigate, login, logout, addToCart, updateQty, removeItem, placeOrder };
if (!authed) {
return ;
}
// Admin is full-screen (its own chrome)
if (route.name === 'admin') {
return ;
}
let screen;
switch (route.name) {
case 'home': screen = ; break;
case 'category': screen = ; break;
case 'product': screen = ; break;
case 'cart': screen = ; break;
case 'checkout': screen = ; break;
case 'confirmation': screen = ; break;
case 'account': screen = ; break;
default: screen = ;
}
return (
);
}
ReactDOM.createRoot(document.getElementById('root')).render();