Proyectos de Subversion LeadersLinked - SPA

Rev

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

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