/* Me2You - Order Tracking, Toast Notifications, Mobile Bottom Nav */
/* global React, Icon, StatusTag, OrderStepper, Price, panelStyle, btnPrimary, btnGhost, btnSmall, btnDanger */
const { useState, useEffect, useRef, createContext, useContext } = React;
/* --- Toast System --- */
const ToastContext = createContext(null);
function ToastProvider({ children }) {
const [toasts, setToasts] = useState([]);
const addToast = (msg, type='success') => {
const id = Date.now();
setToasts(prev => [...prev, { id, msg, type, out: false }]);
setTimeout(() => setToasts(prev => prev.map(t => t.id === id ? {...t, out: true} : t)), 2500);
setTimeout(() => setToasts(prev => prev.filter(t => t.id !== id)), 3000);
};
return (
{children}
);
}
function useToast() { return useContext(ToastContext); }
/* --- Order Tracking Page --- */
function OrderTracking({ order, onBack, onDispute }) {
const o = order || {
id: 'M2Y-2026-00248',
status: 'dispatched',
product: { title: 'Hisense 32" Smart TV', emoji: '', bg: 'linear-gradient(135deg,#FFE7C8,#FFF6E9)', price: 1850 },
seller: 'Sipho M.',
buyer: 'Nomsa M.',
total: 1910,
delivery: 60,
method: 'Courier to door',
address: '42 Vilakazi St, Orlando West, Soweto, 1804',
placed: '28 Apr 2026, 10:23',
paid: '28 Apr 2026, 10:24',
dispatched: '29 Apr 2026, 14:15',
eta: '1 May 2026',
driver: 'Bongani K.',
driverPhone: '072 345 6789',
trackingRef: 'DRV-0041',
};
const [liveStep, setLiveStep] = useState(2); // 0-4
return (
{/* Status stepper */}
{/* Live delivery card */}
{(o.status === 'dispatched' || o.status === 'paid') && (
{o.status === 'dispatched' ? 'On the way!' : 'Awaiting dispatch'}
{o.status === 'dispatched' ? `Estimated arrival: ${o.eta}` : 'Seller has 3 days to dispatch'}
{o.status === 'dispatched' && (
<>
Driver
{o.driver}
4.8 - Scooter
Tracking
{o.trackingRef}
ETA ~25 min
>
)}
)}
{/* Order details */}
Order details
{o.product.title}
Sold by {o.seller}
{/* Delivery info */}
Delivery information
{o.driver && }
{/* Timeline */}
Timeline
{[
{ time: o.placed, label: 'Order placed', icon: 'receipt', done: true },
{ time: o.paid, label: 'Payment confirmed', icon: 'shield-check', done: true },
{ time: o.dispatched, label: 'Dispatched', icon: 'truck', done: o.status !== 'paid' },
{ time: o.status === 'received' || o.status === 'completed' ? '2 May 2026, 09:30' : null, label: 'Received', icon: 'check-circle', done: o.status === 'received' || o.status === 'completed' },
{ time: o.status === 'completed' ? '2 May 2026, 09:30' : null, label: 'Completed', icon: 'star', done: o.status === 'completed' },
].map((step, i) => (
{step.label}
{step.time &&
{step.time}
}
))}
{/* Actions */}
{o.status === 'dispatched' && (
)}
{(o.status === 'paid' || o.status === 'dispatched' || o.status === 'received') && (
)}
);
}
function DetailRow({ label, value, bold, icon }) {
return (
{icon && }
{label}
{value}
);
}
/* --- Mobile Bottom Nav --- */
function MobileBottomNav({ active, onNav, cartCount }) {
const items = [
{ key: 'home', label: 'Home', icon: 'home' },
{ key: 'feed', label: 'Feed', icon: 'play' },
{ key: 'sell', label: 'Sell', icon: 'plus' },
{ key: 'community', label: 'Community', icon: 'users' },
{ key: 'cart', label: 'Cart', icon: 'shopping-bag', badge: cartCount },
];
return (
);
}
Object.assign(window, { ToastProvider, ToastContext, useToast, OrderTracking, MobileBottomNav });