import { actionLogin } from "../../../actions/actionLogin"; import { useState, useEffect, useContext } from "react"; import { connect } from "react-redux"; import { MdVisibility, MdVisibilityOff } from "react-icons/md"; import { Box, Button, IconButton, TextField, Stack } from "@mui/material"; import { useFormik } from "formik"; import * as Yup from "yup"; import { UIContext } from "../../UIContext"; const signInSchema = 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"), }); export const LoginForm = ({ onLogin, onRegisterButtonClick, promiseStatus, serverErrors, inputVariant = "standard", buttonVariant = "text", } = {}) => { const [showPassword, setShowPassword] = useState(false); const { setAlert } = useContext(UIContext); const [promiseTimeOut, setPromiseTimeOut] = useState(null); const formik = useFormik({ initialValues: { username: "", password: "", repeatPassword: "", }, validationSchema: signInSchema, validateOnChange: true, onSubmit: () => { onLogin(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 || []).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 }} /> {onRegisterButtonClick ? ( ) : ( "" )} ); }; export const CLoginForm = connect( (state) => ({ promiseStatus: state.promise?.login?.status || null, serverErrors: state.promise?.login?.error || [] }), { onLogin: (login, password) => actionLogin(login, password) } )(LoginForm);