Source

pages/Dashboard/Shareholder/Shareholder.jsx

import React, { useEffect, useState } from "react";
import axios from "axios";
import "../Shareholder/shareholder.css";
import baseUrl from "../../../array/base/config";
import ShareholderEditForm from "./ShareholderEditForm";
import { useRef } from "react";
import { toast } from "react-toastify";
import TabGroup from "./TabGroup";

/**
 * Represents the Shareholder page component
 * @module Shareholder
 * @param userroles - The user roles
 * @return {JSX.Element}
 */
const Shareholder = ({ userroles }) => {
  /**
   * React state that holds the user data
   * @memberof module:Shareholder
   * @tyep {object}
   * @default {}
   * @name user
   */
  const [user, setUser] = useState({});
  /**
   * React state that holds the edit state
   * @memberof module:Shareholder
   * @tyep {boolean}
   * @default false
   * @name edit
   */
  const [edit, setEdit] = useState(false);
  /**
   * React state that holds the loading state
   * @memberof module:Shareholder
   * @tyep {boolean}
   * @default true
   * @name isLoading
   *
   */
  const [isLoading, setIsLoading] = useState(true);
  /**
   * React state that holds the file input
   * @memberof module:Shareholder
   * @tyep {object}
   * @default null
   * @name fileInput
   *
   */
  const [fileInput, setFileInput] = useState(null);
  /**
   * React useRef that holds the file input
   * @memberof module:Shareholder
   * @default null
   *
   * @type {React.MutableRefObject<null>}
   */
  const fileInputRef = useRef(null);
  const [refresh, setRefresh] = useState(true);

  // console.log("The user roles in shareholder", userroles);

  useEffect(() => {
    apicall();
  }, []);

  /**
   * Function that handles the image change
   * @memberof module:Shareholder
   * @name handleImageChange
   * @function handleImageChange
   * @param e {Event} Html event
   * @return {void}
   */
  const handleImageChange = (e) => {
    const selectedFile = e.target.files[0];
    setFileInput(selectedFile);
  };
  /**
   * Function that handles the submit
   * @memberof module:Shareholder
   * @name handleSubmit
   * @function handleSubmit
   * @async
   * @return {Promise<void>}
   */
  const handleSubmit = async () => {
    try {
      const detail = localStorage.getItem("token");
      const response = await axios({
        method: "patch",
        url: `${baseUrl}/api/shareholder/${user.id}/`,
        headers: {
          Authorization: `Token ${detail}`,
          "Content-Type": "multipart/form-data",
        },
        data: {
          photo: fileInput,
        },
      });
      console.log("Patch data success", response);
      setFileInput((prev) => !prev);
      toast.success("Your profile picture has been updated successfully!", {
        position: "top-right",
        autoClose: 5001,
        hideProgressBar: false,
        closeOnClick: true,
        pauseOnHover: true,
        draggable: true,
        progress: undefined,
        theme: "light",
      });
      apicall();
    } catch (err) {
      console.log("the patch error is ", err);
      toast.error(
        "Your profile picture could not be updated. Please try again.",
        {
          position: "top-right",
          autoClose: 5001,
          hideProgressBar: false,
          closeOnClick: true,
          pauseOnHover: true,
          draggable: true,
          progress: undefined,
          theme: "light",
        }
      );
    }
  };
  /**
   * Function that handles the api call for getting shareholder data
   * @memberof module:Shareholder
   * @name apicall
   * @function apicall
   * @async
   * @return {Promise<void>}
   *
   */
  const apicall = () => {
    const detail = localStorage.getItem("token");
    axios({
      method: "get",
      url: `${baseUrl}/api/shareholder/`,
      headers: {
        Authorization: `Token ${detail}`,
      },
    })
      .then((res) => {
        console.log("Received user data", res);
        setUser(res.data.data.results[0]);
        setIsLoading(false);
      })
      .catch((err) => console.log(err));
  };
  return (
    <div className="shareholder_container">
      <div className="shareholder_heading">
        <div className="shareholder_heading_row1"></div>
        <div className="shareholder_heading_row3">
          <img src={user?.photo} alt="" />
          {fileInput && <button onClick={handleSubmit}>upload</button>}
          <input
            type="file"
            accept="image/*"
            onChange={handleImageChange}
            ref={fileInputRef}
          />
          <div className="shareholder_text_div">
            <h3>
              <span>{user?.salutation}.</span>{" "}
              {user?.first_name + " " + user?.last_name}
            </h3>
            {!isLoading && (
              <p>
                {user?.shareholder_address[0]?.municipality?.name &&
                  ` ${user?.shareholder_address[0]?.municipality?.name},`}
                {user?.shareholder_address[0]?.district?.name &&
                  ` ${user?.shareholder_address[0]?.district?.name},`}
                {user?.shareholder_address[0]?.province?.name &&
                  ` ${user?.shareholder_address[0]?.province?.name}`}
              </p>
            )}
          </div>
        </div>
      </div>

      {user && (
        <TabGroup
          user={user}
          userroles={userroles}
          setEdit={setEdit}
          apicall={apicall}
          edit={edit}
        />
      )}
    </div>
  );
};

export default Shareholder;