import { useAdminCreateDraftOrder } from "medusa-react"
import React from "react"
import { useNavigate } from "react-router-dom"
import { useTranslation } from "react-i18next"
import { LayeredModalContext } from "../../../components/molecules/modal/layered-modal"
import SteppedModal, {
SteppedContext,
} from "../../../components/molecules/modal/stepped-modal"
import useNotification from "../../../hooks/use-notification"
import isNullishObject from "../../../utils/is-nullish-object"
import Billing from "./components/billing-details"
import Items from "./components/items"
import SelectRegionScreen from "./components/select-region"
import SelectShippingMethod from "./components/select-shipping"
import ShippingDetails from "./components/shipping-details"
import Summary from "./components/summary"
import { useNewOrderForm } from "./form"
type NewOrderProps = {
onDismiss: () => void
}
const NewOrder = ({ onDismiss }: NewOrderProps) => {
const steppedContext = React.useContext(SteppedContext)
const layeredContext = React.useContext(LayeredModalContext)
const { t } = useTranslation()
const navigate = useNavigate()
const notification = useNotification()
const { mutate } = useAdminCreateDraftOrder()
const {
form: { handleSubmit, reset },
context: { region },
} = useNewOrderForm()
const onSubmit = handleSubmit((data) => {
mutate(
{
email: data.email,
items: data.items.map((i) => {
if (i.variant_id) {
return {
quantity: i.quantity,
variant_id: i.variant_id,
}
} else {
return {
quantity: i.quantity,
title: i.title,
unit_price: i.unit_price,
}
}
}),
region_id: data.region.value,
shipping_methods: [
{
option_id: data.shipping_option.value,
price:
typeof data.custom_shipping_price === "number"
? data.custom_shipping_price
: undefined,
},
],
shipping_address: data.shipping_address_id
? data.shipping_address_id
: !isNullishObject(data.shipping_address)
? {
address_1: data.shipping_address?.address_1,
address_2: data.shipping_address?.address_2 || undefined,
city: data.shipping_address?.city,
country_code: data.shipping_address?.country_code?.value,
company: data.shipping_address?.company || undefined,
first_name: data.shipping_address?.first_name,
last_name: data.shipping_address?.last_name,
phone: data.shipping_address?.phone || undefined,
postal_code: data.shipping_address?.postal_code,
province: data.shipping_address?.province || undefined,
}
: undefined,
billing_address: data.billing_address_id
? data.billing_address_id
: data.billing_address
? {
address_1: data.billing_address?.address_1,
address_2: data.billing_address?.address_2 || undefined,
city: data.billing_address?.city,
country_code: data.billing_address?.country_code?.value,
company: data.billing_address?.company || undefined,
first_name: data.billing_address?.first_name,
last_name: data.billing_address?.last_name,
phone: data.billing_address?.phone || undefined,
postal_code: data.billing_address?.postal_code,
province: data.billing_address?.province || undefined,
}
: undefined,
customer_id: data.customer_id?.value,
discounts: data.discount_code
? [{ code: data.discount_code }]
: undefined,
},
{
onSuccess: ({ draft_order }) => {
notification(
t("new-success", "Success"),
t("new-order-created", "Order created"),
"success"
)
reset()
onDismiss()
steppedContext.reset()
navigate(`/a/draft-orders/${draft_order.id}`)
},
onError: (error) => {
notification(t("new-error", "Error"), error.message, "error")
},
}
)
})
return (
,
,
,
,
,
,
]}
lastScreenIsSummary={true}
title={t("new-create-draft-order", "Create Draft Order")}
handleClose={onDismiss}
/>
)
}
export default NewOrder