Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

import React from 'react'
import { useForm } from 'react-hook-form';
import Recaptcha from "react-recaptcha";
import { axios } from '../../../../utils';
import FormErrorFeedback from "../../../../shared/form-error-feedback/FormErrorFeedback";
import CryptoJSAesJson from '../../../../utils/crypto-js/cryptojs-aes-format';

export default (props) => {
    const {
        captchaKey,
        aes,
    } = props.backendVars;

    const {
        register,
        handleSubmit,
        errors,
        setError,
        clearErrors,
        getValues,
        setValue,
        watch
    } = useForm();

    // Recaptcha
    const reCaptchaToken = React.useRef("");
    const [isVerified, setIsVerified] = React.useState(false);
    const reCaptchaInstance = React.useRef();

    // states
    const [rememberChecked, setRememberChecked] = React.useState(false);
    const [isLoading, setIsLoading] = React.useState(false);
    const [isErrorConfirmation, setIsErrorConfirmation] = React.useState(false);
    // const [password, setPassword ] = React.useState('')
    // const [confirmation, setConfirmation] = React.useState('')

    const loginVerifyCallbackHandler = (response) => {
        reCaptchaToken.current = response;
        setIsVerified(true);
    };
    const loginExpiredCallbackHandler = () => {
        reCaptchaToken.current = "";
        setIsVerified(false);
    };
    const handleOnRecaptchaLoad = () => {
        reCaptchaToken.current = "";
    };

    const resetCaptcha = () => {
        reCaptchaInstance.current.reset();
    }
    React.useEffect(() => {
        resetCaptcha()
    }, []);

    const submit = (data, event) => {
        const formData = new FormData();
        Object.entries(data).map(([key, value]) => {
            if (key === "confirmation" && value)
                return formData.append(key, CryptoJSAesJson.encrypt(value, aes));
            if (key === "password" && value)
                return formData.append(key, CryptoJSAesJson.encrypt(value, aes));
        });
        formData.append("captcha", reCaptchaToken.current);
        axios.post(window.location.href, formData)
            .then(res => {
                if (res.data.success) {
                    window.location.href = "/"
                } else {
                    setError('password', {
                        type: "manual",
                        message: typeof res.data.data === 'string' ? res.data.data : res.data.data.confirmation[0],
                    });
                }
            }).catch(err => {
                ('>>: err > ', err)
            }).finally(() => {
                resetCaptcha()
            })
        formData.append("captcha", reCaptchaToken.current);
    }

    const validatePassword = (e) => {
        if (e.target.value !== watch('password')) {
            setIsErrorConfirmation(true)
        }
    }

    return (
        <div className="sign_in_sec current">
            <div className="row">
                <div className="col-lg-12">
                    <div className="login-sec">
                        <div className="sign_in_sec current" id="tab-1">
                            <h3>Reiniciar clave</h3>
                            <form
                                onSubmit={handleSubmit(submit)}
                            >
                                <div className="row">
                                    <div className="col-lg-12 no-pdd">
                                        <div className="inputContainer">
                                            <div className="sn-field">
                                                <input
                                                    type="password"
                                                    name="password"
                                                    ref={register({
                                                        required: "Este campo es requerido",
                                                    })}
                                                    pattern="^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$"
                                                    title="La clave debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-"
                                                    placeholder="Nueva clave"
                                                    maxLength="16"
                                                />
                                                <i className="la la-lock"></i>
                                            </div>
                                            {errors.password && (
                                                <FormErrorFeedback>{errors.password.message}</FormErrorFeedback>
                                            )}
                                        </div>
                                    </div>
                                    <div className="col-lg-12 no-pdd">
                                        <div className="inputContainer">
                                            <div className="sn-field">
                                                <input
                                                    type="password"
                                                    name="confirmation"
                                                    ref={register({
                                                        required: "Este campo es requerido",
                                                    })}
                                                    pattern="^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$"
                                                    title="La clave debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-"
                                                    placeholder="Repita nueva clave"
                                                    maxLength="16"
                                                    onChange={validatePassword}
                                                />
                                                <i className="la la-lock"></i>
                                            </div>
                                            {isErrorConfirmation && <FormErrorFeedback>Disculpe, las claves tienen que coincidir</FormErrorFeedback>}
                                        </div>
                                    </div>
                                    <div className="col-lg-12 no-pdd">
                                        <div className="sn-field">
                                            <Recaptcha
                                                sitekey={captchaKey}
                                                verifyCallback={loginVerifyCallbackHandler}
                                                verifyCallbackName="loginVerifyCallbackHandler"
                                                expiredCallback={loginExpiredCallbackHandler}
                                                expiredCallbackName="loginExpiredCallbackHandler"
                                                ref={reCaptchaInstance}
                                                render="explicit"
                                                onloadCallback={handleOnRecaptchaLoad}
                                                hl="es"
                                            />
                                        </div>
                                    </div>
                                    <div className="col-lg-12 no-pdd">
                                        <button type="submit" value="submit" id="btn-submit" disabled={!isVerified} >Guardar</button>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    )
}