// aerOS Guest v2 — Cart screen + order confirmation/tracking.
const { useState: _ct2S, useEffect: _ct2E } = React;
function G2Cart({ C, t, lang, tw, cart, setCart, onBack, onPlaced, toast, onItem }) {
const subtotal = cart.reduce((s, it) => s + it.unit * it.qty, 0);
const serviceFee = Math.round(subtotal * 0.1);
const total = subtotal + serviceFee;
const [note, setNote] = _ct2S('');
const setQty = (id, q) => { if (q <= 0) setCart(c => c.filter(x => x.id !== id)); else setCart(c => c.map(x => x.id === id ? { ...x, qty: q } : x)); };
return (
{t.cart}
{cart.length === 0 ? (
{Icon.bag({ size: 32 })}
{t.cartEmpty}
{t.cartEmptyDesc}
{t.browseMenu}
) : (
<>
{cart.map(it => (
onItem && onItem(it.pid)} style={{ width: 64, flexShrink: 0, cursor: onItem ? 'pointer' : 'default' }}> x.id === it.pid) || {}).image} />
onItem && onItem(it.pid)} style={{ fontWeight: 700, fontSize: 15, color: C.ink, lineHeight: 1.2, cursor: onItem ? 'pointer' : 'default' }}>{it.name}
{(it.portionLabel || it.modLabels?.length || it.note) && (
{[it.portionLabel, ...(it.modLabels || [])].filter(Boolean).join(' · ')}{it.note ? ((it.portionLabel || it.modLabels?.length ? ' · ' : '') + '“' + it.note + '”') : ''}
)}
setQty(it.id, q)} C={C} size="sm" min={0} />
{G2THEME.money(it.unit * it.qty, tw.currency)}
))}
{[[t.subtotal, subtotal], [t.service, serviceFee]].map(([l, v]) => (
{l}{G2THEME.money(v, tw.currency)}
))}
{t.total}{G2THEME.money(total, tw.currency)}
onPlaced({ items: cart, total, note, eta: 18 + Math.round(Math.random() * 10) })}>{t.placeOrder} · {G2THEME.money(total, tw.currency)}
>
)}
);
}
function G2Tracking({ C, t, lang, tw, order, onNew }) {
const steps = [t.track_received, t.track_preparing, t.track_ontheway, t.track_served];
const [step, setStep] = _ct2S(0);
const [cancelled, setCancelled] = _ct2S(false);
// Real status: poll the backend tracker (no mock auto-advance).
const CODE_STEP = { new: 0, received: 0, preparing: 1, ready: 2, ontheway: 2, on_way: 2, delivered: 3, served: 3 };
_ct2E(() => {
if (!order.id || !window.guestApi) return;
let stop = false; let id = null;
const done = () => { stop = true; if (id) clearInterval(id); };
const tick = async () => {
try {
const d = await window.guestApi.trackOrder(order.id, order.surname || '-');
if (stop || !d) return;
if (d.cancelled) { setCancelled(true); done(); return; } // terminal: stop polling
const s = CODE_STEP[d.current_code]; if (s != null) setStep(s);
if (s >= 3) done(); // delivered/served: nothing left to track
} catch (e) {}
};
tick(); id = setInterval(tick, 8000); return () => { stop = true; if (id) clearInterval(id); };
}, [order.id, order.surname]);
const stepIcons = [Icon.checkCircle, Icon.utensils, Icon.car, Icon.bell];
return (
{Icon.check({ size: 42 })}
{cancelled ? (lang === 'en' ? 'Order cancelled' : 'Sipariş iptal edildi') : t.orderPlaced}
{cancelled ? (lang === 'en' ? 'Please contact our team if this is unexpected.' : 'Beklenmedik ise lütfen ekibimize ulaşın.') : t.orderPlacedDesc}
{Icon.clock({ size: 16 })}{t.estTime} {order.eta} {t.min}
{steps.map((s, i) => {
const done = i < step, active = i === step;
const IC = stepIcons[i];
return (
{done ? Icon.check({ size: 20 }) : IC({ size: 20 })}
{i < steps.length - 1 &&
}
{s}
{active &&
● {lang === 'en' ? 'In progress' : 'Devam ediyor'}
}
);
})}
{t.cart}
{order.items.map(it => (
{it.qty}× {it.name}
{G2THEME.money(it.unit * it.qty, tw.currency)}
))}
{t.total}{G2THEME.money(order.total, tw.currency)}
{t.newOrder}
);
}
Object.assign(window, { G2Cart, G2Tracking });