Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3396 | Rev 3402 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3263 stevensc 1
import React from 'react'
2
import { useNavigate, Link } from 'react-router-dom'
3
import { useDispatch, useSelector } from 'react-redux'
4
import { Controller, useForm } from 'react-hook-form'
5
import { Button, Typography } from '@mui/material'
6
import { Mail, Lock } from '@mui/icons-material'
7
 
8
import { useMobile } from '@hooks'
9
import { asyncLogin } from '@store/auth/auth.actions'
10
import { addNotification } from '@store/notification/notification.actions'
11
import CryptoJSAesJson from '@utils/crypto-js/cryptojs-aes-format'
12
 
13
import Captcha from './captcha'
3264 stevensc 14
import Row from '@components/common/Row'
3263 stevensc 15
import Form from '@components/common/form'
16
import Input from '@components/UI/inputs/Input'
17
import CheckboxInput from '@components/UI/inputs/Checkbox'
18
import LoadingWrapper from '@components/common/loading-wrapper'
19
import FormErrorFeedback from '@components/UI/form/FormErrorFeedback'
20
 
21
export default function LoginForm() {
22
  const navigate = useNavigate()
23
  const dispatch = useDispatch()
24
 
3401 stevensc 25
  const { aes, jwt } = useSelector((state) => state.auth)
3263 stevensc 26
  const isMobile = useMobile()
27
 
28
  const {
29
    formState: { errors, isSubmitting, isValid },
30
    control,
31
    handleSubmit,
32
    reset
33
  } = useForm({ mode: 'all' })
34
 
35
  const onSubmitHandler = handleSubmit(
3264 stevensc 36
    async ({ email, password, remember, captcha }) => {
3263 stevensc 37
      try {
38
        const response = await dispatch(
39
          asyncLogin({
40
            email: CryptoJSAesJson.encrypt(email, aes),
41
            password: CryptoJSAesJson.encrypt(password, aes),
3264 stevensc 42
            captcha,
3263 stevensc 43
            remember: remember ? 1 : 0
44
          })
45
        )
3396 stevensc 46
        window.localStorage.setItem('jwt', jwt)
47
        window.localStorage.setItem('aes', aes)
48
        window.localStorage.setItem('is_logged_in', true)
3263 stevensc 49
        reset()
50
 
51
        isMobile ? navigate('/apps-navigation') : navigate(response.redirect)
52
      } catch (error) {
53
        dispatch(addNotification({ style: 'danger', msg: error.message }))
54
      }
55
    }
56
  )
57
 
58
  return (
59
    <Form onSubmit={onSubmitHandler}>
60
      <LoadingWrapper loading={isSubmitting} displayChildren></LoadingWrapper>
61
 
62
      <Typography variant='h3'>Entrar</Typography>
63
 
64
      <Input
65
        type='email'
66
        name='email'
67
        icon={<Mail />}
68
        placeholder='Correo electrónico'
69
        rules={{
70
          required: 'Este campo es requerido',
71
          pattern: {
72
            value: /^[\w-.]+@([\w-]+\.)+[\w-]{2,}$/i,
73
            message: 'Debe ser una dirección de correo electrónico valida'
74
          },
75
          maxLength: {
76
            value: 64,
77
            message: 'Debe ser menor a 64 caracteres'
78
          }
79
        }}
80
        control={control}
81
        error={errors.email?.message}
82
      />
83
 
84
      <Input
85
        type='password'
86
        name='password'
87
        icon={<Lock />}
88
        placeholder='Clave'
89
        control={control}
90
        rules={{
91
          required: 'Este campo es requerido',
92
          pattern: {
93
            value:
94
              /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/i,
95
            message:
96
              'Debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-'
97
          }
98
        }}
99
        error={errors.password?.message}
100
      />
101
 
102
      <CheckboxInput control={control} name='remember' label='Recuerdame' />
103
 
104
      <Controller
105
        name='captcha'
106
        rules={{ required: 'Este campo es requerido' }}
107
        control={control}
108
        render={({ field: { ref, onChange } }) => (
109
          <>
3264 stevensc 110
            <Captcha
111
              instanceRef={ref}
112
              onVerify={onChange}
113
              onExpired={onChange}
114
            />
3263 stevensc 115
            {errors.captcha && (
116
              <FormErrorFeedback>{errors.captcha.message}</FormErrorFeedback>
117
            )}
118
          </>
119
        )}
120
      />
121
 
122
      <Row>
123
        <Link to='/forgot-password'>¿Has olvidado tu contraseña?</Link>
124
        <Link to='/signup'>¿No tienes cuenta?</Link>
125
      </Row>
126
 
127
      <Button color='secondary' type='submit' disabled={!isValid}>
128
        Entrar
129
      </Button>
130
    </Form>
131
  )
132
}