import { LoaderFunctionArgs, type MetaFunction } from "@remix-run/node"; import { useLoaderData, useNavigate, useParams } from "@remix-run/react"; import { useGetSellerOrderDetail, useUpdateSellerOrder, } from "../requestHandler/use-order-hooks"; import { useServiceGetCouriers } from "../requestHandler/use-courier-hooks"; import { formatDate, formatPrice, formatTime, safeGoBack } from "../utils/helpers"; import { MapPin, Wallet, User, PhoneCall, Mail, Truck, AlertTriangle, X, Edit, Package, Signpost, NotebookPen } from "lucide-react"; import HeaderWithSupport from "../components/HeaderWithSupport"; import { Button } from "../components/ui/button"; import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger, DrawerFooter, } from "../components/ui/drawer"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogOverlay, } from "../components/ui/dialog"; import { useState, useEffect } from "react"; import { SellerOrderListStatusEnum, SellerOrderUpdateStatusEnum, SellerOrderUpdateCancelReasonEnum, } from "../../src/api/types"; import { RadioGroup, RadioGroupItem } from "~/components/ui/radio-group"; import AppInput from "~/components/AppInput"; import AppTextArea from "~/components/AppTextArea"; import { toast } from "~/hooks/use-toast"; import { useStoreOwnership } from "../hooks/useStoreOwnership"; export const meta: MetaFunction = () => { return [ { title: "جزئیات سفارش - ویترون" }, { name: "description", content: "مشاهده جزئیات کامل سفارش دریافتی در فروشگاه شما. مدیریت وضعیت سفارش، کد رهگیری و اطلاعات مشتری.", }, { name: "keywords", content: "جزئیات سفارش، مدیریت سفارش، کد رهگیری، فروشگاه، ویترون", }, { name: "robots", content: "noindex, follow" }, { property: "og:title", content: "جزئیات سفارش - ویترون" }, { property: "og:description", content: "مشاهده جزئیات کامل سفارش دریافتی در فروشگاه شما. مدیریت وضعیت سفارش، کد رهگیری و اطلاعات مشتری.", }, { property: "og:type", content: "website" }, { name: "twitter:card", content: "summary" }, { name: "twitter:title", content: "جزئیات سفارش - ویترون" }, { name: "twitter:description", content: "مشاهده جزئیات کامل سفارش دریافتی در فروشگاه شما. مدیریت وضعیت سفارش، کد رهگیری و اطلاعات مشتری.", }, ]; }; export async function loader({ params }: LoaderFunctionArgs) { const { storeId, orderId } = params; if (!storeId) { throw new Response("Store ID is required", { status: 400 }); } if (!orderId) { throw new Response("Order ID is required", { status: 400 }); } return { storeId, orderId }; } export default function OrderDetail() { const navigate = useNavigate(); const { orderId, storeId } = useLoaderData(); const { data: order, isLoading, error } = useGetSellerOrderDetail(orderId); const { data: sellerCouriers } = useServiceGetCouriers(storeId); // Check store ownership - this will redirect if user doesn't own the store const { isLoading: isOwnershipLoading } = useStoreOwnership(storeId); // State for drawer and modal const [isAcceptDrawerOpen, setIsAcceptDrawerOpen] = useState(false); const [isCancelModalOpen, setIsCancelModalOpen] = useState(false); const [isTrackingDrawerOpen, setIsTrackingDrawerOpen] = useState(false); const [isEditTrackingDrawerOpen, setIsEditTrackingDrawerOpen] = useState(false); const [isReactivateModalOpen, setIsReactivateModalOpen] = useState(false); const [isUpdating, setIsUpdating] = useState(false); const handleBack = () => { safeGoBack(navigate); }; // Resolve courier name from selected seller courier id const selectedSellerCourierId = order?.shippingInfo?.sellerCourier; const selectedCourier = sellerCouriers?.find( (c: any) => c?.id === selectedSellerCourierId || c?.courierId === selectedSellerCourierId || c?.courier?.id === selectedSellerCourierId ) || undefined; const courierName = selectedCourier?.courierName || "-"; // Show loading while checking ownership if (isOwnershipLoading) { return (
); } if (isLoading) { return (
); } if (error || !order) { return (

خطا در بارگذاری اطلاعات سفارش. لطفا دوباره تلاش کنید.

); } return ( <>

جزئیات سفارش

{order.createdAt && formatDate(order.createdAt)} -{" "} {order.createdAt && formatTime(order.createdAt)}

سفارش شماره {order.invoice?.invoiceNumber}

{/* Order Items */} {order.items && order.items.length > 0 && (
{order.items.map((item, index) => { console.log("item", item); return (
{/* Product Info */}
{index + 1}- {item.productTitle || "محصول"}( {formatPrice(item.totalPrice)} تومان)
{ navigate(`/product/${item.productId}`); }} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === "Enter") { navigate(`/product/${item.productId}`); } }} className="text-R10 text-BLUE cursor-pointer shrink-0" > مشاهده محصول
تعداد:
{item.quantity}
{item.variant?.color?.value !== "UNSELECTED" && ( <> رنگ:
)}
{item.variant?.size?.value !== "UNSELECTED" && ( <> سایز:
{item.variant?.size?.value !== "UNSELECTED" ? item.variant?.size?.info.persian : ""}
)}
); })}
)}

مبلغ فاکتور:

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

نام گیرنده:

{order.shippingInfo?.receiverName}

شماره‌ی گیرنده:

{order.shippingInfo?.receiverPhone}

آدرس:

{order.shippingInfo?.mainAddress}

{order.shippingInfo?.entryReference ? (

پلاک:

{order.shippingInfo.entryReference}

) : null} {order.shippingInfo?.details ? (

توضیحات:

{order.shippingInfo.details}

) : null}

کد پستی:

{order.shippingInfo?.postalCode}

شیوه ارسال:

{courierName}

{/* Action Buttons */} {order.status === SellerOrderListStatusEnum.Pending && (
)} {order.status === SellerOrderListStatusEnum.Confirmed && (
)} {order.status === SellerOrderListStatusEnum.Shipped && (
)} {order.status === SellerOrderListStatusEnum.Cancelled && (

این سفارش لغو شده است

)} {order.status === SellerOrderListStatusEnum.Delivered && (

محصول با موفقیت به دست مشتری رسیده است

)}
); } const AcceptOrderDrawer = ({ isAcceptDrawerOpen, setIsAcceptDrawerOpen, orderId, setIsUpdating, }: { isAcceptDrawerOpen: boolean; setIsAcceptDrawerOpen: (open: boolean) => void; orderId: string; setIsUpdating: (isUpdating: boolean) => void; }) => { const [trackingCode, setTrackingCode] = useState(""); const navigate = useNavigate(); const { storeId } = useParams(); const { mutate: updateOrder, isPending: isUpdating } = useUpdateSellerOrder(); setIsUpdating(isUpdating); const handleAcceptOrder = () => { if (!trackingCode.trim()) return; updateOrder( { orderId, data: { status: SellerOrderUpdateStatusEnum.Shipped, trackingCode: trackingCode.trim(), }, }, { onSuccess: () => { setIsAcceptDrawerOpen(false); setTrackingCode(""); toast({ title: "سفارش با موفقیت پذیرش شد", description: "سفارش با موفقیت پذیرش شد", }); navigate(`/store/${storeId}/orders`); }, } ); }; const handleAcceptOrderWithoutTrackingCode = () => { updateOrder( { orderId, data: { status: SellerOrderUpdateStatusEnum.Confirmed } }, { onSuccess: () => { setIsAcceptDrawerOpen(false); toast({ title: "سفارش با موفقیت پذیرش شد", description: "سفارش با موفقیت پذیرش شد", }); navigate(`/store/${storeId}/orders`); }, } ); }; return ( پذیرش سفارش setIsAcceptDrawerOpen(false)} className="absolute top-4 left-4 cursor-pointer" />
setTrackingCode(e.target.value)} className="w-full" inputDir={trackingCode === "" ? "rtl" : "ltr"} inputTitleFontSize="text-R14" />
); }; const CancelOrderModal = ({ isCancelModalOpen, setIsCancelModalOpen, orderId, setIsUpdating, }: { isCancelModalOpen: boolean; setIsCancelModalOpen: (open: boolean) => void; orderId: string; setIsUpdating: (isUpdating: boolean) => void; }) => { const navigate = useNavigate(); const { storeId } = useParams(); const [cancelReason, setCancelReason] = useState< SellerOrderUpdateCancelReasonEnum | "" >(""); const [cancelDescription, setCancelDescription] = useState(""); const { mutate: updateOrder, isPending: isUpdating } = useUpdateSellerOrder(); setIsUpdating(isUpdating); const handleCancelOrder = () => { if (!cancelReason) return; const data = { status: SellerOrderUpdateStatusEnum.Cancelled, cancelReason, ...(cancelReason === SellerOrderUpdateCancelReasonEnum.Other && cancelDescription.trim() && { cancelDescription: cancelDescription.trim(), }), }; updateOrder( { orderId, data }, { onSuccess: () => { setIsCancelModalOpen(false); setCancelReason(""); setCancelDescription(""); toast({ title: "سفارش با موفقیت لغو شد", description: "سفارش با موفقیت لغو شد", }); navigate(`/store/${storeId}/orders`); }, } ); }; return (
لغو سفارش

علت لغو کردن این سفارش چیست؟

setCancelReason(value as SellerOrderUpdateCancelReasonEnum) } value={cancelReason} className="flex flex-col gap-4 px-4" dir="rtl" >
{cancelReason === SellerOrderUpdateCancelReasonEnum.Other && (
) => setCancelDescription(e.target.value) } />
)}
); }; const AddTrackingDrawer = ({ isTrackingDrawerOpen, setIsTrackingDrawerOpen, orderId, setIsUpdating, }: { isTrackingDrawerOpen: boolean; setIsTrackingDrawerOpen: (open: boolean) => void; orderId: string; setIsUpdating: (isUpdating: boolean) => void; }) => { const [trackingCode, setTrackingCode] = useState(""); const navigate = useNavigate(); const { storeId } = useParams(); const { mutate: updateOrder, isPending: isUpdating } = useUpdateSellerOrder(); setIsUpdating(isUpdating); const handleAddTracking = () => { if (!trackingCode.trim()) return; updateOrder( { orderId, data: { status: SellerOrderUpdateStatusEnum.Shipped, trackingCode: trackingCode.trim(), }, }, { onSuccess: () => { setIsTrackingDrawerOpen(false); setTrackingCode(""); toast({ title: "کد رهگیری با موفقیت اضافه شد", description: "سفارش به حالت ارسال شده تغییر یافت", }); navigate(`/store/${storeId}/orders`); }, } ); }; return ( افزودن کد رهگیری setIsTrackingDrawerOpen(false)} className="absolute top-4 left-4 cursor-pointer" />
setTrackingCode(e.target.value)} className="w-full" inputDir={trackingCode === "" ? "rtl" : "ltr"} inputTitleFontSize="text-R14" />
); }; const EditTrackingDrawer = ({ isEditTrackingDrawerOpen, setIsEditTrackingDrawerOpen, orderId, initialTrackingCode, setIsUpdating, }: { isEditTrackingDrawerOpen: boolean; setIsEditTrackingDrawerOpen: (open: boolean) => void; orderId: string; initialTrackingCode: string; setIsUpdating: (isUpdating: boolean) => void; }) => { const [trackingCode, setTrackingCode] = useState(initialTrackingCode); // Update tracking code when modal opens or initial value changes useEffect(() => { if (isEditTrackingDrawerOpen) { setTrackingCode(initialTrackingCode); } }, [isEditTrackingDrawerOpen, initialTrackingCode]); const navigate = useNavigate(); const { storeId } = useParams(); const { mutate: updateOrder, isPending: isUpdating } = useUpdateSellerOrder(); setIsUpdating(isUpdating); const handleEditTracking = () => { if (!trackingCode.trim()) return; updateOrder( { orderId, data: { trackingCode: trackingCode.trim(), }, }, { onSuccess: () => { setIsEditTrackingDrawerOpen(false); toast({ title: "کد رهگیری با موفقیت ویرایش شد", description: "کد رهگیری سفارش به‌روزرسانی شد", }); navigate(`/store/${storeId}/orders`); }, } ); }; return ( ویرایش کد رهگیری setIsEditTrackingDrawerOpen(false)} className="absolute top-4 left-4 cursor-pointer" />
setTrackingCode(e.target.value)} className="w-full" inputDir={trackingCode === "" ? "rtl" : "ltr"} inputTitleFontSize="text-R14" />
); }; const ReactivateOrderModal = ({ isReactivateModalOpen, setIsReactivateModalOpen, orderId, setIsUpdating, }: { isReactivateModalOpen: boolean; setIsReactivateModalOpen: (open: boolean) => void; orderId: string; setIsUpdating: (isUpdating: boolean) => void; }) => { const navigate = useNavigate(); const { storeId } = useParams(); const { mutate: updateOrder, isPending: isUpdating } = useUpdateSellerOrder(); setIsUpdating(isUpdating); const handleReactivateOrder = () => { updateOrder( { orderId, data: { status: SellerOrderUpdateStatusEnum.Confirmed, }, }, { onSuccess: () => { setIsReactivateModalOpen(false); toast({ title: "سفارش با موفقیت فعال شد", description: "سفارش به حالت تایید شده تغییر یافت", }); navigate(`/store/${storeId}/orders`); }, } ); }; return (
فعال کردن مجدد سفارش

آیا از فعال کردن مجدد این سفارش اطمینان دارید؟

); };