crane-cloud/frontend

View on GitHub
src/components/UserAccounts/index.js

Summary

Maintainability
A
1 hr
Test Coverage
F
37%
import React, { useEffect, useCallback, useState } from "react";
// import PropTypes from "prop-types";
// import { connect } from "react-redux";
import { Redirect, Link } from "react-router-dom";
import BlackInputText from "../BlackInputText";
import getUsersList from "../../redux/actions/users";
import addUserCredits from "../../redux/actions/addCredits";
import "./UserAccounts.css";
import Spinner from "../Spinner";
import Modal from "../Modal";
import { ReactComponent as Coin } from "../../assets/images/coin.svg";
import { ReactComponent as MoreIcon } from "../../assets/images/more-verticle.svg";
import PrimaryButton from "../PrimaryButton";
import addBetaUser from "../../redux/actions/addBetaUser";
import Feedback from "../Feedback";
import usePaginator from "../../hooks/usePaginator";
import Pagination from "../../components/Pagination";
import { useSelector, useDispatch } from "react-redux";
// import { useParams } from "react-router-dom";

const UserAccounts = () => {
  const [currentPage, handleChangePage] = usePaginator();

  const [actionsMenu, setActionsMenu] = useState(false);
  const [betaUserModal, setBetaUserModal] = useState(false);
  const [addCredits, setAddCredits] = useState(false);
  const [credits, setCredits] = useState("");
  const [creditDescription, setCreditDescription] = useState("");
  const [selectedUser, setSelectedUser] = useState("");
  // const [word, setWord] = useState("");

  // const [searchList, setSearchList] = useState([]);

  const { isFetching, users, isFetched, pagination } = useSelector(
    (state) => state.usersListReducer
  );
  const { isAdded, isAdding, isFailed, error } = useSelector(
    (state) => state.addBetaUserReducer
  );
  const { Added, Adding, Failed } = useSelector(
    (state) => state.addUserCreditsReducer
  );
  const dispatch = useDispatch();
  const gettingUsers = useCallback(
    (page, keyword = "") => dispatch(getUsersList(page, keyword)),
    [dispatch]
  );

  useEffect(() => {
    gettingUsers(currentPage);
  }, [gettingUsers, currentPage]);

  useEffect(() => {
    gettingUsers(currentPage);
    closeBetaUserModal();
    hideCreditsModal();
  }, [gettingUsers, isAdded, Added, currentPage]);

  // const searchThroughAccounts = (keyword) => {
  //   // use api
  //   handleChangePage(1);
  //   gettingUsers(1, keyword);
  // };

  // const handleCallbackSearchword = ({ target }) => {
  //   const { value } = target;
  //   setWord(value);
  //   if (value !== "") {
  //     searchThroughAccounts(value);
  //   }
  //   if (value === "") {
  //     // setSearchList([]);
  //     handleChangePage(1);
  //     gettingUsers(1);
  //   }
  // };

  const handleClick = (e) => {
    if (actionsMenu) {
      // this.closeModal();
      return;
    }
    setActionsMenu(true);
    e.stopPropagation();
    document.addEventListener("click", hideModal);
  };

  const hideModal = () => {
    setActionsMenu(false);
    document.removeEventListener("click", hideModal);
  };

  const showMenu = (id) => {
    setSelectedUser(id);
  };

  const showBetaUserModal = () => {
    setBetaUserModal(true);
  };
  const handleCreditSubmittion = () => {
    // const { addUserCredits } = this.props;
    if (credits !== "" && creditDescription !== "") {
      const creditsObject = {
        amount: credits,
        description: creditDescription,
        user_id: selectedUser,
      };
      dispatch(addUserCredits(creditsObject));
    }
  };
  const showCreditsModal = () => {
    setAddCredits(true);
  };
  const hideCreditsModal = () => {
    setAddCredits(false);
    setCredits("");
    setActionsMenu(false);
    setCreditDescription("");
    setSelectedUser("");
  };
  const closeBetaUserModal = () => {
    setBetaUserModal(false);
  };
  const handleBetaUserSubmit = () => {
    const betaUser = {
      is_beta_user: true,
      user_id: selectedUser,
    };
    dispatch(addBetaUser(betaUser));
  };
  const renderRedirect = () => {
    // const { isAdded } = this.props;
    if (isAdded) {
      return <Redirect to={`/accounts`} noThrow />;
    }
  };

  const handlePageChange = (currentPage) => {
    handleChangePage(currentPage);
    gettingUsers();
  };

  return (
    <div className="APage">
      {isAdded ? renderRedirect() : null}
      <div className="AMainSection">
        <div className="ContentSection">
          <div
            className={
              isFetching
                ? "ResourcesTable LoadingResourcesTable"
                : "ResourcesTable"
            }
          >
            <table className="UsersTable">
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Beta User</th>
                  <th>Credits</th>
                  <th>Email</th>
                  <th>Actions</th>
                </tr>
              </thead>
              {isFetching ? (
                <tbody>
                  <tr className="TableLoading">
                    <td className="TableTdSpinner">
                      <div className="SpinnerWrapper">
                        <Spinner size="big" />
                      </div>
                    </td>
                  </tr>
                </tbody>
              ) : (
                <tbody>
                  {isFetched &&
                    users !== undefined &&
                    users?.map((user) => (
                      <tr key={users.indexOf(user)}>
                        <td>{user?.name}</td>
                        <td>{user.is_beta_user ? "True" : "False"}</td>
                        <td>
                          {user?.credits.length === 0 ? (
                            "No credits"
                          ) : (
                            <div className="creditSection">
                              {user?.credits[0]?.amount}
                              <div className="creditCoin">
                                {" "}
                                <Coin title="credits" />
                              </div>
                            </div>
                          )}
                        </td>
                        <td>{user?.email}</td>
                        <td
                          onClick={(e) => {
                            showMenu(user.id);
                            handleClick(e);
                          }}
                        >
                          <MoreIcon />
                          {actionsMenu && user.id === selectedUser && (
                            <div className="BelowHeader bg-light">
                              <div className="context-menu">
                                <div
                                  className="DropDownLink"
                                  role="presentation"
                                  onClick={() => {
                                    showBetaUserModal();
                                  }}
                                >
                                  Add Beta User
                                </div>
                                <div
                                  className="DropDownLink"
                                  role="presentation"
                                  onClick={() => {
                                    showCreditsModal();
                                  }}
                                >
                                  Assign Credits
                                </div>
                                <div
                                  className="DropDownLink"
                                  role="presentation"
                                >
                                  <Link
                                    to={{
                                      pathname: `/accounts/${selectedUser}`,
                                    }}
                                  >
                                    View User Profile
                                  </Link>
                                </div>
                                <div
                                  className="DropDownLink"
                                  role="presentation"
                                >
                                  <Link
                                    to={{
                                      pathname: `/accounts/${selectedUser}/logs`,
                                    }}
                                  >
                                    View User Logs
                                  </Link>
                                </div>
                              </div>
                            </div>
                          )}
                        </td>
                      </tr>
                    ))}
                </tbody>
              )}
            </table>
            {isFetched && users.length === 0 && (
              <div className="AdminNoResourcesMessage">
                <p>No Users Available</p>
              </div>
            )}
            {!isFetching && !isFetched && (
              <div className="AdminNoResourcesMessage">
                <p>
                  Oops! Something went wrong! Failed to retrieve Available
                  Users.
                </p>
              </div>
            )}
          </div>
          {pagination?.pages > 1 && (
            <div className="AdminPaginationSection">
              <Pagination
                total={pagination.pages}
                current={currentPage}
                onPageChange={handlePageChange}
              />
            </div>
          )}
        </div>
        <Modal showModal={addCredits} onClickAway={() => hideCreditsModal()}>
          <div className="ModalHeader">
            <h5 className="ModalTitle">Add Credits</h5>

            <div className="">Number of credits</div>
            <div className="ModalContent">
              <BlackInputText
                required
                placeholder="Number of credits"
                name="credits"
                type="number"
                value={credits}
                onChange={(e) => {
                  setCredits(e.target.value);
                }}
              />
            </div>
            <div className="CreditsTitle">Description</div>
            <textarea
              className="TextArea"
              type="text"
              placeholder="Credits description"
              rows="4"
              cols="50"
              name="creditDescription"
              value={creditDescription}
              onChange={(e) => {
                setCreditDescription(e.target.value);
              }}
            />
          </div>
          <div className="ModalFooter">
            <div className="ModalButtons">
              <PrimaryButton
                className="CancelBtn"
                onClick={() => hideCreditsModal()}
              >
                Cancel
              </PrimaryButton>

              <PrimaryButton
                type="button"
                onClick={() => handleCreditSubmittion()}
              >
                {Adding ? <Spinner /> : "Add"}
              </PrimaryButton>
            </div>
            {Failed && (
              <Feedback message={"failed to add credits"} type={"error"} />
            )}
          </div>
        </Modal>
        <Modal showModal={betaUserModal} onClickAway={closeBetaUserModal}>
          <div class="modal-content">
            <div class="modal-header">
              <h5 class="modal-title BetaUserText" id="exampleModalLongTitle">
                Add user as Beta user?
              </h5>
            </div>
            <div class="modal-footer BetaUser">
              <PrimaryButton
                type="button"
                className="CancelBtn"
                onClick={() => {
                  closeBetaUserModal();
                }}
              >
                Cancel
              </PrimaryButton>
              <PrimaryButton
                type="button"
                onClick={() => {
                  handleBetaUserSubmit();
                }}
              >
                {isAdding ? <Spinner /> : "Confirm"}
              </PrimaryButton>
            </div>
            {isFailed && (
              <Feedback message={error !== "" ? error : null} type={"error"} />
            )}
          </div>
        </Modal>
      </div>
    </div>
  );
};

export default UserAccounts;