import { connect } from "react-redux"; import { useState, useEffect, useContext } from "react"; import { actionPromiseClear } from "../../../reducers"; import Select from "react-select"; import { actionGoodUpdate } from "../../../actions/actionGoodUpdate"; import { EntityEditor } from "../../common/EntityEditor"; import { actionUploadFiles } from "../../../actions/actionUploadFiles"; import { UIContext } from "../../UIContext"; import { Box, Button, InputLabel, Stack, TextField } from "@mui/material"; import { useFormik } from "formik"; import * as Yup from "yup"; import { ConfirmModal } from "../../common/ConfirmModal"; import { actionGoodDelete } from "../../../actions/actionGoodDelete"; import { useNavigate } from "react-router-dom"; const goodSchema = Yup.object().shape({ name: Yup.string().required("Обов'язкове"), description: Yup.string().required("Обов'язкове"), price: Yup.number().min(0, "більше або равно 0").required("Обов'язкове"), amount: Yup.number().min(0, "більше або равно 0").required("Обов'язкове"), }); const CGoodEditor = connect( (state) => ({ entity: state.promise?.adminGoodById?.payload || {}, uploadFiles: state.promise?.uploadFiles, }), { onFileDrop: (files) => actionUploadFiles(files), } )(EntityEditor); export const GoodForm = ({ serverErrors = [], onSaveClick, onSave, onClose, onDelete, promiseStatus, deletePromiseStatus, catList = [], good = {}, } = {}) => { const [inputCategories, setInputCategories] = useState([]); const [inputImages, setInputImages] = useState([]); const { setAlert } = useContext(UIContext); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [promiseTimeOut, setPromiseTimeOut] = useState(null); const navigate = useNavigate(); const formik = useFormik({ initialValues: { name: "", description: "", price: 0, amount: 0, }, validationSchema: goodSchema, validateOnChange: true, onSubmit: () => { let goodToSave = {}; good?._id && (goodToSave._id = good._id); goodToSave.name = formik.values.name; goodToSave.description = formik.values.description; goodToSave.price = +formik.values.price; goodToSave.amount = +formik.values.amount; goodToSave.categories = inputCategories; goodToSave.images = inputImages?.map(({ _id }) => ({ _id })) || []; onSaveClick && onSaveClick(); onSave(goodToSave); setPromiseTimeOut(setTimeout(() => formik.setSubmitting(false), 3000)); }, }); useEffect(() => { return () => { promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); }; }, []); useEffect(() => { if (promiseStatus === "FULFILLED") { formik.setSubmitting(false); promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); setAlert({ show: true, severity: "success", message: "Готово", }); } if (promiseStatus === "REJECTED") { console.log(serverErrors); const errorMessage = (serverErrors ? [].concat(serverErrors) : []).reduce((prev, curr) => prev + "\n" + curr.message, ""); formik.setSubmitting(false); promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); setAlert({ show: true, severity: "error", message: errorMessage, }); } }, [promiseStatus]); useEffect(() => { if (deletePromiseStatus === "FULFILLED") { promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); navigate("/admin/goods/"); } if (deletePromiseStatus === "REJECTED") { promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); setAlert({ show: true, severity: "error", message: "Помилка", }); } return () => {}; }, [deletePromiseStatus]); useEffect(() => { setInputCategories(good?.categories || []); setInputImages(good?.images || []); formik.setFieldValue("name", good.name || ""); formik.setFieldValue("description", good.description || ""); formik.setFieldValue("amount", good.amount || 0); formik.setFieldValue("price", good.price || 0); formik.validateForm(); }, [good.categories, good.name, good.description, good.amount, good.price]); useEffect(() => { return () => { onClose && onClose(); }; }, []); return ( Зображення setInputImages(images)} /> Категорії