import { connect } from 'react-redux'; import React, { useState, useEffect, useContext } from 'react'; import { actionPromise, 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 { Alert, Box, Button, Chip, FormControl, InputLabel, MenuItem, OutlinedInput, Snackbar, Stack, TextareaAutosize, TextField, Typography, } from '@mui/material'; import { useFormik } from 'formik'; import * as Yup from 'yup'; import { Error } from '../../common/Error'; 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, promiseStatus, catList = [], good = {}, } = {}) => { const [inputCategories, setInputCategories] = useState([]); const [inputImages, setInputImages] = useState([]); const { setAlert } = useContext(UIContext); 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); }, }); useEffect(() => { if (promiseStatus === 'FULFILLED') { formik.setSubmitting(false); setAlert({ show: true, severity: 'success', message: 'Готово', }); } if (promiseStatus === 'REJECTED') { const errorMessage = serverErrors.reduce((prev, curr) => prev + '\n' + curr.message, ''); formik.setSubmitting(false); setAlert({ show: true, severity: 'error', message: errorMessage, }); } }, [promiseStatus]); 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); }, [good.categories, good.name, good.description, good.amount, good.price]); useEffect(() => { return () => { onClose && onClose(); }; }, []); return ( Зображення setInputImages(images)} /> Категорії