"use client"; import { Box, Check, CheckCircle, CreditCard, Download, Home, MapPin, Package, Printer, Receipt, 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, CardHeader, CardTitle } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { cn } from "@/lib/utils"; interface OrderItem { id: string; name: string; image: string; price: number; quantity: number; details?: { label: string; value: string }[]; } interface ShippingAddress { name: string; street: string; city: string; state: string; zipCode: string; country: string; } interface PaymentMethod { type: "card" | "paypal" | "bank"; lastFour?: string; cardBrand?: string; email?: string; } interface StepContent { title: string; description: string; details: { label: string; value: string }[]; icon: "receipt" | "box" | "truck" | "home"; } interface TimelineStep { id: string; label: string; description: string; /** ISO 8601 datetime */ date: string; completed: boolean; current: boolean; content: StepContent; } interface OrderSummaryData { orderNumber: string; /** ISO 8601 date (YYYY-MM-DD) */ orderDate: string; status: "confirmed" | "processing" | "shipped" | "delivered"; email: string; items: OrderItem[]; subtotal: number; shipping: number; tax: number; discount?: number; total: number; shippingAddress: ShippingAddress; shippingMethod: string; estimatedDeliveryFrom: string; estimatedDeliveryTo?: string; paymentMethod: PaymentMethod; timeline: TimelineStep[]; } const currencyFormatter = new Intl.NumberFormat("fa-IR", { style: "currency", currency: "IRR", }); const dateFormatter = new Intl.DateTimeFormat("fa-IR", { year: "numeric", month: "long", day: "numeric", }); const dateTimeFormatter = new Intl.DateTimeFormat("fa-IR", { year: "numeric", month: "short", day: "numeric", hour: "numeric", minute: "2-digit", }); const formatOrderDate = (isoDate: string) => dateFormatter.format(new Date(isoDate + "T12:00:00")); const formatStepDate = (isoDateTime: string) => dateTimeFormatter.format(new Date(isoDateTime)); const formatDeliveryEstimate = (from: string, to?: string) => { if (to && to !== from) { return `${formatOrderDate(from)} تا ${formatOrderDate(to)}`; } return formatOrderDate(from); }; const formatItemDetails = (details: OrderItem["details"]) => { if (!details?.length) return null; return details.map((d) => `${d.label} ${d.value}`).join(" · "); }; const DEFAULT_ORDER: OrderSummaryData = { orderNumber: "ORD-2024-78432", orderDate: "2024-12-14", status: "delivered", email: "customer@example.com", items: [ { id: "1", name: "کفش بژ مینیمال", image: "/block-media/shadcnblocks/block/ecommerce/clothes/Minimalist-Beige-Sneakers-2.png", price: 120.0, quantity: 1, details: [ { label: "سایز", value: "42" }, { label: "رنگ", value: "بژ" }, ], }, { id: "2", name: "تاپ آبی گلدوزی", image: "/block-media/shadcnblocks/block/ecommerce/clothes/Woman-in-Embroidered-Blue-Top-2.png", price: 140.0, quantity: 2, details: [ { label: "سایز", value: "M" }, { label: "رنگ", value: "آبی" }, ], }, { id: "3", name: "کلاه فدورا کلاسیک", image: "/block-media/shadcnblocks/block/ecommerce/accessories/Classic-Fedora-Hat-2.png", price: 84.0, quantity: 1, details: [{ label: "سایز", value: "یک سایز" }], }, ], subtotal: 484.0, shipping: 12.0, tax: 38.72, discount: 50.0, total: 484.72, shippingAddress: { name: "علی محمدی", street: "خیابان ولیعصر، پلاک ۱۲۳۴، واحد ۵", city: "تهران", state: "تهران", zipCode: "1415783114", country: "ایران", }, shippingMethod: "ارسال سریع", estimatedDeliveryFrom: "2024-12-18", estimatedDeliveryTo: "2024-12-20", paymentMethod: { type: "card", lastFour: "4242", cardBrand: "Visa", }, timeline: [ { id: "1", label: "ثبت سفارش", description: "سفارش شما دریافت شد", date: "2024-12-14T14:30:00", completed: true, current: false, content: { title: "سفارش تأیید شد", description: "سفارش شما دریافت شد و ایمیل تأیید ارسال گردید. پرداخت با موفقیت انجام شد.", icon: "receipt", details: [ { label: "شماره سفارش", value: "ORD-2024-78432" }, { label: "روش پرداخت", value: "کارت بانکی •••• 4242" }, { label: "آدرس صورتحساب", value: "خیابان ولیعصر، تهران", }, { label: "مجموع سفارش", value: currencyFormatter.format(484.72), }, ], }, }, { id: "2", label: "آماده‌سازی", description: "در حال آماده‌سازی اقلام", date: "2024-12-14T16:15:00", completed: true, current: false, content: { title: "آماده‌سازی سفارش", description: "تیم انبار در حال جمع‌آوری و بسته‌بندی اقلام شماست. قبل از ارسال، کنترل کیفیت انجام می‌شود.", icon: "box", details: [ { label: "انبار", value: "مرکز توزیع تهران" }, { label: "اقلام بسته‌بندی‌شده", value: "۳ از ۳ قلم" }, { label: "کنترل کیفیت", value: "تأیید شد" }, { label: "بسته‌بندی", value: "مواد دوستدار محیط زیست" }, ], }, }, { id: "3", label: "ارسال‌شده", description: "در مسیر تحویل", date: "2024-12-15T09:00:00", completed: true, current: false, content: { title: "ارسال به مقصد", description: "بسته شما در راه است! با شماره رهگیری زیر می‌توانید وضعیت را لحظه‌ای پیگیری کنید.", icon: "truck", details: [ { label: "شرکت حمل", value: "پست پیشتاز" }, { label: "شماره رهگیری", value: "1Z999AA10123456784", }, { label: "تحویل تقریبی", value: "۱۷ آذر ۱۴۰۳" }, { label: "موقعیت فعلی", value: "تهران در حال انتقال" }, ], }, }, { id: "4", label: "تحویل‌شده", description: "بسته تحویل داده شد", date: "2024-12-17T11:45:00", completed: true, current: true, content: { title: "تحویل موفق", description: "بسته شما تحویل داده شد! امیدواریم از خرید راضی باشید. ثبت نظر را فراموش نکنید.", icon: "home", details: [ { label: "محل تحویل", value: "درِ ورودی" }, { label: "تحویل‌گیرنده", value: "ع. محمدی" }, { label: "زمان تحویل", value: "۱۷ آذر ۱۴۰۳، ساعت ۱۱:۴۵" }, { label: "عکس تحویل", value: "در بخش رهگیری موجود است" }, ], }, }, ], }; interface OrderSummary4Props { order?: OrderSummaryData; className?: string; } const OrderSummary4 = ({ order = DEFAULT_ORDER, className, }: OrderSummary4Props) => { const [selectedStepIndex, setSelectedStepIndex] = useState( order.timeline.findIndex((step) => step.current), ); const selectStep = (index: number) => { setSelectedStepIndex(index); }; const selectedStep = order.timeline[selectedStepIndex]; const completedSteps = order.timeline.filter((step) => step.completed).length; const progressPercentage = (completedSteps / order.timeline.length) * 100; const itemCountLabel = order.items.length === 1 ? "یک قلم" : `${order.items.length.toLocaleString("fa-IR")} قلم`; const getStepIcon = (iconType: StepContent["icon"]) => { switch (iconType) { case "receipt": return