Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3401 | Rev 3405 | 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
 
3402 stevensc 35
  console.log(aes)
36
  console.log(jwt)
37
 
3263 stevensc 38
  const onSubmitHandler = handleSubmit(
3264 stevensc 39
    async ({ email, password, remember, captcha }) => {
3263 stevensc 40
      try {
41
        const response = await dispatch(
42
          asyncLogin({
43
            email: CryptoJSAesJson.encrypt(email, aes),
44
            password: CryptoJSAesJson.encrypt(password, aes),
3264 stevensc 45
            captcha,
3263 stevensc 46
            remember: remember ? 1 : 0
47
          })
48
        )
3396 stevensc 49
        window.localStorage.setItem('jwt', jwt)
50
        window.localStorage.setItem('aes', aes)
51
        window.localStorage.setItem('is_logged_in', true)
3263 stevensc 52
        reset()
53
 
54
        isMobile ? navigate('/apps-navigation') : navigate(response.redirect)
55
      } catch (error) {
56
        dispatch(addNotification({ style: 'danger', msg: error.message }))
57
      }
58
    }
59
  )
60
 
61
  return (
62
    <Form onSubmit={onSubmitHandler}>
63
      <LoadingWrapper loading={isSubmitting} displayChildren></LoadingWrapper>
64
 
65
      <Typography variant='h3'>Entrar</Typography>
66
 
67
      <Input
68
        type='email'
69
        name='email'
70
        icon={<Mail />}
71
        placeholder='Correo electrónico'
72
        rules={{
73
          required: 'Este campo es requerido',
74
          pattern: {
75
            value: /^[\w-.]+@([\w-]+\.)+[\w-]{2,}$/i,
76
            message: 'Debe ser una dirección de correo electrónico valida'
77
          },
78
          maxLength: {
79
            value: 64,
80
            message: 'Debe ser menor a 64 caracteres'
81
          }
82
        }}
83
        control={control}
84
        error={errors.email?.message}
85
      />
86
 
87
      <Input
88
        type='password'
89
        name='password'
90
        icon={<Lock />}
91
        placeholder='Clave'
92
        control={control}
93
        rules={{
94
          required: 'Este campo es requerido',
95
          pattern: {
96
            value:
97
              /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/i,
98
            message:
99
              'Debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-'
100
          }
101
        }}
102
        error={errors.password?.message}
103
      />
104
 
105
      <CheckboxInput control={control} name='remember' label='Recuerdame' />
106
 
107
      <Controller
108
        name='captcha'
109
        rules={{ required: 'Este campo es requerido' }}
110
        control={control}
111
        render={({ field: { ref, onChange } }) => (
112
          <>
3264 stevensc 113
            <Captcha
114
              instanceRef={ref}
115
              onVerify={onChange}
116
              onExpired={onChange}
117
            />
3263 stevensc 118
            {errors.captcha && (
119
              <FormErrorFeedback>{errors.captcha.message}</FormErrorFeedback>
120
            )}
121
          </>
122
        )}
123
      />
124
 
125
      <Row>
126
        <Link to='/forgot-password'>¿Has olvidado tu contraseña?</Link>
127
        <Link to='/signup'>¿No tienes cuenta?</Link>
128
      </Row>
129
 
130
      <Button color='secondary' type='submit' disabled={!isValid}>
131
        Entrar
132
      </Button>
133
    </Form>
134
  )
135
}