"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" && ( )}
)}
) }