Rev 645 | Rev 662 | 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 { Link, useHistory } 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 StyledContainer from "../widgets/WidgetLayout";
import ConfirmModal from "../modals/ConfirmModal";
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(StyledContainer)`
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
`;
const StyledHeader = styled.div`
align-items: center;
display: flex;
gap: 0.5rem;
justify-content: center;
position: relative;
padding: 10px 1rem;
`;
const StyledContent = styled.div`
display: flex;
flex-direction: column;
text-align: center;
ul {
align-items: center;
display: flex;
justify-content: center;
}
`;
const StyledAvatar = styled(Avatar)`
height: 60px;
width: 60px;
`;
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 = "Ver",
btnCancelTitle = "Borrar",
btnEditTitle = "Editar",
btnLeaveTitle = "Dejar",
isTopData,
}) => {
const [isShowConfirmation, setIsShowConfirmation] = useState(false);
const [loading, setLoading] = useState(false);
const confirmUrl = useRef("");
const labels = useSelector(({ intl }) => intl.labels);
const dispatch = useDispatch();
const history = useHistory();
const showConfirm = (url = "") => {
setIsShowConfirmation(true);
confirmUrl.current = url;
};
const closeConfirm = () => {
setIsShowConfirmation(false);
confirmUrl.current = "";
};
const getImpersonateUrl = async (url = "") => {
try {
const { data } = await axios.get(url);
if (data.success) window.location.href = data.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 = async () => {
try {
const { data } = await axios.get(link_admin);
if (data.success) window.open(data.data, "_backend");
} catch (error) {
console.log(">>: error > ", error);
}
};
const linksOptions = [
{
label: btnAcceptTitle || labels.accept,
url: link_view,
color: "primary",
},
{ label: btnEditTitle || labels.edit, url: link_edit, color: "secondary" },
{ label: labels.approve, url: link_approve, color: "tertiary" },
{ label: btnLeaveTitle, url: link_remove, color: "tertiary" },
{ label: labels.accept, url: link_accept, color: "secondary" },
{ label: labels.reject, url: link_reject, color: "tertiary" },
{
label: btnCancelTitle || labels.cancel,
url: link_delete,
color: "tertiary",
},
{
label: labels.message || "Mensaje",
url: link_inmail,
color: "secondary",
},
{ label: labels.administrate, url: link_admin, color: "secondary" },
{ label: labels.unfollow, url: link_unfollow, color: "tertiary" },
{ label: labels.block, url: link_block, color: "tertiary" },
{ label: labels.unblock, url: link_unblock, color: "tertiary" },
{ label: labels.connect, url: link_request, color: "tertiary" },
{ label: labels.cancel, url: link_cancel, color: "tertiary" },
{ label: btnLeaveTitle, url: link_leave, color: "tertiary" },
{ label: "Personificar", url: link_impersonate, color: "tertiary" },
];
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>
<Link
to={link_view}
data-link={link_view}
className="btn btn-primary"
>
{btnAcceptTitle}
</Link>
</li>
)}
{link_inmail && (
<li>
<Link
to={link_inmail}
data-link={link_inmail}
className="btn btn-tertiary"
>
{labels.message}
</Link>
</li>
)}
</ul>
)}
</StyledContent>
</StyledHeader>
<StyledItemContainer.Actions>
{linksOptions.map(({ label, url }) => {
const breakOptions = [link_view, link_edit, link_inmail];
if (!url) {
return null;
}
if (url === link_view && isTopData) {
return null;
}
if (url === link_inmail && isTopData) {
return null;
}
return (
<button
key={url}
onClick={() => {
if (url === link_unfollow) {
return handleUnfollow(url);
}
if (url === link_admin) {
return getManageUrl();
}
if (url === link_impersonate) {
return getImpersonateUrl(url);
}
if (!breakOptions.includes(url)) {
return showConfirm(url);
} else {
history.push(url);
}
}}
>
{label}
</button>
);
})}
</StyledItemContainer.Actions>
{loading && (
<StyledSpinnerContainer>
<Spinner />
</StyledSpinnerContainer>
)}
</StyledItemContainer>
<ConfirmModal
show={isShowConfirmation}
onClose={() => closeConfirm()}
onAccept={() => onConfirm(confirmUrl.current)}
/>
</>
);
};
export default ProfileItem;