Rev 662 | Rev 3683 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
/* eslint-disable react/prop-types */import React from "react";import { useRef, useState, useEffect } from "react";import { useForm } from "react-hook-form";import styled from "styled-components";import { axios } from "../../../../utils";import FormErrorFeedback from "../../../../shared/form-error-feedback/FormErrorFeedback";import Recaptcha from "react-recaptcha";import Spinner from "../../../../shared/loading-spinner/Spinner";import { Link } from 'react-router-dom'import CryptoJSAesJson from "../../../../utils/crypto-js/cryptojs-aes-format";const StyledCheck = styled.div`display: flex;flex-direction: column;justify-content: center;align-items: center;img {width: 100px;margin-bottom: 1rem;}p {text-align: center;}`;const StyledSpinnerContainer = styled.div`position: absolute;left: 0;top: 0;width: 100%;height: 100%;background: rgba(255, 255, 255, 0.4);display: flex;justify-content: center;align-items: center;z-index: 300;`;const ForgotPassword = ({ captchaKey, addNotification, aes }) => {// statesconst [forgotSent, setForgotSent] = useState(false);const [isLoading, setIsLoading] = useState(false);// recaptchaconst reCaptchaInstance = useRef();const reCaptchaToken = useRef("");const [isVerified, setIsVerified] = useState(false);// React Hook Formconst { register, handleSubmit, setError, errors } = useForm();useEffect(() => {reCaptchaInstance.current.reset();}, []);const forgotPasswordVerifyCallbackHandler = (response) => {if (response) {reCaptchaToken.current = response;setIsVerified(true);}};const forgotPasswordExpiredCallbackHandler = () => {reCaptchaToken.current = "";setIsVerified(false);};const onSubmitHandler = async (data) => {setIsLoading(true);const formData = new FormData();Object.entries(data).map(([key, value]) => {if (key === "email" && value)return formData.append(key, CryptoJSAesJson.encrypt(value, aes));formData.append(key, value);});formData.append("captcha", reCaptchaToken.current);await axios.post("/forgot-password", formData).then((response) => {const resData = response.data;if (resData.success) {// window.location.replace(resData.data);reCaptchaInstance.current.reset();forgotPasswordExpiredCallbackHandler();setForgotSent(true);} else {setIsLoading(false);const resError = resData.data;if (resError.constructor.name === "Object") {Object.entries(resError).map(([key, value]) => {if (key in getValues()) {setError(key, {type: "manual",message: Array.isArray(value) ? value[0] : value,});}});} else {addNotification({style: "danger",msg: resError,});}reCaptchaInstance.current.reset();loginExpiredCallbackHandler();}});setIsLoading(false);};const handleOnRecaptchaLoad = () => reCaptchaToken.current = ""if (forgotSent) {return (<StyledCheck><img src="/images/check.png" alt="check" /><p>El enlace de recuperación fue enviado a su correo electrónico</p><Link to="/signin"><button id="btn-submit" className="sign_in_sec_button">Entrar</button></Link></StyledCheck>);}return (<React.Fragment><h3>Olvide mi Clave</h3><form onSubmit={handleSubmit(onSubmitHandler)}><div className="row"><div className="col-lg-12 no-pdd"><div className="inputContainer"><div className="sn-field"><inputtype="email"name="email"placeholder="Correo electrónico"ref={register({required: "Este campo es requerido",pattern: {value: /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/i,message: "Debe ser una dirección de correo electrónico valida"}})}/><i className="la la-envelope" /></div>{errors.email && <FormErrorFeedback>{errors.email.message}</FormErrorFeedback>}</div></div><div className="col-lg-12 no-pdd"><div className="inputContainer"><div className="sn-field"><Recaptchasitekey={captchaKey}verifyCallback={forgotPasswordVerifyCallbackHandler}verifyCallbackName="forgotPasswordVerifyCallbackHandler"expiredCallback={forgotPasswordExpiredCallbackHandler}expiredCallbackName="forgotPasswordExpiredCallbackHandler"ref={reCaptchaInstance}render="explicit"onloadCallback={handleOnRecaptchaLoad}hl="es"/></div></div></div><div className="col-lg-12 no-pdd"><button type="submit" value="submit" disabled={!isVerified}>Nueva Clave</button></div></div></form>{isLoading &&<StyledSpinnerContainer><Spinner /></StyledSpinnerContainer>}</React.Fragment>);};export default ForgotPassword;