Proyectos de Subversion LeadersLinked - SPA

Rev

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

import React from 'react';
import { useNavigate } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import {
  Box,
  Drawer as MuiDrawer,
  List,
  ListItem,
  ListItemButton,
  ListItemText,
  Accordion,
  AccordionSummary,
  AccordionDetails,
  Typography
} from '@mui/material';
import ExpandMore from '@mui/icons-material/ExpandMore';

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

export const Drawer = ({ show = false, items = [], onClose = () => {} }) => {
  return (
    <MuiDrawer anchor='right' open={show} onClose={onClose}>
      <Box role='presentation' onClick={onClose}>
        <List>
          {items.map((item) => (
            <ListItem key={item.href}>
              <RenderMenuItem item={item} onClose={onClose} />
            </ListItem>
          ))}
        </List>
      </Box>
    </MuiDrawer>
  );
};

const RenderMenuItem = ({ item, onClose }) => {
  if (item.childs && item.childs.length > 0) {
    return <AccordionItem item={item} onClose={onClose} />;
  }

  return <MenuDrawerItem item={item} onClose={onClose} />;
};

const MenuDrawerItem = ({ item: { label, href, ajax }, onClose }) => {
  const navigate = useNavigate();
  const dispatch = useDispatch();

  const asyncNavigate = async (url) => {
    try {
      const { data } = await axios.get(url);
      if (!data.success) throw new Error('Ha ocurrido un error. Por favor, intente nuevamente.');
      navigate(data.data);
    } catch (error) {
      dispatch(addNotification({ style: 'danger', msg: error.message }));
    }
  };

  const handleClick = (e) => {
    e.stopPropagation();
    onClose();

    if (ajax) {
      e.preventDefault();
      asyncNavigate(href);
    } else {
      navigate(href);
    }
  };

  return (
    <ListItemButton onClick={handleClick}>
      <ListItemText primary={label} />
    </ListItemButton>
  );
};

const AccordionItem = ({ item: { label, childs }, onClose }) => {
  const handleAccordionClick = (e) => {
    e.stopPropagation();
  };

  return (
    <Accordion>
      <AccordionSummary expandIcon={<ExpandMore />} onClick={handleAccordionClick}>
        <Typography>{label}</Typography>
      </AccordionSummary>

      <AccordionDetails>
        <List>
          {childs.map((child) => (
            <ListItem key={child.href}>
              <RenderMenuItem item={child} onClose={onClose} />
            </ListItem>
          ))}
        </List>
      </AccordionDetails>
    </Accordion>
  );
};

export default Drawer;