[d6876d]: / src / components / Layout / Sidebar.tsx

Download this file

78 lines (70 with data), 1.8 kB

import React from 'react';
import {
  Drawer,
  List,
  ListItem,
  ListItemIcon,
  ListItemText,
  Divider,
  styled,
} from '@mui/material';
import {
  Science,
  Timeline,
  Biotech,
  Dashboard,
  CloudQueue,
  Settings,
} from '@mui/icons-material';
import { useNavigate } from 'react-router-dom';

const drawerWidth = 240;

const StyledDrawer = styled(Drawer)({
  width: drawerWidth,
  flexShrink: 0,
  '& .MuiDrawer-paper': {
    width: drawerWidth,
    boxSizing: 'border-box',
  },
});

interface SidebarProps {
  open: boolean;
  onClose: () => void;
}

const menuItems = [
  { text: 'Dashboard', icon: <Dashboard />, path: '/' },
  { text: 'Experiments', icon: <Science />, path: '/experiments' },
  { text: 'Gene Analysis', icon: <Biotech />, path: '/gene-analysis' },
  { text: 'Simulations', icon: <Timeline />, path: '/simulations' },
  { text: 'IoT Monitoring', icon: <CloudQueue />, path: '/monitoring' },
  { text: 'Settings', icon: <Settings />, path: '/settings' },
];

export const Sidebar: React.FC<SidebarProps> = ({ open, onClose }) => {
  const navigate = useNavigate();

  const handleNavigation = (path: string) => {
    navigate(path);
    onClose();
  };

  return (
    <StyledDrawer
      variant="temporary"
      anchor="left"
      open={open}
      onClose={onClose}
      ModalProps={{
        keepMounted: true, // Better mobile performance
      }}
    >
      <List>
        {menuItems.map((item) => (
          <React.Fragment key={item.text}>
            <ListItem onClick={() => handleNavigation(item.path)} sx={{ cursor: 'pointer' }}>
              <ListItemIcon>{item.icon}</ListItemIcon>
              <ListItemText primary={item.text} />
            </ListItem>
            {item.text === 'Dashboard' && <Divider />}
          </React.Fragment>
        ))}
      </List>
    </StyledDrawer>
  );
};