import { useEffect, useState } from "react"; import { MetaFunction } from "@remix-run/node"; import ProfilePagesHeader from "../components/ProfilePagesHeader"; import placeholderImage from "~/assets/icons/product.png"; import placeholderImageDark from "~/assets/icons/product-dark.png"; import { useGetUserOrders, useGetOrderDetail, } from "../requestHandler/use-order-hooks"; import { useServiceGetCouriers } from "../requestHandler/use-courier-hooks"; import { Archive, ArrowRight, ArrowUpLeft, Component, SquareCheckBig, SquareX, X, } from "lucide-react"; import { formatDate, formatPrice } from "~/utils/helpers"; import { Dialog, DialogContent, DialogOverlay } from "../components/ui/dialog"; import { Button } from "~/components/ui/button"; import { useNavigate } from "@remix-run/react"; import { formatDateRange } from "~/components/cart/ShippingInformation"; import { OrderItem, OrderItemSummary, OrderList } from "src/api/types"; import UiProvider from "~/components/UiProvider"; import { isVideo } from "~/components/MondrianProductList"; import SellerLogo from "~/components/SellerLogo"; import { useRootData } from "~/hooks/use-root-data"; import { useMarkBadgeRead } from "~/hooks/useBadgeCounts"; // Product Modal Component const ProductModal = ({ product, isOpen, onClose, }: { product: OrderItemSummary | null; isOpen: boolean; onClose: () => void; }) => { const navigate = useNavigate(); if (!product) return null; return (
{ onClose(); }} /> {product.productTitle}

{product.productTitle}

); }; export default function Orders() { const { data, isLoading, isError, error, refetch } = useGetUserOrders(); const markBadgeRead = useMarkBadgeRead(); const [currentData, setCurrentData] = useState([]); const [activeTab, setActiveTab] = useState(0); const [activeFactorId, setActiveFactorId] = useState(""); const { theme } = useRootData(); const [showModal, setShowModal] = useState(false); const [selectedProduct, setSelectedProduct] = useState(null); // Visiting the orders page clears the "order status changed" badge. useEffect(() => { markBadgeRead.mutate("order_updates"); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // Update currentData when data or activeTab changes useEffect(() => { if (data) { let filteredData: OrderList[] = []; if (activeTab === 0) { filteredData = data; } else if (activeTab === 1) { filteredData = data.filter( (order: OrderList) => order.status === "confirmed" || order.status === "pending" ); } else if (activeTab === 2) { filteredData = data.filter( (order: OrderList) => order.status === "delivered" || order.status === "shipped" ); } else if (activeTab === 3) { filteredData = data.filter( (order: OrderList) => order.status === "cancelled" ); } setCurrentData(filteredData); } if (isError) { console.error("Error fetching orders:", error); setCurrentData([]); } }, [data, isError, error, activeTab]); const orderTabs = [ { title: "همه", logo: }, { title: "جاری", logo: }, { title: "ارسال شده", logo: }, { title: "لغو شده", logo: }, ]; const handleProductClick = (item: OrderItemSummary) => { setSelectedProduct(item); setShowModal(true); }; const closeModal = () => { setShowModal(false); }; return ( <> {activeFactorId ? ( ) : (

سفارش‌های من

{orderTabs.map( ( tab: { title: string; logo: React.ReactNode }, index: number ) => (
{}} onClick={() => { setActiveTab(index); }} className={`flex flex-col items-center gap-1 ${activeTab === index ? "text-BLACK border-b border-BLACK" : "text-GRAY"}`} > {tab.logo}

{tab.title}

) )}
{/* Add min-height to this container to prevent layout shift */}
<> {currentData && currentData.length > 0 && currentData.map((order: OrderList, index: number) => { return (
{getOrderStatusIcon(order.status || "")}

{getOrderStatus(order.status || "")}

شماره سفارش:

{order.invoiceNumber}

تاریخ ثبت سفارش:

{formatDate(order.createdAt || "")}

مبلغ پرداخت شده:

{formatPrice(order.totalPrice)} تومان

اقلام سبد خرید:

{order.items?.map( (item: OrderItemSummary, index: number) => { return (
handleProductClick(item)} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === "Enter") handleProductClick(item); }} > {isVideo(item.productImages?.[0] || "") ? (
); } )}
{}} onClick={() => setActiveFactorId(order.id || "")} className="flex text-BLUE gap-2 cursor-pointer justify-center w-full" >

مشاهده فاکتور

); })}
{/* Render product modal component */}
)} ); } const FactorDetail = ({ factorId, setActiveFactorId, }: { factorId: string; setActiveFactorId: (id: string) => void; }) => { const { data: factorDetail, isLoading: isLoadingDetail } = useGetOrderDetail(factorId); const sellerId = factorDetail?.seller || ""; const { data: sellerCouriers } = useServiceGetCouriers(sellerId); const courierName = factorDetail?.shippingInfo?.sellerCourierDetail?.courierName || "-"; return (
setActiveFactorId("")} className="absolute top-5 right-5" />

جزییات فاکتور

{isLoadingDetail ? (

در حال بارگذاری فاکتور...

) : (

وضعیت سفارش

{getOrderStatus(factorDetail?.status || "")}

شماره سفارش

...{factorDetail?.invoice?.id?.slice(0, 10)}

{factorDetail?.shippingInfo?.trackingCode && (

کد پیگیری پستی

{factorDetail?.shippingInfo?.trackingCode || "-"}

)}

تاریخ ثبت سفارش

{formatDate(factorDetail?.createdAt || "")}

روش ارسال

{courierName}

{factorDetail?.items?.map((item: OrderItem, index: number) => (

{item.productTitle || item.variant?.variantName || ""}

{formatPrice(item.variant?.price || item.unitPrice || "")} x{item.quantity} تومان

{item?.variant?.color?.value && item?.variant?.color?.value !== "UNSELECTED" && (
رنگ: {item?.variant?.color?.info?.persian && ( {item?.variant?.color?.info?.persian} )}
)} {item?.variant?.size?.value && item?.variant?.size?.value !== "UNSELECTED" && (
سایز: {item?.variant?.size?.info?.persian || item?.variant?.size?.value}
)}
))}

مقدار تخفیف

{formatPrice(factorDetail?.invoice?.discountValue || "0")} تومان

هزینه ارسال

{factorDetail?.shippingInfo?.sellerCourierDetail?.courierIsFreightCollect ? "پس پرداخت" : `${formatPrice( factorDetail?.shippingInfo?.deliveryPrice || "" )} تومان`}

مبلغ کل فاکتور

{formatPrice(factorDetail?.totalPrice || "")} تومان

تحویل گیرنده

{factorDetail?.shippingInfo?.receiverName || "حضوری"}

شماره موبایل

{factorDetail?.shippingInfo?.receiverPhone || "-"}

زمان تحویل

{formatDateRange( factorDetail?.shippingInfo?.estimatedDeliveryDays, factorDetail?.shippingInfo?.createdAt )}

{factorDetail?.shippingInfo?.mainAddress && (

آدرس:{factorDetail?.shippingInfo?.mainAddress}

)}
)}
); }; const getOrderStatus = (status: string) => { switch (status) { case "confirmed": return "جاری"; case "delivered": return "تحویل شده"; case "cancelled": return "لغو شده"; case "pending": return "پرداخت شده"; case "shipped": return "ارسال شده"; default: return "نامشخص"; } }; const getOrderStatusIcon = (status: string) => { switch (status) { case "confirmed": return ; case "delivered": return ; case "cancelled": return ; case "pending": return ; case "shipped": return ; default: return ; } }; export const meta: MetaFunction = () => { const title = "سفارش‌های من | ویترون"; const description = "مشاهده و پیگیری سفارش‌های خود در ویترون"; const imageUrl = "https://vitrownstatics.s3.ir-thr-at1.arvanstorage.ir/SVG-06.svg?versionId="; return [ { title }, { name: "description", content: description }, { name: "keywords", content: "سفارش‌ها، پیگیری سفارش، تاریخچه خرید، ویترون", }, { name: "robots", content: "noindex, follow" }, // Open Graph { property: "og:type", content: "website" }, { property: "og:title", content: title }, { property: "og:description", content: description }, { property: "og:image", content: imageUrl }, { property: "og:site_name", content: "ویترون" }, { property: "og:locale", content: "fa_IR" }, // Twitter Card { name: "twitter:card", content: "summary" }, { name: "twitter:title", content: title }, { name: "twitter:description", content: description }, ]; };