import { Order } from "@medusajs/medusa" import { PricedShippingOption } from "@medusajs/medusa/dist/types/pricing" import clsx from "clsx" import { useAdminShippingOptions } from "medusa-react" import { useMemo } from "react" import { Controller, useWatch } from "react-hook-form" import { useTranslation } from "react-i18next" import PriceFormInput from "../../../../components/forms/general/prices-form/price-form-input" import Button from "../../../../components/fundamentals/button" import TrashIcon from "../../../../components/fundamentals/icons/trash-icon" import { NextSelect } from "../../../../components/molecules/select/next-select" import { NestedForm } from "../../../../utils/nested-form" import { formatAmountWithSymbol } from "../../../../utils/prices" export type ShippingFormType = { option: { label: string value: { id: string taxRate: number } } | null price?: number } type Props = { form: NestedForm order: Order isReturn?: boolean isClaim?: boolean required?: boolean } const ShippingForm = ({ form, order, isReturn = false, isClaim = false, required = false, }: Props) => { const { t } = useTranslation() const { control, path, setValue, formState: { errors }, } = form const { shipping_options: shippingOptions } = useAdminShippingOptions({ region_id: order.region_id, is_return: isReturn, }) const returnShippingOptions = useMemo(() => { return ( shippingOptions?.map((o) => ({ label: o.name, value: { id: o.id, taxRate: (o as unknown as PricedShippingOption).tax_rates?.reduce( (acc, cur) => acc + (cur.rate || 0) / 100, 0 ) || 0, }, suffix: ( {formatAmountWithSymbol({ amount: (o as unknown as PricedShippingOption).price_incl_tax || o.amount || 0, currency: order.currency_code, })} ), })) || [] ) }, [isClaim, order.currency_code, shippingOptions]) const selectedOption = useWatch({ control, name: path("option"), }) const selectedOptionPrice = useWatch({ control, name: path("price"), }) const setCustomPrice = () => { if (selectedOption) { const option = shippingOptions?.find( (ro) => ro.id === selectedOption.value.id ) setValue( path("price"), Math.round((option?.amount || 0) * (1 + selectedOption.value.taxRate)) ) } } const deleteCustomPrice = () => { setValue(path("price"), undefined) } return (

{isReturn ? t( "shipping-form-shipping-for-return-items", "Shipping for return items" ) : t( "shipping-form-shipping-for-replacement-items", "Shipping for replacement items" )}

{ return ( ) }} /> {selectedOption && !isClaim && (
{selectedOptionPrice !== undefined ? (
{ return ( ) }} />
) : ( )}
)}
) } const ShippingFormHelpText = ({ isClaim = false, isReturn = false, }: Pick) => { const { t } = useTranslation() const text = useMemo(() => { if (isClaim && isReturn) { return t( "shipping-form-return-shipping-for-items-claimed-by-the-customer-is-complimentary", "Return shipping for items claimed by the customer is complimentary." ) } if (!isReturn) { return t( "shipping-form-shipping-for-replacement-items-is-complimentary", "Shipping for replacement items is complimentary." ) } return undefined }, [isClaim, isReturn]) if (!text) { return null } return

{text}

} export default ShippingForm