import { Button, Container, Copy, Heading, toast } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { ExclamationCircleSolid } from "@medusajs/icons" import { useOrderPreview } from "../../../../../hooks/api" import { useCancelOrderEdit, useConfirmOrderEdit, } from "../../../../../hooks/api/order-edits" import { useMemo } from "react" import { AdminOrderLinePreview, HttpTypes } from "@medusajs/types" import { Thumbnail } from "../../../../../components/common/thumbnail" import { useNavigate } from "react-router-dom" type OrderActiveEditSectionProps = { order: HttpTypes.AdminOrder } function EditItem({ item, quantity, }: { item: HttpTypes.AdminOrderLineItem quantity: number }) { return (
{quantity}x
{item.title} {item.variant_sku && " ยท "} {item.variant_sku && (
{item.variant_sku}
)}
) } export const OrderActiveEditSection = ({ order, }: OrderActiveEditSectionProps) => { const { t } = useTranslation() const navigate = useNavigate() const { order: orderPreview } = useOrderPreview(order.id) const { mutateAsync: cancelOrderEdit } = useCancelOrderEdit(order.id) const { mutateAsync: confirmOrderEdit } = useConfirmOrderEdit(order.id) const isPending = orderPreview?.order_change?.status === "pending" const [addedItems, removedItems] = useMemo(() => { const added: { item: AdminOrderLinePreview; quantity: number }[] = [] const removed: { item: AdminOrderLinePreview; quantity: number }[] = [] const orderLookupMap = new Map(order.items!.map((i) => [i.id, i])) ;(orderPreview?.items || []).forEach((currentItem) => { const originalItem = orderLookupMap.get(currentItem.id) if (!originalItem) { added.push({ item: currentItem, quantity: currentItem.quantity }) return } if (originalItem.quantity > currentItem.quantity) { removed.push({ item: currentItem, quantity: originalItem.quantity - currentItem.quantity, }) } if (originalItem.quantity < currentItem.quantity) { added.push({ item: currentItem, quantity: currentItem.quantity - originalItem.quantity, }) } }) return [added, removed] }, [orderPreview]) const onConfirmOrderEdit = async () => { try { await confirmOrderEdit() toast.success(t("orders.edits.toast.confirmedSuccessfully")) } catch (e) { toast.error( e instanceof Error ? e.message : t("errorBoundary.defaultTitle") ) } } const onCancelOrderEdit = async () => { try { await cancelOrderEdit() toast.success(t("orders.edits.toast.canceledSuccessfully")) } catch (e) { toast.error( e instanceof Error ? e.message : t("errorBoundary.defaultTitle") ) } } if (!orderPreview || orderPreview.order_change?.change_type !== "edit") { return null } return (
{t( isPending ? "orders.edits.panel.titlePending" : "orders.edits.panel.title" )}
{/* ADDED ITEMS*/} {!!addedItems.length && (
{t("labels.added")}
{addedItems.map(({ item, quantity }) => ( ))}
)} {/* REMOVED ITEMS*/} {!!removedItems.length && (
{t("labels.removed")}
{removedItems.map(({ item, quantity }) => ( ))}
)}
{isPending ? ( ) : ( )}
) }