Rev 2760 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { axios } from '../../../utils'import React, { useEffect, useState } from 'react'import { useForm } from 'react-hook-form'import { connect } from 'react-redux'import styled from 'styled-components'import { addNotification } from '../../../redux/notification/notification.actions'import FormErrorFeedback from '../../../shared/form-error-feedback/FormErrorFeedback'import Spinner from '../../../shared/loading-spinner/Spinner'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 ChangePassword = (props) => {// redux destructuringconst { addNotification } = propsconst {register,handleSubmit,getValues,errors,reset,formState: { isSubmitSuccessful }} = useForm()// statesconst [loading, setLoading] = useState(false)// Error password messageconst [isErrorPassword, setIsErrorPassword] = useState(false)const [isErrorConfirmation, setIsErrorConfirmation] = useState(false)const handleOnSubmit = async (data) => {setLoading(true)let errorPassword = falseconst validPassword = new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$')// se verifica si la clave cumple la expresion regularif (!validPassword.test(data.password)) {setIsErrorPassword(true)setTimeout(() => {setIsErrorPassword(false)}, 10000)setLoading(false)errorPassword = true}// se verifica si las dos claves son identicasif (data.password !== data.confirmation) {setIsErrorConfirmation(true)setTimeout(() => {setIsErrorConfirmation(false)}, 10000)setLoading(false)errorPassword = true}if (!errorPassword) {const formData = new FormData()Object.entries(data).map(([key, value]) => {formData.append(key, value)})await axios.post('/account-settings/password', formData).then((response) => {const resData = response.dataif (resData.success) {addNotification({style: 'success',msg: resData.data})} else {if (typeof resData.data === 'object') {resData.dataObject.entries(resData.data).map(([key, value]) => {setError(key, { type: 'manual', message: value[0] })})} else {const errorMessage =typeof resData.data === 'string'? resData.data: 'Ha ocurrido un error, Por favor intente mas tarde'addNotification({style: 'danger',msg: errorMessage})}}})setLoading(false)}errorPassword = false}useEffect(() => {reset({ ...getValues })}, [isSubmitSuccessful])return (<div className="settings-container"><h2>Cambiar clave</h2><div className="acc-setting_content"><form onSubmit={handleSubmit(handleOnSubmit)}><div className="d-flex flex-wrap" style={{ gap: '1rem' }}><div className="cp-field"><label htmlFor="password">Clave</label><div className="cpp-fiel"><inputtype="password"name="password"minLength="6"maxLength="16"id="password"ref={register({required: 'Por favor ingrese la contraseña'})}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 #?!@$^%*-"/><i className="fa fa-lock"></i></div>{isErrorPassword && (<p className="text-danger">Disculpe, La clave debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-</p>)}{<FormErrorFeedback>{errors?.password?.message}</FormErrorFeedback>}</div><div className="cp-field"><label htmlFor="confirmation">Confirmación</label><div className="cpp-fiel"><inputtype="password"name="confirmation"minLength="6"maxLength="16"id="confirmation"ref={register({required: 'Por favor ingrese la contraseña',validate: (value) =>value === getValues('password') ||'La contraseña no coincide'})}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 #?!@$^%*-"/><i className="fa fa-lock"></i></div>{isErrorConfirmation &&<p className="text-danger">Disculpe, las claves tienen que coincidir</p>}{<FormErrorFeedback>{errors?.confirmation?.message}</FormErrorFeedback>}</div></div><div className="pt-4 d-flex align-items-center justify-content-center"><button type="submit" className="btn btn-secondary">Guardar</button></div></form></div>{loading &&<StyledSpinnerContainer><Spinner /></StyledSpinnerContainer>}</div >)}const mapDispatchToProps = {addNotification: (notification) => addNotification(notification)}export default connect(null, mapDispatchToProps)(ChangePassword)