Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3694 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3694 stevensc 1
import React, { useEffect, useState } from 'react';
3701 stevensc 2
import { useNavigate } from 'react-router-dom';
3694 stevensc 3
import { useDispatch } from 'react-redux';
3701 stevensc 4
import {
5
  Avatar,
6
  styled,
7
  Typography,
8
  Menu,
9
  MenuItem,
10
  Divider,
11
  Box,
12
  ListSubheader
13
} from '@mui/material';
3694 stevensc 14
import ArrowDropDown from '@mui/icons-material/ArrowDropDown';
3201 stevensc 15
 
3694 stevensc 16
import { axios } from '@app/utils';
17
import { asyncLogout } from '@app/redux/auth/auth.actions';
18
import { addNotification } from '@app/redux/notification/notification.actions';
3201 stevensc 19
 
3701 stevensc 20
const NavItem = styled(Box)(({ theme }) => ({
3201 stevensc 21
  position: 'relative',
22
  display: 'flex',
23
  alignItems: 'center',
24
  padding: theme.spacing(1, 0),
3701 stevensc 25
  height: '100%',
26
  cursor: 'pointer'
3694 stevensc 27
}));
3201 stevensc 28
 
29
const UserOptions = ({
30
  image = '',
31
  name = '',
32
  adminUrl = '',
33
  impersonateUrl = '',
34
  defaultNetwork = 'y',
35
  knowledgeAuth,
36
  routeAdmin = '',
37
  routeImpersonate = ''
38
}) => {
3701 stevensc 39
  const [userImage, setUserImage] = useState('');
40
  const [anchorEl, setAnchorEl] = useState(null);
41
  const open = Boolean(anchorEl);
3694 stevensc 42
  const dispatch = useDispatch();
3701 stevensc 43
  const navigate = useNavigate();
3201 stevensc 44
 
3701 stevensc 45
  const handleClick = (event) => {
46
    setAnchorEl(event.currentTarget);
47
  };
3201 stevensc 48
 
3701 stevensc 49
  const handleClose = () => {
50
    setAnchorEl(null);
51
  };
52
 
3201 stevensc 53
  const checkUserImage = () => {
3694 stevensc 54
    const session_image = sessionStorage.getItem('user_session_image');
3701 stevensc 55
    if (session_image) {
56
      setUserImage(session_image);
57
      sessionStorage.removeItem('user_session_image');
58
    }
3694 stevensc 59
  };
3201 stevensc 60
 
3701 stevensc 61
  const handleGetAdminUrl = async () => {
62
    handleClose();
3201 stevensc 63
    try {
3694 stevensc 64
      const { data } = await axios.get(routeAdmin);
3701 stevensc 65
      if (data.success) {
66
        window.open(data.data);
67
      }
3201 stevensc 68
    } catch (error) {
3694 stevensc 69
      console.log('>>: error > ', error);
3701 stevensc 70
      dispatch(addNotification({ style: 'danger', msg: 'Error al obtener la URL de admin' }));
3201 stevensc 71
    }
3694 stevensc 72
  };
3201 stevensc 73
 
3701 stevensc 74
  const handleLogout = async () => {
75
    handleClose();
3267 stevensc 76
    try {
3694 stevensc 77
      await dispatch(asyncLogout());
78
      dispatch(addNotification({ style: 'success', msg: 'Ha finalizado su sesión' }));
3267 stevensc 79
    } catch (error) {
3694 stevensc 80
      dispatch(addNotification({ style: 'danger', msg: error.message }));
3267 stevensc 81
    }
3694 stevensc 82
  };
3201 stevensc 83
 
3701 stevensc 84
  const handleNavigate = (path) => {
85
    handleClose();
86
    navigate(path);
87
  };
88
 
3201 stevensc 89
  useEffect(() => {
3694 stevensc 90
    const timer = setInterval(checkUserImage, 2000);
3701 stevensc 91
    return () => clearInterval(timer);
3694 stevensc 92
  }, []);
3201 stevensc 93
 
94
  useEffect(() => {
3694 stevensc 95
    setUserImage(image);
96
  }, [image]);
3201 stevensc 97
 
98
  return (
3701 stevensc 99
    <li>
100
      <NavItem onClick={handleClick}>
3201 stevensc 101
        <Avatar src={userImage} alt={`${name} profile image`} />
102
        <ArrowDropDown sx={{ fontSize: '1rem' }} />
103
      </NavItem>
3701 stevensc 104
      <Menu
105
        anchorEl={anchorEl}
106
        open={open}
107
        onClose={handleClose}
108
        transformOrigin={{ horizontal: 'right', vertical: 'top' }}
109
        anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}
110
        MenuListProps={{
111
          'aria-labelledby': 'user-options-button'
112
        }}
113
      >
114
        <Box sx={{ padding: 2, display: 'flex', alignItems: 'center', gap: 1 }}>
115
          <Avatar src={userImage} alt={`${name} profile image`} />
116
          <Typography variant='h3' sx={{ fontSize: '1rem' }}>
117
            {name}
118
          </Typography>
119
        </Box>
120
        <Divider />
121
        {(adminUrl || impersonateUrl || knowledgeAuth) && [
122
          <ListSubheader key='admin-header'>Admin</ListSubheader>,
123
          adminUrl && (
124
            <MenuItem key='admin-url' onClick={handleGetAdminUrl}>
125
              Administración
126
            </MenuItem>
127
          ),
128
          impersonateUrl && (
129
            <MenuItem key='impersonate-url' onClick={() => handleNavigate(routeImpersonate)}>
130
              Personificar otro usuario
131
            </MenuItem>
132
          ),
133
          <Divider key='admin-divider' />
134
        ]}
135
        <ListSubheader>Cuenta</ListSubheader>
136
        <MenuItem onClick={() => handleNavigate('/account-settings')}>
137
          Configuración de la cuenta
138
        </MenuItem>
139
        <MenuItem onClick={() => handleNavigate('/abuse-report')}>Reportes</MenuItem>
140
        {defaultNetwork === 'y' && [
141
          <MenuItem key='privacy' onClick={() => handleNavigate('/privacy-policy')}>
142
            Política de privacidad
143
          </MenuItem>,
144
          <MenuItem key='cookies' onClick={() => handleNavigate('/cookies')}>
145
            Política de cookies
146
          </MenuItem>
147
        ]}
148
        <Divider />
149
        <MenuItem onClick={handleLogout}>Cerrar sesión</MenuItem>
150
      </Menu>
3201 stevensc 151
    </li>
3694 stevensc 152
  );
153
};
3201 stevensc 154
 
3694 stevensc 155
export default UserOptions;