'use client' import { useState, useEffect, useCallback } from 'react' import { useParams, useRouter } from 'next/navigation' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Separator } from '@/components/ui/separator' import { ArrowLeft, Package, Truck, CheckCircle, XCircle, Clock, Calendar, MapPin, Mail, CreditCard, Star } from 'lucide-react' import { motion } from 'framer-motion' import { toast } from 'sonner' import Link from 'next/link' import Image from 'next/image' interface OrderDetails { id: string total: number status: 'PENDING' | 'PAID' | 'SHIPPED' | 'DELIVERED' | 'CANCELLED' createdAt: string updatedAt: string razorpayOrderId: string | null razorpayPaymentId: string | null user: { name: string email: string } orderItems: { id: string quantity: number price: number product: { id: string name: string images: string[] discount: number sku: string } }[] } const statusConfig = { PENDING: { label: 'Order Placed', color: 'bg-gradient-to-r from-yellow-400 to-orange-500', icon: Clock, description: 'Your order is being processed' }, PAID: { label: 'Payment Confirmed', color: 'bg-gradient-to-r from-blue-500 to-indigo-600', icon: CreditCard, description: 'Payment received successfully' }, SHIPPED: { label: 'Order Shipped', color: 'bg-gradient-to-r from-purple-500 to-pink-600', icon: Truck, description: 'Your order is on the way' }, DELIVERED: { label: 'Delivered', color: 'bg-gradient-to-r from-green-500 to-emerald-600', icon: CheckCircle, description: 'Order delivered successfully' }, CANCELLED: { label: 'Cancelled', color: 'bg-gradient-to-r from-red-500 to-pink-600', icon: XCircle, description: 'Order was cancelled' } } export default function OrderDetailsPage() { const params = useParams() const router = useRouter() const [order, setOrder] = useState(null) const [loading, setLoading] = useState(true) const [cancelling, setCancelling] = useState(false) const [error, setError] = useState(null) const fetchOrder = useCallback(async () => { if (!params.id) return try { setLoading(true) setError(null) const response = await fetch(`/api/orders/${params.id}`) if (!response.ok) { if (response.status === 401) { router.push('/auth/signin?callbackUrl=/orders/' + params.id) return } throw new Error('Order not found') } const data = await response.json() setOrder(data) } catch (error) { console.error('Error fetching order:', error) setError('Failed to load order details') } finally { setLoading(false) } }, [params.id, router]) useEffect(() => { fetchOrder() }, [fetchOrder]) const handleCancelOrder = async () => { if (!order || !confirm('Are you sure you want to cancel this order?')) return setCancelling(true) try { const response = await fetch(`/api/orders/${order.id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: 'CANCELLED' }) }) if (!response.ok) throw new Error('Failed to cancel order') toast.success('Order cancelled successfully') fetchOrder() } catch (error) { toast.error('Failed to cancel order') } finally { setCancelling(false) } } if (loading) { return (

Loading order details...

) } if (error || !order) { return (

{error || 'Order not found'}

) } const StatusIcon = statusConfig[order.status].icon const statusInfo = statusConfig[order.status] return (
{/* Header */}

Order #{order.id.slice(-8)}

Placed on {new Date(order.createdAt).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}

{statusInfo.label}

{statusInfo.description}

{/* Order Items */}
Order Items
{order.orderItems.map((item, index) => { const discountedPrice = item.product.discount > 0 ? item.price - (item.price * item.product.discount / 100) : item.price return (
{item.product.name} {item.product.discount > 0 && (
{item.product.discount}% OFF
)}

{item.product.name}

SKU: {item.product.sku} Qty: {item.quantity}
{[...Array(5)].map((_, i) => ( ))} (4.5)

₹{(discountedPrice * item.quantity).toFixed(2)}

{item.product.discount > 0 && (

₹{(item.price * item.quantity).toFixed(2)}

)}
) })}
{/* Order Timeline */} Order Journey
{/* Order Placed */}

Order Placed

{new Date(order.createdAt).toLocaleString()}

{/* Payment Confirmed */} {['PAID', 'SHIPPED', 'DELIVERED'].includes(order.status) && (

Payment Confirmed

Payment processed successfully

)} {/* Order Shipped */} {['SHIPPED', 'DELIVERED'].includes(order.status) && (

Order Shipped

Your package is on the way

)} {/* Order Delivered */} {order.status === 'DELIVERED' && (

Order Delivered

Package delivered successfully

)} {/* Order Cancelled */} {order.status === 'CANCELLED' && (

Order Cancelled

Order was cancelled

)}
{/* Order Summary & Actions */}
Order Summary
Subtotal ₹{order.total.toFixed(2)}
Shipping Free
Total ₹{order.total.toFixed(2)}
{order.razorpayOrderId && (

Payment Details

ID: {order.razorpayPaymentId || 'Processing...'}

)} {order.status === 'PENDING' && ( )}
Customer Details
{order.user.email}
{order.user.name}
) }