Source

pages/Dashboard/Profile/ChangePassword/ChangePassword.jsx

import { Button, Form, Input } from "antd";
import React from "react";
import { useUpdatePassword } from "../../../../apis/Login";

/**
 * Represents the ChangePassword  component
 * @module Profile/ChangePassword
 * @returns {JSX.Element} Returns a ChangePassword Jsx element
 */
const ChangePassword = () => {
  /**
   * React query hook that updates the password
   * @name useUpdatePassword
   * @type {Function}
   * @memberof module:Profile/ChangePassword
   */
  const { mutate: changeMutate, isLoading } = useUpdatePassword();
  /**
   * Handles the change password form submit
   * @function handleChangePassword
   * @param values {Object} Form values
   * @returns {void}
   */
  const handleChangePassword = (values) => {
    changeMutate({
      old_password: values.old_password,
      password: values.new_password,
      password2: values.confirm_password,
    });
  };
  /**
   * Function to validate password
   * @function validatePassword
   * @param rule {Object} Form rule
   * @param value {String} Form value
   * @param callback {Function} Form callback function
   * @return {Promise<never>|Promise<void>}
   */
  const validatePassword = (rule, value, callback) => {
    // Regular expression to check for at least one special character
    // Regular expression to check for at least one special character
    const specialCharRegex = /[!@#$%^&*()_+{}\[\]:;<>,.?~]/;
    // for Upper case characters
    const uppercaseLetters = /[A-Z]/;
    // for lower case characters
    const lowercaseLetters = /[a-z]/;
    const digitRegex = /[0-9]/;
    if (
      value &&
      value.length >= 8 &&
      specialCharRegex.test(value) &&
      uppercaseLetters.test(value) &&
      lowercaseLetters.test(value) &&
      digitRegex.test(value)
    ) {
      return Promise.resolve(); // Password is valid, call the callback with no arguments
    } else {
      return Promise.reject(
        new Error(
          "Password must be at least 8 characters long and contain at least one special character, uppercase letter, lowercase letter ond one  numeric digit"
        )
      );
    }
  };
  /**
   * Function to validate confirm password
   * @function validateConfirmPassword
   * @param getFieldValue {Function} Form getFieldValue function
   * @return {{validator(*, *): (Promise<void>)}}
   */
  const validateConfirmPassword = ({ getFieldValue }) => ({

    validator(_, value) {
      if (!value || getFieldValue("new_password") === value) {
        return Promise.resolve();
      }
      return Promise.reject(new Error("The two passwords does not match."));
    },
  });
  return (
    <div className="change_password_container">
      <Form layout="vertical" onFinish={handleChangePassword}>
        <Form.Item
          name="old_password"
          label="Old password"
          rules={[
            {
              required: true,
              message: "Please input your old password!",
            },
          ]}
        >
          <Input.Password />
        </Form.Item>
        <Form.Item
          name="new_password"
          label="New password"
          rules={[
            {
              required: true,
              message: "Please input your new password!",
            },
            {
              validator: validatePassword,
            },
          ]}
          hasFeedback
        >
          <Input.Password />
        </Form.Item>
        <Form.Item
          name="confirm_password"
          label="Confirm password"
          rules={[
            {
              required: true,
              message: "Please input your confirm password!",
            },
            validateConfirmPassword,
          ]}
        >
          <Input.Password />
        </Form.Item>
        <Button
          loading={isLoading}
          className="w-100 change_btn"
          htmlType="submit"
          type="primary"
        >
          Change Password
        </Button>
      </Form>
    </div>
  );
};

export default ChangePassword;