"use client"; import { Check, ChevronDown, Clock, MapPin, Package, RotateCcw, Search, Truck, } from "lucide-react"; import { useState } from "react"; import { AspectRatio } from "@/components/ui/aspect-ratio"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Separator } from "@/components/ui/separator"; import { cn } from "@/lib/utils"; type OrderStatus = "pending" | "shipped" | "delivered" | "cancelled"; interface OrderItem { name: string; variant: string; image: string; price: number; quantity: number; } interface ShippingAddress { name: string; street: string; city: string; state: string; zipCode: string; } interface OrderHistoryItem { id: string; orderNumber: string; /** ISO 8601 date (YYYY-MM-DD) */ orderDate: string; status: OrderStatus; total: number; items: OrderItem[]; shippingAddress: ShippingAddress; trackingNumber?: string; /** ISO 8601 date (YYYY-MM-DD) */ estimatedDelivery?: string; } const DEFAULT_ORDERS: OrderHistoryItem[] = [ { id: "1", orderNumber: "72831", orderDate: "2025-02-15", status: "pending", total: 109080.0, items: [ { name: "چراغ آویز برنجی مدرن", variant: "پوشش مات طلایی", image: "/block-media/shadcnblocks/block/ecommerce/furniture/Modern-Artistic-Lamp-1.png", price: 109080.0, quantity: 1, }, ], shippingAddress: { name: "علی محمدی", street: "خیابان ولیعصر، پلاک ۱۲۳۴، واحد ۵", city: "تهران", state: "تهران", zipCode: "1415783114", }, }, { id: "2", orderNumber: "71293", orderDate: "2025-02-08", status: "shipped", total: 159080.0, items: [ { name: "صندلی ناهارخوری اسکاندیناوی", variant: "بلوط طبیعی", image: "/block-media/shadcnblocks/block/ecommerce/furniture/Modern-Wooden-Cabinet-1.png", price: 159080.0, quantity: 1, }, ], shippingAddress: { name: "علی محمدی", street: "خیابان ولیعصر، پلاک ۱۲۳۴، واحد ۵", city: "تهران", state: "تهران", zipCode: "1415783114", }, trackingNumber: "1Z999AA10123456784", estimatedDelivery: "2025-02-12", }, { id: "3", orderNumber: "69847", orderDate: "2025-01-25", status: "delivered", total: 449000.0, items: [ { name: "کابینت ذخیره‌سازی مین‌سنتری", variant: "چوب گردو", image: "/block-media/shadcnblocks/block/ecommerce/furniture/Minimalist-Wooden-Sideboard-1.png", price: 449000.0, quantity: 1, }, ], shippingAddress: { name: "علی محمدی", street: "خیابان ولیعصر، پلاک ۱۲۳۴، واحد ۵", city: "تهران", state: "تهران", zipCode: "1415783114", }, trackingNumber: "1Z999AA10123456799", }, { id: "4", orderNumber: "68234", orderDate: "2025-01-10", status: "delivered", total: 289000.0, items: [ { name: "چراغ ایستاده مینیمال", variant: "نیکل برس‌خورده", image: "/block-media/shadcnblocks/block/ecommerce/furniture/Modern-Artistic-Lamp-2.png", price: 189000.0, quantity: 1, }, { name: "گلدان سرامیکی", variant: "سفالی", image: "/block-media/shadcnblocks/block/ecommerce/furniture/Minimalist-Loveseat-1.png", price: 100000.0, quantity: 1, }, ], shippingAddress: { name: "علی محمدی", street: "خیابان ولیعصر، پلاک ۱۲۳۴، واحد ۵", city: "تهران", state: "تهران", zipCode: "1415783114", }, trackingNumber: "1Z999AA10123456800", }, ]; const formatCurrency = (value: number) => `${value.toLocaleString("fa-IR")} ریال`; const dateFormatter = new Intl.DateTimeFormat("fa-IR", { year: "numeric", month: "long", day: "numeric", }); const formatOrderDate = (isoDate: string) => dateFormatter.format(new Date(isoDate + "T12:00:00")); const statusConfig: Record< OrderStatus, { label: string; className: string; icon: typeof Clock } > = { pending: { label: "در انتظار", className: "bg-slate-100 text-slate-700 hover:bg-slate-100 dark:bg-slate-800 dark:text-slate-300", icon: Clock, }, shipped: { label: "در مسیر تحویل", className: "bg-orange-50 text-orange-600 hover:bg-orange-50 dark:bg-orange-950 dark:text-orange-400", icon: Truck, }, delivered: { label: "تحویل‌شده", className: "bg-emerald-50 text-emerald-600 hover:bg-emerald-50 dark:bg-emerald-950 dark:text-emerald-400", icon: Check, }, cancelled: { label: "لغوشده", className: "bg-red-50 text-red-600 hover:bg-red-50 dark:bg-red-950 dark:text-red-400", icon: Package, }, }; const statusFilterLabels: Record = { all: "همه سفارش‌ها", pending: "در انتظار", shipped: "در مسیر تحویل", delivered: "تحویل‌شده", cancelled: "لغوشده", }; interface OrderHistory2Props { orders?: OrderHistoryItem[]; className?: string; } const OrderHistory2 = ({ orders = DEFAULT_ORDERS, className, }: OrderHistory2Props) => { const [expandedId, setExpandedId] = useState(null); const [searchQuery, setSearchQuery] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const filteredOrders = orders.filter((order) => { const matchesStatus = statusFilter === "all" || order.status === statusFilter; const matchesSearch = searchQuery === "" || order.orderNumber.toLowerCase().includes(searchQuery.toLowerCase()) || order.items.some((item) => item.name.toLowerCase().includes(searchQuery.toLowerCase()), ); return matchesStatus && matchesSearch; }); return (

سفارش‌های من

مدیریت، پیگیری و مرور خریدهای خود

{filteredOrders.map((order) => { const status = statusConfig[order.status]; const StatusIcon = status.icon; const isExpanded = expandedId === order.id; const primaryItem = order.items[0]; return ( setExpandedId(open ? order.id : null)} >
{primaryItem.name}

{primaryItem.name}

{primaryItem.variant}

#{order.orderNumber} {formatOrderDate(order.orderDate)} {formatCurrency(order.total)}
#{order.orderNumber} {formatOrderDate(order.orderDate)} {formatCurrency(order.total)}

اقلام سفارش

{order.items.map((item, index) => (
{item.name}

{item.name}

{item.variant} · تعداد:{" "} {item.quantity.toLocaleString("fa-IR")}

{formatCurrency(item.price)}

))}

{order.shippingAddress.name}

{order.shippingAddress.street}

{order.shippingAddress.city}،{" "} {order.shippingAddress.state} کد پستی{" "} {order.shippingAddress.zipCode}

{order.trackingNumber && (

{order.trackingNumber}

{order.estimatedDelivery && (

تحویل تقریبی:{" "} {formatOrderDate(order.estimatedDelivery)}

)}
)}
{order.status === "shipped" && ( )} {order.status === "delivered" && ( <> )} {order.status === "pending" && ( )}
); })} {filteredOrders.length === 0 && (

سفارشی یافت نشد

{searchQuery ? `سفارشی با عبارت «${searchQuery}» یافت نشد.` : "هنوز سفارشی ثبت نکرده‌اید."}

)}
); }; export { OrderHistory2 };