Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3432 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";
7
import Recaptcha from "react-recaptcha";
2630 stevensc 8
 
3432 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
 
3432 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);
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);
2630 stevensc 24
 
2802 stevensc 25
  const {
26
    control,
27
    handleSubmit,
28
    watch,
3432 stevensc 29
    formState: { errors },
2802 stevensc 30
  } = useForm({
3432 stevensc 31
    mode: "all",
32
  });
2630 stevensc 33
 
34
  const loginVerifyCallbackHandler = (response) => {
3432 stevensc 35
    reCaptchaToken.current = response;
36
    setIsVerified(true);
37
  };
2630 stevensc 38
 
39
  const loginExpiredCallbackHandler = () => {
3432 stevensc 40
    reCaptchaToken.current = "";
41
    setIsVerified(false);
42
  };
2630 stevensc 43
 
44
  const handleOnRecaptchaLoad = () => {
3432 stevensc 45
    reCaptchaToken.current = "";
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]) =>
3432 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
 
3432 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) {
68
        const errorMessage =
3432 stevensc 69
          typeof data === "string" ? data : data.confirmation[0];
70
        throw new Error(errorMessage);
2630 stevensc 71
      }
72
 
3432 stevensc 73
      dispatch(addNotification({ style: "success", msg: data }));
74
      navigate("/signin");
2630 stevensc 75
    } catch (error) {
3432 stevensc 76
      console.log(error);
77
      dispatch(addNotification({ style: "danger", msg: error.message }));
2630 stevensc 78
    } finally {
3432 stevensc 79
      loginExpiredCallbackHandler();
80
      resetCaptcha();
2630 stevensc 81
    }
3432 stevensc 82
  });
2630 stevensc 83
 
84
  useEffect(() => {
3432 stevensc 85
    resetCaptcha();
86
  }, []);
2630 stevensc 87
 
88
  return (
3199 stevensc 89
    <Form onSubmit={resetPassword}>
3432 stevensc 90
      <Typography variant="h3">Reiniciar clave</Typography>
2630 stevensc 91
 
92
      <Input
3432 stevensc 93
        type="password"
94
        name="password"
2865 stevensc 95
        icon={<Lock />}
3432 stevensc 96
        placeholder="Clave"
2630 stevensc 97
        error={errors.password?.message}
98
        control={control}
99
        rules={{
3432 stevensc 100
          required: "Este campo es requerido",
2630 stevensc 101
          pattern: {
102
            value:
103
              /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/i,
104
            message:
3432 stevensc 105
              "Debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-",
106
          },
2630 stevensc 107
        }}
108
      />
109
 
110
      <Input
3432 stevensc 111
        type="password"
112
        name="confirmation"
2865 stevensc 113
        icon={<Lock />}
3432 stevensc 114
        placeholder="Repita nueva clave"
2630 stevensc 115
        error={errors.confirmation?.message}
116
        control={control}
117
        rules={{
3432 stevensc 118
          required: "Este campo es requerido",
2630 stevensc 119
          validate: (v) =>
3432 stevensc 120
            v === watch("password") ||
121
            "Disculpe, las claves tienen que coincidir",
2630 stevensc 122
        }}
123
      />
124
 
125
      <Recaptcha
126
        sitekey={site_key}
127
        verifyCallback={loginVerifyCallbackHandler}
3432 stevensc 128
        verifyCallbackName="loginVerifyCallbackHandler"
2630 stevensc 129
        expiredCallback={loginExpiredCallbackHandler}
3432 stevensc 130
        expiredCallbackName="loginExpiredCallbackHandler"
2630 stevensc 131
        ref={reCaptchaInstance}
3432 stevensc 132
        render="explicit"
2630 stevensc 133
        onloadCallback={handleOnRecaptchaLoad}
3432 stevensc 134
        hl="es"
2630 stevensc 135
      />
136
 
3432 stevensc 137
      <div className="links">
138
        <Link to="/signin">Inicia sesión</Link>
139
        <Link to="/signup">¿No tienes cuenta?</Link>
2630 stevensc 140
      </div>
141
 
3432 stevensc 142
      <Button color="primary" type="submit" disabled={!isVerified}>
2630 stevensc 143
        Guardar
144
      </Button>
3199 stevensc 145
    </Form>
3432 stevensc 146
  );
147
};
2630 stevensc 148
 
3432 stevensc 149
export default ResetPassword;