"use client" import { useState, useEffect } from "react" import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from "@/components/common/sheet" import { clientFetch } from "@/lib/api" import { Badge } from "@/components/common/badge" import { Separator } from "@/components/common/separator" import { ScrollArea } from "@/components/common/scroll-area" import { Package, Truck, CreditCard, Calendar, User, MapPin, ExternalLink } from "lucide-react" import { RelativeTime } from "@/components/common/relative-time" import { formatGBP } from "@/lib/utils/format" import Link from "next/link" import { Button } from "@/components/common/button" import { Skeleton } from "@/components/common/skeleton" interface OrderPeekProps { orderId: string | null open: boolean onOpenChange: (open: boolean) => void } export function OrderPeek({ orderId, open, onOpenChange }: OrderPeekProps) { const [order, setOrder] = useState(null) const [loading, setLoading] = useState(false) useEffect(() => { if (open && orderId) { fetchOrderDetails() } else if (!open) { // Don't clear order immediately to avoid flicker during closing // setOrder(null) } }, [open, orderId]) const fetchOrderDetails = async () => { setLoading(true) try { const data = await clientFetch(`/orders/${orderId}`) setOrder(data.order) } catch (error) { console.error("Failed to fetch order details for peek:", error) } finally { setLoading(false) } } const getStatusStyle = (status: string) => { switch (status) { case 'paid': return 'bg-emerald-500/10 text-emerald-500 border-emerald-500/20'; case 'shipped': return 'bg-blue-500/10 text-blue-500 border-blue-500/20'; case 'completed': return 'bg-green-500/10 text-green-500 border-green-500/20'; case 'cancelled': return 'bg-red-500/10 text-red-500 border-red-500/20'; case 'unpaid': return 'bg-yellow-500/10 text-yellow-500 border-yellow-500/20'; default: return 'bg-gray-500/10 text-gray-500 border-gray-500/20'; } } return (
Order Details {order && ( onOpenChange(false)}> )}
{loading ? : order ? `Order #${order.orderId}` : "Loading..."}
{loading ? (
{[1, 2, 3].map(i => )}
) : order ? (
{/* Summary Stats */}
Status
{order.status}
Total Value
{formatGBP(order.totalPrice)}
{/* Customer Info */}

Customer Information

Customer
{order.telegramUsername ? `@${order.telegramUsername}` : "Anonymous"} ID: {order.telegramBuyerId?.slice(0, 16) || "N/A"}
Order Date {order.orderDate ? : "N/A"}
{/* Order Items */}

Order Items

{order.products?.map((item: any, idx: number) => (
{item.name || `Item ${idx + 1}`} Qty: {item.quantity}
{formatGBP(item.totalItemPrice)}
))} {order.shippingMethod && (
Shipping: {order.shippingMethod.type} Standard Delivery
{formatGBP(order.shippingMethod.price)}
)}
{/* Shipping Address Peek */}

Delivery Address

{order.pgpAddress || "No address provided or encrypted."}

{/* Timeline Indicator */}

Next Milestone

Pending Shipment

Awaiting vendor processing and label creation.

) : (
Failed to load order data.
)}
{order && (
onOpenChange(false)}>
)}
) }