Proyectos de Subversion LeadersLinked - SPA

Rev

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
  };
}