Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3416 stevensc 1
import React, { useRef, useState, useEffect } from "react";
2
import { Link } from "react-router-dom";
3
import { useDispatch, useSelector } from "react-redux";
4
import { useForm } from "react-hook-form";
5
import { styled, Typography } from "@mui/material";
6
import { Mail } from "@mui/icons-material";
7
import Recaptcha from "react-recaptcha";
2630 stevensc 8
 
3416 stevensc 9
import { axios } from "@utils";
10
import { addNotification } from "@store/notification/notification.actions";
11
import CryptoJSAesJson from "@utils/crypto-js/cryptojs-aes-format";
2630 stevensc 12
 
3416 stevensc 13
import Form from "@components/common/form";
14
import Spinner from "@components/UI/Spinner";
15
import Input from "@components/UI/inputs/Input";
16
import Button from "@components/UI/buttons/Buttons";
2630 stevensc 17
 
3416 stevensc 18
const StyledCheck = styled("div")`
2630 stevensc 19
  display: flex;
20
  flex-direction: column;
21
  justify-content: center;
22
  align-items: center;
23
  img {
24
    width: 100px !important;
25
    margin-bottom: 1rem !important;
26
  }
27
  p {
28
    text-align: center;
29
  }
3416 stevensc 30
`;
2630 stevensc 31
 
32
const ForgotPassword = () => {
3416 stevensc 33
  const { site_key, aes } = useSelector(({ auth }) => auth);
34
  const [forgotSent, setForgotSent] = useState(false);
35
  const [loading, setloading] = useState(false);
36
  const [isVerified, setIsVerified] = useState(false);
37
  const reCaptchaInstance = useRef(null);
38
  const reCaptchaToken = useRef("");
39
  const dispatch = useDispatch();
2630 stevensc 40
 
2802 stevensc 41
  const {
42
    handleSubmit,
43
    control,
3416 stevensc 44
    formState: { errors },
45
  } = useForm({ mode: "all" });
2630 stevensc 46
 
47
  const forgotPasswordVerifyCallbackHandler = (response) => {
48
    if (response) {
3416 stevensc 49
      reCaptchaToken.current = response;
50
      setIsVerified(true);
2630 stevensc 51
    }
3416 stevensc 52
  };
2630 stevensc 53
 
54
  const forgotPasswordExpiredCallbackHandler = () => {
3416 stevensc 55
    reCaptchaToken.current = "";
56
    setIsVerified(false);
57
  };
2630 stevensc 58
 
59
  const handleOnRecaptchaLoad = () => {
3416 stevensc 60
    reCaptchaToken.current = "";
61
  };
2630 stevensc 62
 
63
  const loginExpiredCallbackHandler = () => {
3416 stevensc 64
    reCaptchaToken.current = "";
65
    setIsVerified(false);
66
  };
2630 stevensc 67
 
68
  const onSubmitHandler = handleSubmit(async ({ email }) => {
3416 stevensc 69
    setloading(true);
70
    const formData = new FormData();
2630 stevensc 71
 
3416 stevensc 72
    formData.append("email", CryptoJSAesJson.encrypt(email, aes));
73
    formData.append("captcha", reCaptchaToken.current);
2630 stevensc 74
 
75
    axios
3416 stevensc 76
      .post("/forgot-password", formData)
2630 stevensc 77
      .then(({ data: response }) => {
3416 stevensc 78
        const { success, data } = response;
2630 stevensc 79
 
80
        if (!success) {
3416 stevensc 81
          throw new Error(data);
2630 stevensc 82
        }
83
 
3416 stevensc 84
        reCaptchaInstance.current.reset();
85
        forgotPasswordExpiredCallbackHandler();
86
        loginExpiredCallbackHandler();
87
        setForgotSent(true);
2630 stevensc 88
      })
89
      .catch((err) => {
3416 stevensc 90
        console.log(`Error: ${err}`);
91
        dispatch(addNotification({ style: "danger", msg: err.message }));
2630 stevensc 92
      })
3416 stevensc 93
      .finally(() => setloading(false));
94
  });
2630 stevensc 95
 
96
  useEffect(() => {
3416 stevensc 97
    reCaptchaInstance.current?.reset();
98
  }, []);
2630 stevensc 99
 
100
  if (forgotSent) {
101
    return (
102
      <StyledCheck>
3416 stevensc 103
        <img src="/images/check.png" alt="check" />
2630 stevensc 104
 
105
        <p>El enlace de recuperación fue enviado a su correo electrónico</p>
106
 
3416 stevensc 107
        <Link to="/signin">
108
          <Button color="secondary" type="button">
2630 stevensc 109
            Volver a Iniciar Sesión
110
          </Button>
111
        </Link>
112
      </StyledCheck>
3416 stevensc 113
    );
2630 stevensc 114
  }
115
 
116
  return (
3190 stevensc 117
    <Form onSubmit={onSubmitHandler}>
3416 stevensc 118
      {loading && <Spinner absolute />}
2630 stevensc 119
 
3416 stevensc 120
      <Typography variant="h3">Olvide mi Clave</Typography>
3190 stevensc 121
 
2630 stevensc 122
      <Input
3416 stevensc 123
        type="email"
124
        name="email"
125
        placeholder="Correo electrónico"
3190 stevensc 126
        icon={<Mail />}
2630 stevensc 127
        control={control}
128
        rules={{
3416 stevensc 129
          required: "Este campo es requerido",
2630 stevensc 130
          pattern: {
3230 stevensc 131
            value: /^[\w-.]+@([\w-]+\.)+[\w-]{2,}$/i,
3416 stevensc 132
            message: "Debe ser una dirección de correo electrónico valida",
133
          },
2630 stevensc 134
        }}
135
        error={errors.email?.message}
136
      />
137
 
138
      <Recaptcha
139
        sitekey={site_key}
140
        verifyCallback={forgotPasswordVerifyCallbackHandler}
3416 stevensc 141
        verifyCallbackName="forgotPasswordVerifyCallbackHandler"
2630 stevensc 142
        expiredCallback={forgotPasswordExpiredCallbackHandler}
3416 stevensc 143
        expiredCallbackName="forgotPasswordExpiredCallbackHandler"
2630 stevensc 144
        ref={reCaptchaInstance}
3416 stevensc 145
        render="explicit"
2630 stevensc 146
        onloadCallback={handleOnRecaptchaLoad}
3416 stevensc 147
        hl="es"
2630 stevensc 148
      />
149
 
3416 stevensc 150
      <Button color="secondary" type="submit" disabled={!isVerified}>
2630 stevensc 151
        Nueva Clave
152
      </Button>
3190 stevensc 153
    </Form>
3416 stevensc 154
  );
155
};
2630 stevensc 156
 
3416 stevensc 157
export default ForgotPassword;