import clsx from "clsx" import { useAdminCreateNote, useAdminOrder } from "medusa-react" import React, { useState } from "react" import { useTranslation } from "react-i18next" import RegisterClaimMenu from "../../../domain/orders/details/claim/register-claim-menu" import ReturnMenu from "../../../domain/orders/details/returns" import SwapMenu from "../../../domain/orders/details/swap/create" import useOrdersExpandParam from "../../../domain/orders/details/utils/use-admin-expand-paramter" import { ClaimEvent, ExchangeEvent, ItemsFulfilledEvent, ItemsShippedEvent, NoteEvent, NotificationEvent, OrderEditEvent, OrderEditRequestedEvent, OrderPlacedEvent, PaymentRequiredEvent, RefundEvent, RefundRequiredEvent, ReturnEvent, TimelineEvent, useBuildTimeline, } from "../../../hooks/use-build-timeline" import useNotification from "../../../hooks/use-notification" import useToggleState from "../../../hooks/use-toggle-state" import { getErrorMessage } from "../../../utils/error-messages" import Spinner from "../../atoms/spinner" import AlertIcon from "../../fundamentals/icons/alert-icon" import BackIcon from "../../fundamentals/icons/back-icon" import RefreshIcon from "../../fundamentals/icons/refresh-icon" import Actionables, { ActionType } from "../../molecules/actionables" import NoteInput from "../../molecules/note-input" import Claim from "../../molecules/timeline-events/claim-event" import Exchange from "../../molecules/timeline-events/exchange" import ItemsFulfilled from "../../molecules/timeline-events/items-fulfilled" import ItemsShipped from "../../molecules/timeline-events/items-shipped" import Note from "../../molecules/timeline-events/note" import Notification from "../../molecules/timeline-events/notification" import OrderCanceled from "../../molecules/timeline-events/order-canceled" import EditCanceled from "../../molecules/timeline-events/order-edit/canceled" import EditConfirmed from "../../molecules/timeline-events/order-edit/confirmed" import EditCreated from "../../molecules/timeline-events/order-edit/created" import EditDeclined from "../../molecules/timeline-events/order-edit/declined" import PaymentRequired from "../../molecules/timeline-events/order-edit/payment-required" import RefundRequired from "../../molecules/timeline-events/order-edit/refund-required" import EditRequested from "../../molecules/timeline-events/order-edit/requested" import OrderPlaced from "../../molecules/timeline-events/order-placed" import Refund from "../../molecules/timeline-events/refund" import Return from "../../molecules/timeline-events/return" type TimelineProps = { orderId: string } const Timeline: React.FC = ({ orderId }) => { const { t } = useTranslation() const { orderRelations } = useOrdersExpandParam() const { events, refetch } = useBuildTimeline(orderId) const notification = useNotification() const createNote = useAdminCreateNote() const { order } = useAdminOrder(orderId, { expand: orderRelations, }) const [showRequestReturn, setShowRequestReturn] = useState(false) const [showCreateSwap, setshowCreateSwap] = useState(false) const { state: showRegisterClaim, close: closeRegisterClaim, open: openRegisterClaim, } = useToggleState() const actions: ActionType[] = [ { icon: , label: t("timeline-request-return", "Request Return"), onClick: () => setShowRequestReturn(true), }, { icon: , label: t("timeline-register-exchange", "Register Exchange"), onClick: () => setshowCreateSwap(true), }, { icon: , label: t("timeline-register-claim", "Register Claim"), onClick: openRegisterClaim, }, ] const handleCreateNote = (value: string | undefined) => { if (!value) { return } createNote.mutate( { resource_id: orderId, resource_type: "order", value: value, }, { onSuccess: () => notification( t("timeline-success", "Success"), t("timeline-added-note", "Added note"), "success" ), onError: (err) => notification( t("timeline-error", "Error"), getErrorMessage(err), "error" ), } ) } return ( <>

{t("timeline-timeline", "Timeline")}

{!events ? (
) : (
{events.map((event, i) => { return
{switchOnType(event, refetch)}
})}
)}
{showRequestReturn && order && ( setShowRequestReturn(false)} /> )} {showCreateSwap && order && ( setshowCreateSwap(false)} /> )} {showRegisterClaim && order && ( )} ) } function switchOnType(event: TimelineEvent, refetch: () => void) { switch (event.type) { case "placed": return case "fulfilled": return case "note": return case "shipped": return case "canceled": return case "return": return case "exchange": return ( ) case "claim": return case "notification": return case "refund": return case "edit-created": return case "edit-canceled": return case "edit-declined": return case "edit-confirmed": return case "edit-requested": return case "refund-required": return case "payment-required": return default: return null } } export default Timeline