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 } from "@mui/material"; import { useFormik } from "formik"; import * as Yup from "yup"; import { UIContext } from "../UIContext"; import { 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 isAdmin = useSelector((state) => state.auth?.payload?.sub?.acl || []).includes("admin"); if (isAdmin) { 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);