import { Product } from "@medusajs/medusa" import { useEffect } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import useEditProductActions from "../../../hooks/use-edit-product-actions" import useNotification from "../../../hooks/use-notification" import { FormImage } from "../../../types/shared" import { prepareImages } from "../../../utils/images" import { nestedForm } from "../../../utils/nested-form" import MediaForm, { MediaFormType } from "../../forms/product/media-form" import Button from "../../fundamentals/button" import Modal from "../../molecules/modal" type Props = { product: Product open: boolean onClose: () => void } type MediaFormWrapper = { media: MediaFormType } const MediaModal = ({ product, open, onClose }: Props) => { const { t } = useTranslation() const { onUpdate, updating } = useEditProductActions(product.id) const form = useForm({ defaultValues: getDefaultValues(product), }) const { formState: { isDirty }, handleSubmit, reset, } = form const notification = useNotification() useEffect(() => { reset(getDefaultValues(product)) }, [product, reset]) const onReset = () => { reset(getDefaultValues(product)) onClose() } const onSubmit = handleSubmit(async (data) => { let preppedImages: FormImage[] = [] try { preppedImages = await prepareImages(data.media.images) } catch (error) { let errorMessage = t( "product-media-section-upload-images-error", "Something went wrong while trying to upload images." ) const response = (error as any).response as Response if (response.status === 500) { errorMessage = errorMessage + " " + t( "product-media-section-file-service-not-configured", "You might not have a file service configured. Please contact your administrator" ) } notification( t("product-media-section-error", "Error"), errorMessage, "error" ) return } const urls = preppedImages.map((image) => image.url) onUpdate( { images: urls, }, onReset ) }) return (

{t("product-media-section-edit-media", "Edit Media")}

{t("product-media-section-media", "Media")}

{t( "product-media-section-add-images-to-your-product", "Add images to your product." )}

) } const getDefaultValues = (product: Product): MediaFormWrapper => { return { media: { images: product.images?.map((image) => ({ url: image.url, selected: false, })) || [], }, } } export default MediaModal