// CHECKOUT PAGE — mobile ready function CheckoutPage({ lang, cart, setCart, session, setPage, showToast }) { const settings = Store.getSettings(); const [step, setStep] = React.useState(1); const [form, setForm] = React.useState({ name: session?.name || '', phone: '', address: '', city: 'Torres Vedras', notes: '', payMethod: 'mbway', mbwayPhone: '' }); const [loading, setLoading] = React.useState(false); const [orderDone, setOrderDone] = React.useState(false); const subtotal = cart.reduce((s, i) => s + i.price * i.qty, 0); const deliveryFee = subtotal >= settings.freeDeliveryOver ? 0 : settings.deliveryFee; const total = subtotal + deliveryFee; const t = lang === 'pt' ? { title: 'Finalizar Encomenda', s1: 'Entrega', s2: 'Pagamento', name: 'Nome completo', phone: 'Telefone', address: 'Morada', city: 'Cidade', notes: 'Notas (opcional)', next: 'Continuar', back: 'Voltar', pay: 'Confirmar Pagamento', mbway: 'MB Way', multibanco: 'Multibanco', mbwayNum: 'Número MB Way', confirm: 'Encomenda Confirmada!', confirmMsg: 'Receberá uma confirmação em breve. Obrigado!', backShop: 'Continuar a Comprar', viewOrders: 'Ver Encomendas', required: 'Preencha todos os campos obrigatórios', delivery: 'Entrega', free: 'Grátis', order: 'A sua encomenda' } : { title: 'Checkout', s1: 'Delivery', s2: 'Payment', name: 'Full name', phone: 'Phone', address: 'Address', city: 'City', notes: 'Notes (optional)', next: 'Continue', back: 'Back', pay: 'Confirm Payment', mbway: 'MB Way', multibanco: 'Multibanco', mbwayNum: 'MB Way number', confirm: 'Order Confirmed!', confirmMsg: 'You will receive a confirmation shortly. Thank you!', backShop: 'Continue Shopping', viewOrders: 'View Orders', required: 'Please fill in all required fields', delivery: 'Delivery', free: 'Free', order: 'Your order' }; const set = (k, v) => setForm(f => ({ ...f, [k]: v })); const handleConfirm = () => { setLoading(true); setTimeout(() => { const orders = Store.getOrders(); Store.saveOrders([...orders, { id: Store.nextId(orders), userId: session.id, userName: form.name, phone: form.phone, address: `${form.address}, ${form.city}`, notes: form.notes, items: cart, subtotal, deliveryFee, total, payMethod: form.payMethod, status: 'pending', createdAt: new Date().toISOString() }]); setCart([]); Store.saveCart([]); setLoading(false); setOrderDone(true); }, 1600); }; const lbl = { display: 'block', fontFamily: 'Lato, sans-serif', color: 'var(--muted)', fontSize: 10, letterSpacing: 2, textTransform: 'uppercase', marginBottom: 6 }; const fld = { ...inputStyle, marginBottom: 14 }; if (orderDone) return (
🎉

{t.confirm}

{t.confirmMsg}

setPage('shop')}>{t.backShop} setPage('account')}>{t.viewOrders}
); return (
{t.title} {/* Steps indicator */}
{[t.s1, t.s2].map((s, i) => (
i+1 ? 'var(--gold)' : step === i+1 ? 'rgba(212,153,58,0.25)' : 'rgba(212,153,58,0.08)', border: `2px solid ${step >= i+1 ? 'var(--gold)' : 'var(--border)'}`, display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--gold)', fontFamily: 'Lato, sans-serif', fontSize: 13, fontWeight: 700 }}>{step > i+1 ? '✓' : i+1}
= i+1 ? 'var(--gold)' : 'var(--dim)', whiteSpace: 'nowrap' }}>{s}
{i < 1 &&
i+1 ? 'var(--gold)' : 'var(--border)', margin: '0 10px', marginBottom: 22 }}>
}
))}
{/* Step 1 */} {step === 1 && (
set('name', e.target.value)} /> set('phone', e.target.value)} placeholder="+351 9xx xxx xxx" inputMode="tel" /> set('address', e.target.value)} /> set('city', e.target.value)} />