import { LineItem, OrderEdit, OrderItemChange } from "@medusajs/medusa" import { useAdminCancelOrderEdit, useAdminConfirmOrderEdit, useAdminDeleteOrderEdit, useAdminUser, } from "medusa-react" import React, { useContext } from "react" import { OrderEditEvent } from "../../../../hooks/use-build-timeline" import useImperativeDialog from "../../../../hooks/use-imperative-dialog" import useNotification from "../../../../hooks/use-notification" import { getErrorMessage } from "../../../../utils/error-messages" import TwoStepDelete from "../../../atoms/two-step-delete" import Button from "../../../fundamentals/button" import EditIcon from "../../../fundamentals/icons/edit-icon" import ImagePlaceholder from "../../../fundamentals/image-placeholder" import EventContainer from "../event-container" import { OrderEditContext } from "../../../../domain/orders/edit/context" import CopyToClipboard from "../../../atoms/copy-to-clipboard" import { ByLine } from "." type EditCreatedProps = { event: OrderEditEvent } enum OrderEditItemChangeType { ITEM_ADD = "item_add", ITEM_REMOVE = "item_remove", ITEM_UPDATE = "item_update", } const getInfo = (edit: OrderEdit): { type: string; user_id: string } => { if (edit.requested_at && edit.requested_by) { return { type: "requested", user_id: edit.requested_by, } } return { type: "created", user_id: edit.created_by, } } const EditCreated: React.FC = ({ event }) => { const { isModalVisible, showModal, setActiveOrderEdit } = useContext(OrderEditContext) const orderEdit = event.edit const { type, user_id } = getInfo(orderEdit) const notification = useNotification() const name = `Order Edit ${type}` const { user } = useAdminUser(user_id) const forceConfirmDialog = useImperativeDialog() const deleteOrderEdit = useAdminDeleteOrderEdit(orderEdit.id) const cancelOrderEdit = useAdminCancelOrderEdit(orderEdit.id) const confirmOrderEdit = useAdminConfirmOrderEdit(orderEdit.id) const onDeleteOrderEditClicked = () => { deleteOrderEdit.mutate(undefined, { onSuccess: () => { notification("Success", `Successfully deleted Order Edit`, "success") }, onError: (err) => { notification("Error", getErrorMessage(err), "error") }, }) } const onCancelOrderEditClicked = () => { cancelOrderEdit.mutate(undefined, { onSuccess: () => { notification("Success", `Successfully canceled Order Edit`, "success") }, onError: (err) => { notification("Error", getErrorMessage(err), "error") }, }) } const onConfirmEditClicked = async () => { const shouldDelete = await forceConfirmDialog({ heading: "Delete Confirm", text: "By force confirming you allow the order edit to be fulfilled. You will still have to reconcile payments manually after confirming.", confirmText: "Yes, Force Confirm", cancelText: "No, Cancel", }) if (shouldDelete) { confirmOrderEdit.mutate(undefined, { onSuccess: () => { notification( "Success", `Successfully confirmed Order Edit`, "success" ) }, onError: (err) => { notification("Error", getErrorMessage(err), "error") }, }) } } const onCopyConfirmationLinkClicked = () => { console.log("TODO") } const onContinueEdit = () => { setActiveOrderEdit(orderEdit.id) showModal() } // hide last created edit while editing and prevent content flashing while loading if (isModalVisible && orderEdit?.status === "created") { return null } return ( <> } time={event.time} isFirst={event.first} midNode={} > {orderEdit.internal_note && (
{orderEdit.internal_note}
)}
{(orderEdit.status === "created" || orderEdit.status === "requested") && (
{type === "created" ? ( <> Delete the order edit ) : ( <> Cancel Order Edit )}
)}
) } const OrderEditChanges = ({ orderEdit }) => { if (!orderEdit) { return <> } const added = orderEdit.changes.filter( (oec: OrderItemChange) => oec.type === OrderEditItemChangeType.ITEM_ADD || (oec.type === OrderEditItemChangeType.ITEM_UPDATE && oec.line_item && oec.original_line_item && oec.original_line_item.quantity < oec.line_item.quantity) ) const removed = orderEdit.changes.filter( (oec) => oec.type === OrderEditItemChangeType.ITEM_REMOVE || (oec.type === OrderEditItemChangeType.ITEM_UPDATE && oec.line_item && oec.original_line_item && oec.original_line_item.quantity > oec.line_item.quantity) ) return (
{added.length > 0 && (
Added {added.map((change) => ( ))}
)} {removed.length > 0 && (
Removed {removed.map((change) => ( ))}
)}
) } type OrderEditChangeItemProps = { change: OrderItemChange } const OrderEditChangeItem: React.FC = ({ change, }) => { let quantity const isAdd = change.type === OrderEditItemChangeType.ITEM_ADD if (isAdd) { quantity = (change.line_item as LineItem).quantity } else { quantity = (change.original_line_item as LineItem)?.quantity - (change.line_item as LineItem)?.quantity } quantity = Math.abs(quantity) const lineItem = isAdd ? change.line_item : change.original_line_item return (
{lineItem?.thumbnail ? ( ) : ( )}
{quantity > 1 && <>{quantity}x} {lineItem?.title}   {lineItem?.variant?.sku && ( )} {lineItem?.variant?.options?.map((option) => option.value)}
) } export default EditCreated