import { Product } from "@medusajs/medusa" import { useCallback, useContext, useEffect } from "react" import { FieldArrayWithId, FormProvider, useFieldArray, useForm, } from "react-hook-form" import { useTranslation } from "react-i18next" import useEditProductActions from "../../../../hooks/use-edit-product-actions" import Button from "../../../fundamentals/button" import Modal from "../../../molecules/modal" import LayeredModal, { LayeredModalContext, } from "../../../molecules/modal/layered-modal" import { EditVariantsModalContext } from "./use-edit-variants-modal" import { VariantCard } from "./variant-card" type Props = { open: boolean onClose: () => void product: Product } export type VariantItem = { id: string title: string | null ean: string | null sku: string | null inventory_quantity: number } export type EditVariantsForm = { variants: VariantItem[] } const EditVariantsModal = ({ open, onClose, product }: Props) => { const context = useContext(LayeredModalContext) const { onUpdate, updating } = useEditProductActions(product.id) const { t } = useTranslation() const form = useForm({ defaultValues: getDefaultValues(product), }) const { control, handleSubmit, reset, formState: { isDirty }, } = form const { fields, move } = useFieldArray({ control, name: "variants", keyName: "fieldId", }) const moveCard = useCallback((dragIndex: number, hoverIndex: number) => { move(dragIndex, hoverIndex) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const renderCard = useCallback( ( card: FieldArrayWithId, index: number ) => { return ( ) }, [moveCard, product] ) const handleFormReset = useCallback(() => { reset(getDefaultValues(product)) }, [product, reset]) const resetAndClose = () => { handleFormReset() context.reset() onClose() } useEffect(() => { handleFormReset() }, [product, handleFormReset]) const onSubmit = handleSubmit((data) => { onUpdate( { // @ts-ignore variants: data.variants.map((variant) => { return { id: variant.id, inventory_quantity: variant.inventory_quantity, } }), }, () => { resetAndClose() }, t( "edit-variants-modal-update-success", "Variants were successfully updated" ) ) }) return (

{t("edit-variants-modal-edit-variants", "Edit Variants")}

{t( "edit-variants-modal-product-variants", "Product variants" )}{" "} ({product.variants.length})

{t("edit-variants-modal-variant", "Variant")}

{t("edit-variants-modal-inventory", "Inventory")}

{fields.map((card, i) => renderCard(card, i))}
) } const getDefaultValues = (product: Product): EditVariantsForm => { const variants = product.variants || [] const sortedVariants = variants.sort( (a, b) => a.variant_rank - b.variant_rank ) return { variants: sortedVariants.map((variant, i) => ({ id: variant.id, title: variant.title, ean: variant.ean, sku: variant.sku, variant_rank: variant.variant_rank || i + 1, inventory_quantity: variant.inventory_quantity, })), } } export default EditVariantsModal