import { Product, ProductVariant, Region } from "@medusajs/medusa" import clsx from "clsx" import React, { useContext, useEffect, useState } from "react" import { Controller } from "react-hook-form" import { useTranslation } from "react-i18next" import Button from "../../../../components/fundamentals/button" import MinusIcon from "../../../../components/fundamentals/icons/minus-icon" import PlusIcon from "../../../../components/fundamentals/icons/plus-icon" import TrashIcon from "../../../../components/fundamentals/icons/trash-icon" import ImagePlaceholder from "../../../../components/fundamentals/image-placeholder" import InputField from "../../../../components/molecules/input" import { LayeredModalContext } from "../../../../components/molecules/modal/layered-modal" import { SteppedContext } from "../../../../components/molecules/modal/stepped-modal" import Table from "../../../../components/molecules/table" import { displayAmount, extractUnitPrice, getNativeSymbol, persistedPrice, } from "../../../../utils/prices" import RMASelectProductSubModal from "../../details/rma-sub-modals/products" import { useNewOrderForm } from "../form" import CustomItemSubModal from "./custom-item-sub-modal" import { useMedusa } from "medusa-react" const Items = () => { const { t } = useTranslation() const { enableNextPage, disableNextPage, nextStepEnabled } = React.useContext(SteppedContext) const { context: { region, items }, form: { control, register, setValue }, } = useNewOrderForm() const { client } = useMedusa() const { fields, append, remove, update } = items const [editQuantity, setEditQuantity] = useState(-1) const [editPrice, setEditPrice] = useState(-1) const layeredContext = useContext(LayeredModalContext) const addItem = async (variants: ProductVariant[]) => { const ids = fields.map((field) => field.variant_id) const itemsToAdd = variants.filter((v) => !ids.includes(v.id)) const variantIds = itemsToAdd.map((v) => v.id) const { variants: newVariants } = await client.admin.variants.list({ id: variantIds, region_id: region?.id, }) append( newVariants.map((item) => ({ quantity: 1, variant_id: item.id, title: item.title as string, unit_price: extractUnitPrice(item, region as Region, false), product_title: (item.product as Product)?.title, thumbnail: (item.product as Product)?.thumbnail, })) ) if (!nextStepEnabled) { enableNextPage() } } const handleEditQuantity = (index: number, value: number) => { const field = fields[index] field.quantity = field.quantity + value if (field.quantity > 0) { update(index, field) } } const handlePriceChange = ( index: number, value: number, currency: string ) => { const dbPrice = persistedPrice(currency, value) setValue(`items.${index}.unit_price`, dbPrice) } const addCustomItem = (title: string, quantity: number, amount: number) => { append({ title, unit_price: amount, quantity: quantity, }) if (!nextStepEnabled) { enableNextPage() } } const removeItem = (index: number) => { remove(index) if (nextStepEnabled && items.fields.length < 1) { disableNextPage() } } useEffect(() => { if (items.fields.length) { enableNextPage() } else { disableNextPage() } }, []) return (
{t("components-items-for-the-order", "Items for the order")} {fields.length > 0 && region && ( {t("components-details", "Details")} {t("components-quantity", "Quantity")} {t("components-price-excl-taxes", "Price (excl. Taxes)")} {fields.map((item, index) => { return (
{item.thumbnail ? ( ) : ( )}
{item.product_title && ( {item.product_title} )} {item.title}
{editQuantity === index ? ( setEditQuantity(-1)} /> ) : (
handleEditQuantity(index, -1)} className="hover:bg-grey-20 mr-2 flex h-5 w-5 cursor-pointer items-center justify-center rounded" > handleEditQuantity(index, 1)} className={clsx( "hover:bg-grey-20 ml-2 flex h-5 w-5 cursor-pointer items-center justify-center rounded" )} >
)}
{editPrice === index ? ( { return ( { setEditPrice(-1) }} prefix={getNativeSymbol(region.currency_code)} onChange={(e) => { handlePriceChange( index, +e.target.value, region.currency_code ) }} /> ) }} /> ) : ( { return ( { setEditPrice(index) }} > {displayAmount(region!.currency_code, value)} ) }} /> )} {region!.currency_code.toUpperCase()}
) })}
)}
) } const SelectProductsScreen = (pop, itemsToAdd, setSelectedItems, t) => { return { title: t("components-add-products", "Add Products"), onBack: () => pop(), view: ( ), } } const CreateCustomProductScreen = (pop, onSubmit, region, t) => { return { title: t("components-add-custom-item", "Add Custom Item"), onBack: () => pop(), view: , } } export default Items