Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
2630 stevensc 1
import React, { useEffect, useState, useRef } from 'react'
2
import { Link, useNavigate, useParams } from 'react-router-dom'
3
import { useForm } from 'react-hook-form'
4
import { useDispatch, useSelector } from 'react-redux'
5
import { Lock } from '@mui/icons-material'
6
import Recaptcha from 'react-recaptcha'
7
 
2865 stevensc 8
import { axios } from '@utils'
9
import CryptoJSAesJson from '@utils/crypto-js/cryptojs-aes-format'
10
import { addNotification } from '@store/notification/notification.actions'
2630 stevensc 11
 
2865 stevensc 12
import Input from '@components/UI/inputs/Input'
2860 stevensc 13
import Button from '@components/UI/buttons/Buttons'
2865 stevensc 14
import AuthForm from '@components/auth/AuthForm'
2630 stevensc 15
 
16
const ResetPassword = () => {
17
  const [isVerified, setIsVerified] = useState(false)
18
  const reCaptchaToken = useRef('')
19
  const reCaptchaInstance = useRef()
20
  const dispatch = useDispatch()
21
  const navigate = useNavigate()
22
  const { uuid } = useParams()
23
  const { site_key, aes } = useSelector(({ auth }) => auth)
24
 
2802 stevensc 25
  const {
26
    control,
27
    handleSubmit,
28
    watch,
29
    formState: { errors }
30
  } = useForm({
2630 stevensc 31
    mode: 'all'
32
  })
33
 
34
  const loginVerifyCallbackHandler = (response) => {
35
    reCaptchaToken.current = response
36
    setIsVerified(true)
37
  }
38
 
39
  const loginExpiredCallbackHandler = () => {
40
    reCaptchaToken.current = ''
41
    setIsVerified(false)
42
  }
43
 
44
  const handleOnRecaptchaLoad = () => {
45
    reCaptchaToken.current = ''
46
  }
47
 
48
  const resetCaptcha = () => {
49
    reCaptchaInstance.current?.reset()
50
  }
51
 
52
  const resetPassword = handleSubmit(async (data) => {
53
    const formData = new FormData()
54
 
55
    Object.entries(data).map(([key, value]) =>
56
      (key === 'confirmation' || key === 'password') && value
57
        ? formData.append(key, CryptoJSAesJson.encrypt(value, aes))
58
        : formData.append(key, value)
59
    )
60
 
61
    formData.append('captcha', reCaptchaToken.current)
62
 
63
    try {
64
      const { data: response } = await axios.post(
65
        `/reset-password/${uuid}`,
66
        formData
67
      )
68
      const { data, success } = response
69
 
70
      if (!success) {
71
        const errorMessage =
72
          typeof data === 'string' ? data : data.confirmation[0]
73
        throw new Error(errorMessage)
74
      }
75
 
76
      dispatch(addNotification({ style: 'success', msg: data }))
77
      navigate('/signin')
78
    } catch (error) {
79
      console.log(error)
80
      dispatch(addNotification({ style: 'danger', msg: error.message }))
81
    } finally {
82
      loginExpiredCallbackHandler()
83
      resetCaptcha()
84
    }
85
  })
86
 
87
  useEffect(() => {
88
    resetCaptcha()
89
  }, [])
90
 
91
  return (
92
    <AuthForm onSubmit={resetPassword}>
93
      <h3>Reiniciar clave</h3>
94
 
95
      <Input
96
        type='password'
97
        name='password'
2865 stevensc 98
        icon={<Lock />}
2630 stevensc 99
        placeholder='Clave'
100
        error={errors.password?.message}
101
        control={control}
102
        rules={{
103
          required: 'Este campo es requerido',
104
          pattern: {
105
            value:
106
              /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/i,
107
            message:
108
              'Debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-'
109
          }
110
        }}
111
      />
112
 
113
      <Input
114
        type='password'
115
        name='confirmation'
2865 stevensc 116
        icon={<Lock />}
2630 stevensc 117
        placeholder='Repita nueva clave'
118
        error={errors.confirmation?.message}
119
        control={control}
120
        rules={{
121
          required: 'Este campo es requerido',
122
          validate: (v) =>
123
            v === watch('password') ||
124
            'Disculpe, las claves tienen que coincidir'
125
        }}
126
      />
127
 
128
      <Recaptcha
129
        sitekey={site_key}
130
        verifyCallback={loginVerifyCallbackHandler}
131
        verifyCallbackName='loginVerifyCallbackHandler'
132
        expiredCallback={loginExpiredCallbackHandler}
133
        expiredCallbackName='loginExpiredCallbackHandler'
134
        ref={reCaptchaInstance}
135
        render='explicit'
136
        onloadCallback={handleOnRecaptchaLoad}
137
        hl='es'
138
      />
139
 
140
      <div className='links'>
141
        <Link to='/signin'>Inicia sesión</Link>
142
        <Link to='/signup'>¿No tienes cuenta?</Link>
143
      </div>
144
 
3156 stevensc 145
      <Button color='secondary' type='submit' disabled={!isVerified}>
2630 stevensc 146
        Guardar
147
      </Button>
148
    </AuthForm>
149
  )
150
}
151
 
152
export default ResetPassword