Autoría | Ultima modificación | Ver Log |
import { useState } from 'react';
import { useApi, useAlert } from '@shared/hooks';
import { changePassword } from '@account-settings/services';
export function usePasswordChange() {
const { showSuccess, showError } = useAlert();
const [passwordErrors, setPasswordErrors] = useState({
isErrorPassword: false,
isErrorConfirmation: false
});
const { loading: isUpdating, execute: executeUpdate } = useApi(changePassword, {
onSuccess: (response) => {
if (response.success) {
showSuccess(response.data);
clearErrors();
} else {
if (typeof response.data === 'string') {
showError(response.data);
} else {
Object.entries(response.data).forEach(([key, value]) => {
showError(`${key}: ${value}`);
});
}
}
},
onError: (error) => {
showError(error.message || 'Error al cambiar la contraseña');
}
});
const clearErrors = () => {
setPasswordErrors({
isErrorPassword: false,
isErrorConfirmation: false
});
};
const setPasswordError = () => {
setPasswordErrors((prev) => ({ ...prev, isErrorPassword: true }));
setTimeout(() => {
setPasswordErrors((prev) => ({ ...prev, isErrorPassword: false }));
}, 10000);
};
const setConfirmationError = () => {
setPasswordErrors((prev) => ({ ...prev, isErrorConfirmation: true }));
setTimeout(() => {
setPasswordErrors((prev) => ({ ...prev, isErrorConfirmation: false }));
}, 10000);
};
const validateAndChangePassword = async (data) => {
clearErrors();
const validPassword = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/;
if (!validPassword.test(data.password)) {
setPasswordError();
showError(
'La contraseña debe tener entre 6 y 16 caracteres, al menos una mayúscula, una minúscula, un número y un carácter especial'
);
return;
}
if (data.password !== data.confirm_password) {
setConfirmationError();
showError('Las contraseñas no coinciden');
return;
}
await executeUpdate(data);
};
return {
isUpdating,
passwordErrors,
validateAndChangePassword,
clearErrors
};
}