Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3156 | Rev 3677 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useRef, useState } from "react";
import { axios } from "../../utils";
import { Avatar } from "@mui/material";
import { useNavigate } from "react-router-dom";
import { addNotification } from "store/notification/notification.actions";
import { useDispatch, useSelector } from "react-redux";
import styled from "styled-components";

import Spinner from "../UI/Spinner";
import WidgetWrapper from "../widgets/WidgetLayout";
import ConfirmModal from "../modals/ConfirmModal";
import Button from "../UI/buttons/Buttons";

const StyledSpinnerContainer = styled.div`
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: rgba(255, 255, 255, 0.4);
  place-items: center;
  z-index: 50;
`;

const StyledItemContainer = styled(WidgetWrapper)`
  display: flex;
  flex-direction: column;
  justify-content: center;
  height: fit-content;
  border-radius: 5px;
`;

const StyledHeader = styled.div`
  align-items: center;
  display: flex;
  gap: 0.5rem;
  justify-content: flex-start;
  position: relative;
  padding: 0.5rem;
`;

const StyledContent = styled.div`
  display: flex;
  flex-direction: column;
  text-align: center;
  ul {
    align-items: center;
    display: flex;
    justify-content: center;
    gap: 0.5rem;
  }
`;

const Actions = styled.div`
  display: flex;
  flex-wrap: wrap;
  justify-content: space-around;
  border-top: 1px solid rgb(211, 211, 211);
  padding: 0.5rem;
  gap: 0.5rem;
`;

const StyledAvatar = styled(Avatar)`
  height: 60px !important;
  width: 60px !important;
`;

const ProfileItem = ({
  image,
  name,
  email,
  network,
  status,
  fetchCallback,
  link_remove,
  link_view,
  link_edit,
  link_delete,
  link_cancel,
  link_block,
  link_reject,
  link_accept,
  link_inmail,
  link_request,
  link_unblock,
  link_unfollow,
  link_approve,
  link_leave,
  link_admin,
  link_impersonate,
  btnAcceptTitle,
  btnCancelTitle,
  btnEditTitle,
  btnLeaveTitle,
  btnRemoveLabel,
  isTopData,
}) => {
  const [isShowConfirmation, setIsShowConfirmation] = useState(false);
  const [loading, setLoading] = useState(false);
  const confirmUrl = useRef("");
  const labels = useSelector(({ intl }) => intl.labels);
  const dispatch = useDispatch();
  const navigate = useNavigate();

  const showConfirm = (url = "") => {
    setIsShowConfirmation(true);
    confirmUrl.current = url;
  };

  const closeConfirm = () => {
    setIsShowConfirmation(false);
    confirmUrl.current = "";
  };

  const getImpersonateUrl = async (url = "") => {
    try {
      const response = await axios.get(url);
      const { data, success } = response.data;

      if (success) {
        window.location.href = data;
      }
    } catch (error) {
      console.log(">>: error > ", error);
    }
  };

  const onConfirm = (url) => {
    setLoading(true);
    axios
      .post(url)
      .then((response) => {
        const { success, data } = response.data;

        if (!success) {
          const errorMessage =
            typeof data === "string"
              ? data
              : "Error interno. Por favor, inténtelo de nuevo más tarde.";

          dispatch(addNotification({ style: "danger", msg: errorMessage }));
          return;
        }

        if (fetchCallback) fetchCallback();
        dispatch(addNotification({ style: "success", msg: data }));
      })
      .catch(() => {
        dispatch(
          addNotification({
            style: "error",
            msg: "Error interno. Por favor, inténtelo de nuevo más tarde.",
          })
        );
      })
      .finally(() => {
        confirmUrl.current = "";
        setLoading(false);
      });
  };

  const handleUnfollow = (link_unfollow) => {
    setLoading(true);
    axios
      .post(link_unfollow)
      .then((response) => {
        const { data, success } = response.data;

        if (!success) {
          const errorMessage =
            typeof data === "string"
              ? data
              : "Error interno. Por favor, inténtelo de nuevo más tarde.";

          dispatch(addNotification({ style: "danger", msg: errorMessage }));
          return;
        }

        if (fetchCallback) fetchCallback();
        dispatch(addNotification({ style: "success", msg: data }));
      })
      .finally(() => setLoading(false));
  };

  const getManageUrl = () => {
    axios
      .get(link_admin)
      .then((response) => {
        const { data, success } = response.data;

        if (!success) {
          throw new Error(data);
        }

        setTimeout(() => {
          window.open(data, "_backend");
        }, 0);
      })
      .catch((error) => {
        console.log(">>: error > ", error);
      });
  };

  const navigateTo = (url) => {
    navigate(url);
  };

  return (
    <>
      <StyledItemContainer>
        <StyledHeader>
          {image && <StyledAvatar src={image} alt={`${name} image`} />}
          <StyledContent>
            <h2>{name}</h2>
            {isTopData && email && <h4>{email}</h4>}
            {network && <span>{network}</span>}
            {status && <span>{status}</span>}
            {isTopData && (
              <ul>
                {link_view && (
                  <li>
                    <Button
                      color="primary"
                      onClick={() => navigateTo(link_view)}
                    >
                      {btnAcceptTitle || labels.view_profile}
                    </Button>
                  </li>
                )}
                {link_inmail && (
                  <li>
                    <Button
                      color="secondary"
                      onClick={() => navigateTo(link_inmail)}
                    >
                      {labels.message}
                    </Button>
                  </li>
                )}
              </ul>
            )}
          </StyledContent>
        </StyledHeader>
        <Actions>
          {link_view && !isTopData ? (
            <Button color="primary" onClick={() => navigateTo(link_view)}>
              {btnAcceptTitle || labels.view_profile}
            </Button>
          ) : null}

          {link_edit ? (
            <Button onClick={() => navigateTo(link_edit)} color="secondary">
              {btnEditTitle || labels.edit}
            </Button>
          ) : null}

          {link_accept ? (
            <Button onClick={() => onConfirm(link_accept)} color="secondary">
              {labels.accept}
            </Button>
          ) : null}

          {link_inmail && !isTopData ? (
            <Button color="secondary" onClick={() => navigateTo(link_inmail)}>
              {labels.message}
            </Button>
          ) : null}

          {link_admin ? (
            <Button color="secondary" onClick={() => getManageUrl(link_admin)}>
              {labels.administrate}
            </Button>
          ) : null}

          {link_approve ? (
            <Button color="secondary" onClick={() => onConfirm(link_approve)}>
              {labels.approve}
            </Button>
          ) : null}

          {link_unblock ? (
            <Button color="secondary" onClick={() => onConfirm(link_unblock)}>
              {labels.unblock}
            </Button>
          ) : null}

          {link_request ? (
            <Button color="secondary" onClick={() => onConfirm(link_request)}>
              {labels.connect}
            </Button>
          ) : null}

          {link_impersonate ? (
            <Button
              color="secondary"
              onClick={() => getImpersonateUrl(link_impersonate)}
            >
              Personificar
            </Button>
          ) : null}

          {link_remove ? (
            <Button color="info" onClick={() => showConfirm(link_remove)}>
              {btnRemoveLabel}
            </Button>
          ) : null}

          {link_reject ? (
            <Button color="info" onClick={() => showConfirm(link_reject)}>
              {labels.reject}
            </Button>
          ) : null}

          {link_delete ? (
            <Button color="info" onClick={() => showConfirm(link_delete)}>
              {btnCancelTitle || labels.cancel}
            </Button>
          ) : null}

          {link_unfollow ? (
            <Button color="info" onClick={() => handleUnfollow(link_unfollow)}>
              {labels.unfollow}
            </Button>
          ) : null}

          {link_block ? (
            <Button color="info" onClick={() => showConfirm(link_block)}>
              {labels.block}
            </Button>
          ) : null}

          {link_cancel ? (
            <Button color="info" onClick={() => showConfirm(link_cancel)}>
              {labels.cancel}
            </Button>
          ) : null}

          {link_leave ? (
            <Button color="info" onClick={() => showConfirm(link_leave)}>
              {btnLeaveTitle || labels.group_leave}
            </Button>
          ) : null}
        </Actions>
        {loading && (
          <StyledSpinnerContainer>
            <Spinner />
          </StyledSpinnerContainer>
        )}
      </StyledItemContainer>
      <ConfirmModal
        show={isShowConfirmation}
        onClose={() => closeConfirm()}
        onAccept={() => onConfirm(confirmUrl.current)}
      />
    </>
  );
};

export default ProfileItem;