AuthForm.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { actionLogin } from '../../actions/actionLogin';
  2. import { useState, useEffect, useContext } from 'react';
  3. import { connect, useSelector } from 'react-redux';
  4. import { MdVisibility, MdVisibilityOff } from 'react-icons/md';
  5. import { Box, Button, IconButton, TextField, Stack } from '@mui/material';
  6. import { useFormik } from 'formik';
  7. import * as Yup from 'yup';
  8. import { UIContext } from '../UIContext';
  9. import { Navigate, useNavigate } from 'react-router-dom';
  10. const signInSchema = Yup.object().shape({
  11. username: Yup.string().required("Обов'язкове"),
  12. password: Yup.string().required("Обов'язкове"),
  13. });
  14. export const AuthForm = ({ onSubmit = null, promiseStatus, promisePayload, serverErrors = [] } = {}) => {
  15. const [showPassword, setShowPassword] = useState(false);
  16. const { setAlert } = useContext(UIContext);
  17. const navigate = useNavigate();
  18. const token = useSelector((state) => state.auth?.token || null);
  19. if (token) {
  20. navigate('/admin');
  21. }
  22. const formik = useFormik({
  23. initialValues: {
  24. username: '',
  25. password: '',
  26. },
  27. validationSchema: signInSchema,
  28. validateOnChange: true,
  29. onSubmit: () => {
  30. onSubmit(formik.values.username, formik.values.password);
  31. },
  32. });
  33. useEffect(() => {
  34. if (promiseStatus === 'FULFILLED') {
  35. formik.setSubmitting(false);
  36. if (promisePayload) {
  37. setAlert({
  38. show: true,
  39. severity: 'success',
  40. message: 'Готово',
  41. });
  42. } else {
  43. setAlert({
  44. show: true,
  45. severity: 'error',
  46. message: 'Не вірні дані',
  47. });
  48. }
  49. }
  50. if (promiseStatus === 'REJECTED') {
  51. const errorMessage = serverErrors.reduce((prev, curr) => prev + '\n' + curr.message, '');
  52. formik.setSubmitting(false);
  53. setAlert({
  54. show: true,
  55. severity: 'error',
  56. message: errorMessage,
  57. });
  58. }
  59. }, [promiseStatus]);
  60. return (
  61. <Box
  62. className="AuthForm"
  63. display="flex"
  64. flexDirection="column"
  65. onSubmit={formik.handleSubmit}
  66. justifyContent="center"
  67. component="form"
  68. >
  69. <TextField
  70. id="username"
  71. name="username"
  72. variant="outlined"
  73. label="Username"
  74. error={formik.touched.username && Boolean(formik.errors.username)}
  75. value={formik.values.username}
  76. onBlur={formik.handleBlur}
  77. onChange={formik.handleChange}
  78. helperText={formik.touched.username && formik.errors.username}
  79. fullWidth
  80. sx={{ mt: 2 }}
  81. />
  82. <TextField
  83. id="password"
  84. name="password"
  85. variant="outlined"
  86. label="Password"
  87. type={showPassword ? 'text' : 'password'}
  88. error={formik.touched.password && Boolean(formik.errors.password)}
  89. value={formik.values.password}
  90. onBlur={formik.handleBlur}
  91. onChange={formik.handleChange}
  92. helperText={formik.touched.password && formik.errors.password}
  93. InputProps={{
  94. endAdornment: (
  95. <IconButton onClick={() => setShowPassword((prev) => !prev)} edge="end">
  96. {showPassword ? <MdVisibilityOff /> : <MdVisibility />}
  97. </IconButton>
  98. ),
  99. }}
  100. fullWidth
  101. sx={{ mt: 2 }}
  102. />
  103. <Button
  104. variant="contained"
  105. color="primary"
  106. type="submit"
  107. disabled={formik.isSubmitting || !formik.isValid}
  108. sx={{ mt: 2, mr: 1 }}
  109. fullWidth
  110. >
  111. Увійти
  112. </Button>
  113. </Box>
  114. );
  115. };
  116. export const CAuthForm = connect(
  117. (state) => ({
  118. promiseStatus: state.promise?.login?.status || null,
  119. promisePayload: state.promise?.login?.payload || null,
  120. serverErrors: state.promise?.login?.error || [],
  121. }),
  122. {
  123. onSubmit: (login, password) => actionLogin(login, password),
  124. }
  125. )(AuthForm);