Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3701 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import { Avatar, styled, Typography } from '@mui/material';
import ArrowDropDown from '@mui/icons-material/ArrowDropDown';

import { useOutsideClick } from '@hooks';

import { axios } from '@app/utils';
import { asyncLogout } from '@app/redux/auth/auth.actions';
import { addNotification } from '@app/redux/notification/notification.actions';

const NavItem = styled(Link)(({ theme }) => ({
  position: 'relative',
  display: 'flex',
  alignItems: 'center',
  padding: theme.spacing(1, 0),
  height: '100%'
}));

const UserOptions = ({
  image = '',
  name = '',
  adminUrl = '',
  impersonateUrl = '',
  defaultNetwork = 'y',
  knowledgeAuth,
  routeAdmin = '',
  routeImpersonate = ''
}) => {
  const [userImage, setUserImage] = useState(
    '/storage/type/user/code/f3df3718-37d9-4e4d-bd84-71f7924a858d/'
  );
  const [displayOptions, setDisplayOptions] = useState(false);
  const dispatch = useDispatch();

  const [userDropdownContainer] = useOutsideClick(() => setDisplayOptions(false));

  const checkUserImage = () => {
    const session_image = sessionStorage.getItem('user_session_image');
    if (!session_image) return;
    setUserImage(session_image);
    sessionStorage.removeItem('user_session_image');
  };

  const handleDisplay = async (e) => {
    e.preventDefault();
    setDisplayOptions(!displayOptions);
  };

  const getAdminUrl = async (e) => {
    e.preventDefault();
    try {
      const { data } = await axios.get(routeAdmin);
      if (data.success) return window.open(data.data);
    } catch (error) {
      console.log('>>: error > ', error);
    }
  };

  const handleLogout = async (e) => {
    e.preventDefault();
    try {
      await dispatch(asyncLogout());
      dispatch(addNotification({ style: 'success', msg: 'Ha finalizado su sesión' }));
    } catch (error) {
      dispatch(addNotification({ style: 'danger', msg: error.message }));
    }
  };

  useEffect(() => {
    const timer = setInterval(checkUserImage, 2000);

    return () => {
      clearInterval(timer);
    };
  }, []);

  useEffect(() => {
    setUserImage(image);
  }, [image]);

  return (
    <li ref={userDropdownContainer}>
      <NavItem to='/' onClick={handleDisplay}>
        <Avatar src={userImage} alt={`${name} profile image`} />

        <ArrowDropDown sx={{ fontSize: '1rem' }} />
      </NavItem>

      <div className={`user__options-dropdown ${displayOptions ? 'fadeIn' : 'fadeOut'}`}>
        <div className='user__options-description'>
          <div className='user__options-info'>
            <Avatar src={userImage} alt={`${name} profile image`} />
            <Typography variant='h3'>{name}</Typography>
          </div>
        </div>
        {(adminUrl || impersonateUrl || knowledgeAuth) && (
          <div className='user__options-item'>
            <Typography variant='h3'>Admin</Typography>
            <ul>
              {adminUrl && (
                <li>
                  <Link to='/admin' onClick={getAdminUrl}>
                    Administración
                  </Link>
                </li>
              )}
              {impersonateUrl && (
                <li>
                  <Link to={routeImpersonate}>Personificar otro usuario</Link>
                </li>
              )}
            </ul>
          </div>
        )}
        <div className='user__options-item'>
          <Typography variant='h3'>Cuenta</Typography>
          <ul>
            <li>
              <Link to='/account-settings'>Configuración de la cuenta</Link>
            </li>
            <li>
              <Link to='/abuse-report'>Reportes</Link>
            </li>
            {defaultNetwork === 'y' && (
              <>
                <li>
                  <Link to='/privacy-policy'>Política de privacidad</Link>
                </li>
                <li>
                  <Link to='/cookies'>Política de cookies</Link>
                </li>
              </>
            )}
          </ul>
        </div>
        <div className='user__options-item'>
          <ul>
            <li className='logOutContainer'>
              <Link className='logOutContainer__a' to='/signout' onClick={handleLogout}>
                Cerrar sesión
              </Link>
            </li>
          </ul>
        </div>
      </div>
    </li>
  );
};

export default UserOptions;