import { WindowTitle } from "@saleor/components/WindowTitle"; import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config"; import { FulfillmentStatus, OrderFulfillmentApproveMutation, OrderFulfillmentApproveMutationVariables, OrderUpdateMutation, OrderUpdateMutationVariables, useCustomerAddressesQuery, useWarehouseListQuery } from "@saleor/graphql"; import useNavigator from "@saleor/hooks/useNavigator"; import OrderCannotCancelOrderDialog from "@saleor/orders/components/OrderCannotCancelOrderDialog"; import { OrderCustomerAddressesEditDialogOutput } from "@saleor/orders/components/OrderCustomerAddressesEditDialog/types"; import OrderFulfillmentApproveDialog from "@saleor/orders/components/OrderFulfillmentApproveDialog"; import OrderInvoiceEmailSendDialog from "@saleor/orders/components/OrderInvoiceEmailSendDialog"; import { OrderDiscountProvider } from "@saleor/products/components/OrderDiscountProviders/OrderDiscountProvider"; import { OrderLineDiscountProvider } from "@saleor/products/components/OrderDiscountProviders/OrderLineDiscountProvider"; import { useOrderVariantSearch } from "@saleor/searches/useOrderVariantSearch"; import { PartialMutationProviderOutput } from "@saleor/types"; import { mapEdgesToItems } from "@saleor/utils/maps"; import React from "react"; import { useIntl } from "react-intl"; import { customerUrl } from "../../../../customers/urls"; import { extractMutationErrors, getMutationState, getStringOrPlaceholder } from "../../../../misc"; import { productUrl } from "../../../../products/urls"; import OrderAddressFields from "../../../components/OrderAddressFields/OrderAddressFields"; import OrderCancelDialog from "../../../components/OrderCancelDialog"; import OrderDetailsPage from "../../../components/OrderDetailsPage"; import OrderFulfillmentCancelDialog from "../../../components/OrderFulfillmentCancelDialog"; import OrderFulfillmentTrackingDialog from "../../../components/OrderFulfillmentTrackingDialog"; import OrderMarkAsPaidDialog from "../../../components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog"; import OrderPaymentDialog from "../../../components/OrderPaymentDialog"; import OrderPaymentVoidDialog from "../../../components/OrderPaymentVoidDialog"; import OrderProductAddDialog from "../../../components/OrderProductAddDialog"; import OrderShippingMethodEditDialog from "../../../components/OrderShippingMethodEditDialog"; import { orderFulfillUrl, orderListUrl, orderRefundUrl, orderReturnUrl, orderUrl, OrderUrlQueryParams } from "../../../urls"; import { isAnyAddressEditModalOpen } from "../OrderDraftDetails"; interface OrderUnconfirmedDetailsProps { id: string; params: OrderUrlQueryParams; data: any; orderAddNote: any; orderLineUpdate: any; orderLineDelete: any; orderInvoiceRequest: any; handleSubmit: any; orderUpdate: PartialMutationProviderOutput< OrderUpdateMutation, OrderUpdateMutationVariables >; orderCancel: any; orderShippingMethodUpdate: any; orderLinesAdd: any; orderPaymentMarkAsPaid: any; orderVoid: any; orderPaymentCapture: any; orderFulfillmentApprove: PartialMutationProviderOutput< OrderFulfillmentApproveMutation, OrderFulfillmentApproveMutationVariables >; orderFulfillmentCancel: any; orderFulfillmentUpdateTracking: any; orderInvoiceSend: any; updateMetadataOpts: any; updatePrivateMetadataOpts: any; openModal: any; closeModal: any; } export const OrderUnconfirmedDetails: React.FC = ({ id, params, data, orderAddNote, orderLineUpdate, orderLineDelete, orderInvoiceRequest, handleSubmit, orderUpdate, orderCancel, orderShippingMethodUpdate, orderLinesAdd, orderPaymentMarkAsPaid, orderVoid, orderPaymentCapture, orderFulfillmentApprove, orderFulfillmentCancel, orderFulfillmentUpdateTracking, orderInvoiceSend, updateMetadataOpts, updatePrivateMetadataOpts, openModal, closeModal }) => { const order = data.order; const shop = data.shop; const navigate = useNavigator(); const { loadMore, search: variantSearch, result: variantSearchOpts } = useOrderVariantSearch({ variables: { ...DEFAULT_INITIAL_SEARCH_DATA, channel: order.channel.slug } }); const warehouses = useWarehouseListQuery({ displayLoader: true, variables: { first: 30 } }); const { data: customerAddresses, loading: customerAddressesLoading } = useCustomerAddressesQuery({ variables: { id: order?.user?.id }, skip: !order?.user?.id || !isAnyAddressEditModalOpen(params.action) }); const handleCustomerChangeAddresses = async ( data: Partial ): Promise => orderUpdate.mutate({ id, input: data }); const intl = useIntl(); const [transactionReference, setTransactionReference] = React.useState(""); const handleBack = () => navigate(orderListUrl()); return ( <> navigate(orderReturnUrl(id))} disabled={ updateMetadataOpts.loading || updatePrivateMetadataOpts.loading } onNoteAdd={variables => extractMutationErrors( orderAddNote.mutate({ input: variables, order: id }) ) } onBack={handleBack} order={order} shop={shop} onOrderLineAdd={() => openModal("add-order-line")} onOrderLineChange={(id, data) => orderLineUpdate.mutate({ id, input: data }) } onOrderLineRemove={id => orderLineDelete.mutate({ id })} onShippingMethodEdit={() => openModal("edit-shipping")} saveButtonBarState={getMutationState( updateMetadataOpts.called || updatePrivateMetadataOpts.called, updateMetadataOpts.loading || updatePrivateMetadataOpts.loading, [ ...(updateMetadataOpts.data?.deleteMetadata.errors || []), ...(updateMetadataOpts.data?.updateMetadata.errors || []), ...(updatePrivateMetadataOpts.data?.deletePrivateMetadata .errors || []), ...(updatePrivateMetadataOpts.data?.updatePrivateMetadata .errors || []) ] )} shippingMethods={data?.order?.shippingMethods || []} onOrderCancel={() => openModal("cancel")} onOrderFulfill={() => navigate(orderFulfillUrl(id))} onFulfillmentApprove={fulfillmentId => navigate( orderUrl(id, { action: "approve-fulfillment", id: fulfillmentId }) ) } onFulfillmentCancel={fulfillmentId => navigate( orderUrl(id, { action: "cancel-fulfillment", id: fulfillmentId }) ) } onFulfillmentTrackingNumberUpdate={fulfillmentId => navigate( orderUrl(id, { action: "edit-fulfillment", id: fulfillmentId }) ) } onPaymentCapture={() => openModal("capture")} onPaymentVoid={() => openModal("void")} onPaymentRefund={() => navigate(orderRefundUrl(id))} onProductClick={id => () => navigate(productUrl(id))} onBillingAddressEdit={() => openModal("edit-billing-address")} onShippingAddressEdit={() => openModal("edit-shipping-address")} onPaymentPaid={() => openModal("mark-paid")} onProfileView={() => navigate(customerUrl(order.user.id))} onInvoiceClick={id => window.open( order.invoices.find(invoice => invoice.id === id)?.url, "_blank" ) } onInvoiceGenerate={() => orderInvoiceRequest.mutate({ orderId: id }) } onInvoiceSend={id => openModal("invoice-send", { id })} onSubmit={handleSubmit} /> fulfillment.status === FulfillmentStatus.FULFILLED ) } /> orderCancel.mutate({ id }) } /> extractMutationErrors( orderShippingMethodUpdate.mutate({ id, input: { shippingMethod: variables.shippingMethod } }) ) } /> orderLinesAdd.mutate({ id, input: variants.map(variant => ({ quantity: 1, variantId: variant.id })) }) } /> orderPaymentMarkAsPaid.mutate({ id, transactionReference }) } open={params.action === "mark-paid"} transactionReference={transactionReference} handleTransactionReference={({ target }) => setTransactionReference(target.value) } /> orderVoid.mutate({ id })} /> orderPaymentCapture.mutate({ ...variables, id }) } /> orderFulfillmentApprove.mutate({ id: params.id, notifyCustomer }) } onClose={closeModal} /> orderFulfillmentCancel.mutate({ id: params.id, input: variables }) } onClose={closeModal} /> fulfillment.id === params.id )?.trackingNumber )} onConfirm={variables => orderFulfillmentUpdateTracking.mutate({ id: params.id, input: { ...variables, notifyCustomer: true } }) } onClose={closeModal} /> invoice.id === params.id)} onClose={closeModal} onSend={() => orderInvoiceSend.mutate({ id: params.id })} /> ); }; export default OrderUnconfirmedDetails;