'use client' import { useState, useEffect } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Alert, AlertDescription } from '@/components/ui/alert' import { Search, Eye, Package, DollarSign, Calendar, Mail, Truck, CheckCircle, XCircle, Clock, AlertCircle } from 'lucide-react' interface Order { id: string customerId: string | null customerEmail: string items: OrderItem[] totalAmount: number currency: string status: 'pending' | 'paid' | 'fulfilled' | 'cancelled' | 'refunded' paymentIntentId: string | null stripeSessionId: string | null createdAt: string updatedAt: string shippingAddress?: { name: string address: string city: string state: string zipCode: string country: string } } interface OrderItem { productId: string productName: string price: number quantity: number priceId: string } export function OrderManagement() { const [orders, setOrders] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState('') const [statusFilter, setStatusFilter] = useState('all') const [selectedOrder, setSelectedOrder] = useState(null) const [showOrderDetail, setShowOrderDetail] = useState(false) const [error, setError] = useState(null) const [success, setSuccess] = useState(null) // Fetch orders const fetchOrders = async () => { try { setLoading(true) setError(null) const params = new URLSearchParams() if (statusFilter !== 'all') params.append('status', statusFilter) const response = await fetch(`/api/orders?${params}`) if (!response.ok) throw new Error('Failed to fetch orders') const data = await response.json() setOrders(data.orders) } catch (err) { setError(err instanceof Error ? err.message : 'Failed to fetch orders') } finally { setLoading(false) } } useEffect(() => { fetchOrders() }, [statusFilter]) // Handle order status update (placeholder) const handleUpdateOrderStatus = async (orderId: string, newStatus: Order['status']) => { try { setLoading(true) // In a real implementation, you would call an API to update the order console.log(`Updating order ${orderId} to status: ${newStatus}`) setOrders(prev => prev.map(order => order.id === orderId ? { ...order, status: newStatus, updatedAt: new Date().toISOString() } : order ) ) setSuccess(`Order status updated successfully`) setShowOrderDetail(false) } catch (err) { setError(err instanceof Error ? err.message : 'Failed to update order status') } finally { setLoading(false) } } // View order details const handleViewOrder = (order: Order) => { setSelectedOrder(order) setShowOrderDetail(true) } // Filter orders based on search and status const filteredOrders = orders.filter(order => { const matchesSearch = order.customerEmail.toLowerCase().includes(searchTerm.toLowerCase()) || order.id.toLowerCase().includes(searchTerm.toLowerCase()) const matchesStatus = statusFilter === 'all' || order.status === statusFilter return matchesSearch && matchesStatus }) // Format date const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) } // Get status badge variant const getStatusVariant = (status: Order['status']) => { switch (status) { case 'pending': return 'secondary' case 'paid': return 'default' case 'fulfilled': return 'default' case 'cancelled': return 'destructive' case 'refunded': return 'destructive' default: return 'secondary' } } // Get status icon const getStatusIcon = (status: Order['status']) => { switch (status) { case 'pending': return case 'paid': return case 'fulfilled': return case 'cancelled': return case 'refunded': return default: return null } } // Clear alerts useEffect(() => { if (error || success) { const timer = setTimeout(() => { setError(null) setSuccess(null) }, 5000) return () => clearTimeout(timer) } }, [error, success]) return (
{/* Alerts */} {error && ( {error} )} {success && ( {success} )} {/* Header */}

Order Management

View and manage customer orders

{/* Filters */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* Orders Table */} Orders Manage and track customer orders {loading ? (
) : ( Order ID Customer Items Total Status Date Actions {filteredOrders.map((order) => ( {order.id}
{order.customerEmail}
{order.items.length} item{order.items.length !== 1 ? 's' : ''}
{order.totalAmount.toFixed(2)}
{getStatusIcon(order.status)} {order.status.charAt(0).toUpperCase() + order.status.slice(1)}
{formatDate(order.createdAt)}
))}
)} {filteredOrders.length === 0 && !loading && (
No orders found. {searchTerm && 'Try adjusting your search.'}
)}
{/* Order Detail Dialog */} {selectedOrder && ( <> Order Details - {selectedOrder.id} {formatDate(selectedOrder.createdAt)}
{/* Customer Information */} Customer Information

Contact

{selectedOrder.customerEmail}
{selectedOrder.shippingAddress && (

Shipping Address

{selectedOrder.shippingAddress.name}
{selectedOrder.shippingAddress.address}
{selectedOrder.shippingAddress.city}, {selectedOrder.shippingAddress.state} {selectedOrder.shippingAddress.zipCode}
{selectedOrder.shippingAddress.country}
)}
{/* Order Items */} Order Items Product Price Quantity Total {selectedOrder.items.map((item, index) => ( {item.productName} ${item.price.toFixed(2)} {item.quantity} ${(item.price * item.quantity).toFixed(2)} ))}
Total:
{selectedOrder.totalAmount.toFixed(2)}
{/* Order Status */} Order Status
{getStatusIcon(selectedOrder.status)} {selectedOrder.status.charAt(0).toUpperCase() + selectedOrder.status.slice(1)} Last updated: {formatDate(selectedOrder.updatedAt)}
{selectedOrder.status === 'paid' && ( <> )} {selectedOrder.status === 'fulfilled' && ( )}
)}
) }