import { Box, Grid, TextField, MenuItem, Button, Alert, Snackbar } from '@mui/material'; import * as Yup from 'yup'; import { useFormik } from 'formik'; import { connect, useDispatch } from 'react-redux'; import { actionCartClear, actionPromiseClear } from '../../../reducers'; import { actionOrderUpdate } from '../../../actions/actionOrderUpdate'; import { useContext, useEffect, useState } from 'react'; import { UIContext } from '../../UIContext'; const deliveryOptions = [ { label: 'Нова пошта', value: 'nova-poshta' }, { label: 'Justin', value: 'justin' }, ]; const phoneRegExp = /^((\\+[1-9]{1,4}[ \\-]*)|(\\([0-9]{2,3}\\)[ \\-]*)|([0-9]{2,4})[ \\-]*)*?[0-9]{3,4}?[ \\-]*[0-9]{3,4}?$/; const orderSchema = Yup.object().shape({ name: Yup.string().min(3, 'не меньше 3 символів').max(22, 'не більше 22 символів').required("обов'язкове"), surname: Yup.string().min(3, 'не меньше 3 символів').max(22, 'не більше 22 символів').required("обов'язкове"), email: Yup.string().email('не вірний формат').required("обов'язкове"), address: Yup.string().required("обов'язкове"), phoneNumber: Yup.string().matches(phoneRegExp, 'не вірний формат').required("обов'язкове"), delivery: Yup.string() .required("обов'язкове") .oneOf( deliveryOptions.map((option) => option.value), 'не знайдено' ), }); export const OrderForm = ({ onSubmit = null, promiseStatus = null, serverErrors = [] } = {}) => { const { setAlert } = useContext(UIContext); const formik = useFormik({ initialValues: { name: '', surname: '', email: '', address: '', phoneNumber: '', delivery: '', }, validationSchema: orderSchema, validateOnChange: true, onSubmit: () => { onSubmit(formik.values); }, }); const dispatch = useDispatch(); useEffect(() => { if (promiseStatus === 'FULFILLED') { formik.setSubmitting(false); setAlert({ show: true, severity: 'success', message: 'Готово', }); dispatch(actionPromiseClear('orderUpsert')); dispatch(actionCartClear()); } if (promiseStatus === 'REJECTED') { const errorMessage = serverErrors.reduce((prev, curr) => prev + '\n' + curr.message, ''); setAlert({ show: true, severity: 'error', message: errorMessage, }); formik.setSubmitting(false); } }, [promiseStatus]); return ( {deliveryOptions.map((option) => ( {option.label} ))} ); }; export const COrderForm = connect( (state) => ({ promiseStatus: state.promise.orderUpsert?.status || null, serverErrors: state.promise?.orderUpsert?.error || [], }), { onClose: () => actionPromiseClear('orderUpsert'), } )(OrderForm);