Proyectos de Subversion LeadersLinked - SPA

Rev

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

import React, { useEffect, useState, useRef } from "react";
import { Link, useNavigate, useParams } from "react-router-dom";
import { useForm } from "react-hook-form";
import { useDispatch, useSelector } from "react-redux";
import { Button, Typography } from "@mui/material";
import { Lock } from "@mui/icons-material";
import Recaptcha from "react-recaptcha";

import { axios } from "@utils";
import CryptoJSAesJson from "@utils/crypto-js/cryptojs-aes-format";
import { addNotification } from "@store/notification/notification.actions";

import Form from "@components/common/form";
import Input from "@components/UI/inputs/Input";

const ResetPassword = () => {
  const [isVerified, setIsVerified] = useState(false);
  const reCaptchaToken = useRef("");
  const reCaptchaInstance = useRef();
  const dispatch = useDispatch();
  const navigate = useNavigate();
  const { uuid } = useParams();
  const { site_key, aes } = useSelector(({ auth }) => auth);

  const {
    control,
    handleSubmit,
    watch,
    formState: { errors },
  } = useForm({
    mode: "all",
  });

  const loginVerifyCallbackHandler = (response) => {
    reCaptchaToken.current = response;
    setIsVerified(true);
  };

  const loginExpiredCallbackHandler = () => {
    reCaptchaToken.current = "";
    setIsVerified(false);
  };

  const handleOnRecaptchaLoad = () => {
    reCaptchaToken.current = "";
  };

  const resetCaptcha = () => {
    reCaptchaInstance.current?.reset();
  };

  const resetPassword = handleSubmit(async (data) => {
    const formData = new FormData();

    Object.entries(data).map(([key, value]) =>
      (key === "confirmation" || key === "password") && value
        ? formData.append(key, CryptoJSAesJson.encrypt(value, aes))
        : formData.append(key, value)
    );

    formData.append("captcha", reCaptchaToken.current);

    try {
      const response = await axios.post(`/reset-password/${uuid}`, formData);
      const { data, success } = response.data;

      if (!success) {
        const errorMessage =
          typeof data === "string" ? data : data.confirmation[0];
        throw new Error(errorMessage);
      }

      dispatch(addNotification({ style: "success", msg: data }));
      navigate("/signin");
    } catch (error) {
      console.log(error);
      dispatch(addNotification({ style: "danger", msg: error.message }));
    } finally {
      loginExpiredCallbackHandler();
      resetCaptcha();
    }
  });

  useEffect(() => {
    resetCaptcha();
  }, []);

  return (
    <Form onSubmit={resetPassword}>
      <Typography variant="h3">Reiniciar clave</Typography>

      <Input
        type="password"
        name="password"
        icon={<Lock />}
        placeholder="Clave"
        error={errors.password?.message}
        control={control}
        rules={{
          required: "Este campo es requerido",
          pattern: {
            value:
              /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/i,
            message:
              "Debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-",
          },
        }}
      />

      <Input
        type="password"
        name="confirmation"
        icon={<Lock />}
        placeholder="Repita nueva clave"
        error={errors.confirmation?.message}
        control={control}
        rules={{
          required: "Este campo es requerido",
          validate: (v) =>
            v === watch("password") ||
            "Disculpe, las claves tienen que coincidir",
        }}
      />

      <Recaptcha
        sitekey={site_key}
        verifyCallback={loginVerifyCallbackHandler}
        verifyCallbackName="loginVerifyCallbackHandler"
        expiredCallback={loginExpiredCallbackHandler}
        expiredCallbackName="loginExpiredCallbackHandler"
        ref={reCaptchaInstance}
        render="explicit"
        onloadCallback={handleOnRecaptchaLoad}
        hl="es"
      />

      <div className="links">
        <Link to="/signin">Inicia sesión</Link>
        <Link to="/signup">¿No tienes cuenta?</Link>
      </div>

      <Button color="primary" type="submit" disabled={!isVerified}>
        Guardar
      </Button>
    </Form>
  );
};

export default ResetPassword;