import { actionLogin } from '../../actions/actionLogin'; import { useState, useEffect, useContext } from 'react'; import { connect, useSelector } 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'; import { Navigate, useNavigate } from 'react-router-dom'; const signInSchema = Yup.object().shape({ username: Yup.string().required("Обов'язкове"), password: Yup.string().required("Обов'язкове"), }); export const AuthForm = ({ onSubmit = null, promiseStatus, promisePayload, serverErrors = [] } = {}) => { const [showPassword, setShowPassword] = useState(false); const { setAlert } = useContext(UIContext); const navigate = useNavigate(); const token = useSelector((state) => state.auth?.token || null); if (token) { navigate('/admin'); } const formik = useFormik({ initialValues: { username: '', password: '', }, validationSchema: signInSchema, validateOnChange: true, onSubmit: () => { onSubmit(formik.values.username, formik.values.password); }, }); useEffect(() => { if (promiseStatus === 'FULFILLED') { formik.setSubmitting(false); if (promisePayload) { setAlert({ show: true, severity: 'success', message: 'Готово', }); } else { setAlert({ show: true, severity: 'error', 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]); return ( setShowPassword((prev) => !prev)} edge="end"> {showPassword ? : } ), }} fullWidth sx={{ mt: 2 }} /> ); }; export const CAuthForm = connect( (state) => ({ promiseStatus: state.promise?.login?.status || null, promisePayload: state.promise?.login?.payload || null, serverErrors: state.promise?.login?.error || [], }), { onSubmit: (login, password) => actionLogin(login, password), } )(AuthForm);