Rev 3694 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import {
Avatar,
styled,
Typography,
Menu,
MenuItem,
Divider,
Box,
ListSubheader
} from '@mui/material';
import ArrowDropDown from '@mui/icons-material/ArrowDropDown';
import { axios } from '@app/utils';
import { asyncLogout } from '@app/redux/auth/auth.actions';
import { addNotification } from '@app/redux/notification/notification.actions';
const NavItem = styled(Box)(({ theme }) => ({
position: 'relative',
display: 'flex',
alignItems: 'center',
padding: theme.spacing(1, 0),
height: '100%',
cursor: 'pointer'
}));
const UserOptions = ({
image = '',
name = '',
adminUrl = '',
impersonateUrl = '',
defaultNetwork = 'y',
knowledgeAuth,
routeAdmin = '',
routeImpersonate = ''
}) => {
const [userImage, setUserImage] = useState('');
const [anchorEl, setAnchorEl] = useState(null);
const open = Boolean(anchorEl);
const dispatch = useDispatch();
const navigate = useNavigate();
const handleClick = (event) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
const checkUserImage = () => {
const session_image = sessionStorage.getItem('user_session_image');
if (session_image) {
setUserImage(session_image);
sessionStorage.removeItem('user_session_image');
}
};
const handleGetAdminUrl = async () => {
handleClose();
try {
const { data } = await axios.get(routeAdmin);
if (data.success) {
window.open(data.data);
}
} catch (error) {
console.log('>>: error > ', error);
dispatch(addNotification({ style: 'danger', msg: 'Error al obtener la URL de admin' }));
}
};
const handleLogout = async () => {
handleClose();
try {
await dispatch(asyncLogout());
dispatch(addNotification({ style: 'success', msg: 'Ha finalizado su sesión' }));
} catch (error) {
dispatch(addNotification({ style: 'danger', msg: error.message }));
}
};
const handleNavigate = (path) => {
handleClose();
navigate(path);
};
useEffect(() => {
const timer = setInterval(checkUserImage, 2000);
return () => clearInterval(timer);
}, []);
useEffect(() => {
setUserImage(image);
}, [image]);
return (
<li>
<NavItem onClick={handleClick}>
<Avatar src={userImage} alt={`${name} profile image`} />
<ArrowDropDown sx={{ fontSize: '1rem' }} />
</NavItem>
<Menu
anchorEl={anchorEl}
open={open}
onClose={handleClose}
transformOrigin={{ horizontal: 'right', vertical: 'top' }}
anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}
MenuListProps={{
'aria-labelledby': 'user-options-button'
}}
>
<Box sx={{ padding: 2, display: 'flex', alignItems: 'center', gap: 1 }}>
<Avatar src={userImage} alt={`${name} profile image`} />
<Typography variant='h3' sx={{ fontSize: '1rem' }}>
{name}
</Typography>
</Box>
<Divider />
{(adminUrl || impersonateUrl || knowledgeAuth) && [
<ListSubheader key='admin-header'>Admin</ListSubheader>,
adminUrl && (
<MenuItem key='admin-url' onClick={handleGetAdminUrl}>
Administración
</MenuItem>
),
impersonateUrl && (
<MenuItem key='impersonate-url' onClick={() => handleNavigate(routeImpersonate)}>
Personificar otro usuario
</MenuItem>
),
<Divider key='admin-divider' />
]}
<ListSubheader>Cuenta</ListSubheader>
<MenuItem onClick={() => handleNavigate('/account-settings')}>
Configuración de la cuenta
</MenuItem>
<MenuItem onClick={() => handleNavigate('/abuse-report')}>Reportes</MenuItem>
{defaultNetwork === 'y' && [
<MenuItem key='privacy' onClick={() => handleNavigate('/privacy-policy')}>
Política de privacidad
</MenuItem>,
<MenuItem key='cookies' onClick={() => handleNavigate('/cookies')}>
Política de cookies
</MenuItem>
]}
<Divider />
<MenuItem onClick={handleLogout}>Cerrar sesión</MenuItem>
</Menu>
</li>
);
};
export default UserOptions;