import { useState, useEffect, useContext } from "react"; import { connect } from "react-redux"; // import { actionRegister } from 'actions'; import { MdVisibility, MdVisibilityOff } from "react-icons/md"; import { Box, Button, IconButton, TextField, Typography } from "@mui/material"; import { useFormik } from "formik"; import * as Yup from "yup"; import { actionRegister } from "../../../actions/actionRegister"; import { UIContext } from "../../UIContext"; const signUpSchema = Yup.object().shape({ username: Yup.string().min(3, "Too Short!").max(15, "Too Long!").required("Required"), password: Yup.string().min(3, "Too Short!").max(15, "Too Long!").required("Required"), repeatPassword: Yup.string() .min(3, "Too Short!") .max(15, "Too Long!") .required("Required") .oneOf([Yup.ref("password")], "Your passwords do not match."), }); export const RegisterForm = ({ serverErrors, promiseStatus, onRegister, onLoginButtonClick }) => { const [showPassword, setShowPassword] = useState(false); const { setAlert } = useContext(UIContext); const [promiseTimeOut, setPromiseTimeOut] = useState(null); const formik = useFormik({ initialValues: { username: "", password: "", repeatPassword: "", }, validationSchema: signUpSchema, validateOnChange: true, onSubmit: () => { onRegister(formik.values.username, formik.values.password); 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") { 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]); return ( setShowPassword((prev) => !prev)} edge="end"> {showPassword ? : } ), }} fullWidth sx={{ mt: 2 }} /> setShowPassword((prev) => !prev)} edge="end"> {showPassword ? : } ), }} fullWidth sx={{ mt: 2 }} /> ); }; export const CRegisterForm = connect( (state) => ({ promiseStatus: state.promise?.register?.status || null, serverErrors: state.promise?.register?.error || [] }), { onRegister: (login, password) => actionRegister(login, password), } )(RegisterForm);