'use client'; import React, { useEffect, useState } from 'react'; import { useSearchParams } from 'next/navigation'; import { apiClient } from '@/app/utils/apiClient'; import { validateTrackingCode } from '@/app/utils/trackingCodeGenerator'; import Link from 'next/link'; import './track-order.scss'; interface OrderItem { product_name: string; quantity: number; } interface TrackingUpdate { status: string; location: string; description: string; carrier: string; carrier_tracking_number: string; estimated_delivery: string | null; createdAt: string; } interface OrderTracking { orderNumber: string; orderDate: string; currentStatus: string; trackingNumber: string | null; estimatedDeliveryDate: string | null; items: OrderItem[]; trackingHistory: TrackingUpdate[]; } export default function TrackOrderPage() { const searchParams = useSearchParams(); const [orderNumber, setOrderNumber] = useState(searchParams.get('order') || ''); const [trackingNumber, setTrackingNumber] = useState(searchParams.get('track') || ''); const [trackingInfo, setTrackingInfo] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(false); const [isInitialLoad, setIsInitialLoad] = useState(true); // Auto-track on initial load if URL parameters are present useEffect(() => { if (orderNumber && trackingNumber) { trackOrder(); setIsInitialLoad(false); } else { setIsInitialLoad(false); } }, []); const trackOrder = async (e?: React.FormEvent) => { if (e) { e.preventDefault(); } if (!orderNumber) { setError('Please enter an order number'); return; } // If tracking number provided, validate its format if (trackingNumber && !validateTrackingCode(trackingNumber)) { setError('Invalid tracking number format. Please check and try again.'); return; } try { setLoading(true); setError(null); const queryParams = new URLSearchParams(); queryParams.append('orderNumber', orderNumber); if (trackingNumber) { queryParams.append('trackingNumber', trackingNumber); } const response = await apiClient(`/track-order/track?${queryParams.toString()}`); if (response.success) { setTrackingInfo(response.data); } else { setError(response.message || 'Could not find tracking information for this order'); } } catch (err) { console.error('Error fetching tracking info:', err); setError('An error occurred while fetching tracking information'); } finally { setLoading(false); } }; const getStatusClass = (status: string) => { switch (status.toLowerCase()) { case 'order_placed': case 'pending': return 'status-pending'; case 'processing': return 'status-processing'; case 'packed': return 'status-packed'; case 'shipped': return 'status-shipped'; case 'out_for_delivery': return 'status-out-for-delivery'; case 'delivered': return 'status-delivered'; case 'failed_delivery': return 'status-failed'; case 'returned': return 'status-returned'; case 'cancelled': return 'status-cancelled'; default: return 'status-default'; } }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); }; const formatDateTime = (dateString: string) => { return new Date(dateString).toLocaleString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', }); }; const formatStatus = (status: string) => { return status .split('_') .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); }; const getProgressPercentage = (status: string) => { const statuses = ['order_placed', 'processing', 'packed', 'shipped', 'out_for_delivery', 'delivered']; const index = statuses.indexOf(status.toLowerCase()); if (index === -1) return 0; return (index / (statuses.length - 1)) * 100; }; return (

Track Your Order

Enter your order number and tracking number to get the latest updates

setOrderNumber(e.target.value)} placeholder="e.g. ORD-12345" required />
setTrackingNumber(e.target.value)} placeholder="e.g. TRK-XXXX-XXXX-XXXX-X" /> Format: TRK-XXXX-XXXX-XXXX-X
{error && (
⚠️

{error}

Please check if you've entered the correct order number and tracking number.

If you're still having issues, please contact customer support.

)} {trackingInfo && (

Order #{trackingInfo.orderNumber}

Placed on {formatDate(trackingInfo.orderDate)}

{formatStatus(trackingInfo.currentStatus)}
{/* Tracking Progress Bar */}
= 0 ? 'active' : '' }`}>
Order Placed
= 0 ? 'active' : '' }`}>
Processing
= 0 ? 'active' : '' }`}>
Packed
= 0 ? 'active' : '' }`}>
Shipped
= 0 ? 'active' : '' }`}>
Out for Delivery
Delivered

Order Details

Item Quantity
{trackingInfo.items.map((item, index) => (
{item.product_name} {item.quantity}
))}

Shipping Details

{trackingInfo.trackingNumber && (
Tracking Number: {trackingInfo.trackingNumber}
)} {trackingInfo.estimatedDeliveryDate && (
Estimated Delivery: {formatDate(trackingInfo.estimatedDeliveryDate)}
)} {trackingInfo.trackingHistory && trackingInfo.trackingHistory[0]?.carrier && (
Carrier: {trackingInfo.trackingHistory[0].carrier}
)}

Tracking Updates

{trackingInfo.trackingHistory.length > 0 ? (
{trackingInfo.trackingHistory.map((update, index) => (
{formatStatus(update.status)} {formatDateTime(update.createdAt)}
{update.location}
{update.description &&
{update.description}
}
))}
) : (

No tracking updates available yet.

)}
Shipping & Delivery FAQ Contact Support
)} {!trackingInfo && !error && !loading && !isInitialLoad && (
🔎

Enter your order details above to track your package

You can find your order number in the confirmation email we sent you.

)}
); }