/* 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}
{toasts.map(t => (
{t.msg}
))}
); } 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 (

Track your order

{o.id}
{/* 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) => (
{i < 4 &&
}
{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 });