import { ProductCollection } from "@medusajs/medusa" import { useAdminCreateCollection, useAdminUpdateCollection, } from "medusa-react" import React, { useEffect } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import useNotification from "../../../hooks/use-notification" import { getErrorMessage } from "../../../utils/error-messages" import { nestedForm } from "../../../utils/nested-form" import MetadataForm, { getSubmittableMetadata, MetadataFormType, } from "../../forms/general/metadata-form" import Button from "../../fundamentals/button" import IconTooltip from "../../molecules/icon-tooltip" import InputField from "../../molecules/input" import Modal from "../../molecules/modal" import { MetadataField } from "../../organisms/metadata" type CollectionModalProps = { onClose: () => void onSubmit: (values: any, metadata: MetadataField[]) => void isEdit?: boolean collection?: ProductCollection } type CollectionModalFormData = { title: string handle: string | undefined metadata: MetadataFormType } const CollectionModal: React.FC = ({ onClose, isEdit = false, collection, }) => { const { t } = useTranslation() const { mutate: update, isLoading: updating } = useAdminUpdateCollection( collection?.id! ) const { mutate: create, isLoading: creating } = useAdminCreateCollection() const form = useForm({ defaultValues: { title: collection?.title, handle: collection?.handle, metadata: { entries: Object.entries(collection?.metadata || {}).map( ([key, value]) => ({ key, value: value as string, state: "existing", }) ), }, }, }) const { register, handleSubmit, reset } = form useEffect(() => { if (collection) { reset({ title: collection.title, handle: collection.handle, metadata: { entries: Object.entries(collection.metadata || {}).map( ([key, value]) => ({ key, value: value as string, state: "existing", }) ), }, }) } }, [collection, reset]) const notification = useNotification() if (isEdit && !collection) { throw new Error("Collection is required for edit") } const submit = (data: CollectionModalFormData) => { if (isEdit) { update( { title: data.title, handle: data.handle, metadata: getSubmittableMetadata(data.metadata), }, { onSuccess: () => { notification( t("collection-modal-success", "Success"), t( "collection-modal-successfully-updated-collection", "Successfully updated collection" ), "success" ) onClose() }, onError: (error) => { notification( t("collection-modal-error", "Error"), getErrorMessage(error), "error" ) }, } ) } else { create( { title: data.title, handle: data.handle, metadata: getSubmittableMetadata(data.metadata), }, { onSuccess: () => { notification( t("collection-modal-success", "Success"), t( "collection-modal-successfully-created-collection", "Successfully created collection" ), "success" ) onClose() }, onError: (error) => { notification( t("collection-modal-error", "Error"), getErrorMessage(error), "error" ) }, } ) } } return (

{isEdit ? t("collection-modal-edit-collection", "Edit Collection") : t("collection-modal-add-collection", "Add Collection")}

{t( "collection-modal-description", "To create a collection, all you need is a title and a handle." )}

{t("collection-modal-details", "Details")}

} />

{t("collection-modal-metadata", "Metadata")}

) } export default CollectionModal