import React, { useEffect, useMemo, useState } from 'react'; import { IonButton, IonButtons, IonContent, IonHeader, IonItem, IonLabel, IonList, IonLoading, IonPage, IonText, IonTitle, IonToolbar, useIonViewWillEnter, } from '@ionic/react'; import { RouteComponentProps, useHistory } from 'react-router-dom'; import { supabase } from '../supabase'; import type { Tables } from '../database.types'; import { setStatusBarBackground, setStatusBarStyle, Style, } from '../utils/statusBar'; type Props = RouteComponentProps<{ id: string }>; type Order = Tables<'orders'>; type OrderItem = Tables<'order_items'>; const statusSteps = [ 'pending', 'confirmed', 'packed', 'out_for_delivery', 'delivered', ] as const; const statusTitles: Record<(typeof statusSteps)[number], string> = { pending: 'Pending', confirmed: 'Confirmed', packed: 'Packed', out_for_delivery: 'Out for delivery', delivered: 'Delivered', }; const OrderDetail: React.FC = ({ match }) => { const history = useHistory(); const [order, setOrder] = useState(null); const [items, setItems] = useState([]); const [isLoading, setIsLoading] = useState(true); const [errorMessage, setErrorMessage] = useState(''); useIonViewWillEnter(() => { setStatusBarStyle(Style.Dark); setStatusBarBackground('#ffffff'); }); useEffect(() => { const loadOrder = async () => { setIsLoading(true); const [ { data: orderData, error: orderError }, { data: itemData, error: itemError }, ] = await Promise.all([ supabase.from('orders').select('*').eq('id', match.params.id).single(), supabase .from('order_items') .select('*') .eq('order_id', match.params.id) .order('created_at', { ascending: true }), ]); if (orderError || itemError || !orderData) { setErrorMessage('We could not load this order.'); window.setTimeout(() => setErrorMessage(''), 4000); setOrder(null); setItems([]); setIsLoading(false); return; } setOrder(orderData); setItems(itemData ?? []); setIsLoading(false); }; loadOrder(); }, [match.params.id]); const activeStepIndex = useMemo(() => { if (!order) return 0; const index = statusSteps.indexOf( order.status as (typeof statusSteps)[number] ); return index >= 0 ? index : 0; }, [order]); return ( history.replace('/orders')}> Back Track Order {errorMessage && (

{errorMessage}

)} {!isLoading && !order ? (

Order not found

We could not find that order. Try returning to your order list.

history.replace('/orders')}> Back to orders
) : ( order && ( <>
Order number

{order.order_number}

Placed on {new Date(order.created_at).toLocaleString()}

Current status {statusTitles[ order.status as (typeof statusSteps)[number] ] ?? order.status}
Total ${Number(order.total).toFixed(2)}

Delivery progress

{statusSteps.map((step, index) => { const isActive = index <= activeStepIndex; return (
{statusTitles[step]}

{index < activeStepIndex ? 'Completed' : index === activeStepIndex ? 'Current step' : 'Up next'}

); })}

Items in this order

{items.map((item) => (

{item.product_name}

${Number(item.unit_price).toFixed(2)} each

Qty {item.quantity} ยท $ {(Number(item.unit_price) * item.quantity).toFixed(2)}
))}
) )} ); }; export default OrderDetail;