Skip to content

Mui:Drawer

서랍장 사이드 패널 만들 수 있다.

Example

import React from 'react';
import Box from '@mui/material/Box';
import TopBar from './components/TopBar';
import AppBar from '@mui/material/AppBar';
import CssBaseline from '@mui/material/CssBaseline';
import {useNavigate, Outlet} from 'react-router-dom';
import {paths} from './routes/router';
import {useSelector} from 'react-redux';
import {selectWork} from './stores/apis/work';
import './App.css';

import Avatar from '@mui/material/Avatar';
import Drawer from '@mui/material/Drawer';
import Toolbar from '@mui/material/Toolbar';
import List from '@mui/material/List';
import Divider from '@mui/material/Divider';
import ListItem from '@mui/material/ListItem';
import ListItemButton from '@mui/material/ListItemButton';
import ListItemIcon from '@mui/material/ListItemIcon';
import ListItemAvatar from '@mui/material/ListItemAvatar';
import ListItemText from '@mui/material/ListItemText';
import ShowChartIcon from '@mui/icons-material/ShowChart';
import ImageIcon from '@mui/icons-material/Image';
import LocalShippingIcon from '@mui/icons-material/LocalShipping';

const ToolbarSpace = () => {
  return <Toolbar variant="dense" />;
};

function App() {
  const navigate = useNavigate();
  const work = useSelector(selectWork);
  const workId = work.index;

  const onInformation = () => {
    // EMPTY.
  };

  const onDashboard = () => {
    navigate(paths.charging);
  };

  const onPreview = () => {
    // EMPTY.
  };

  const onStatistic = () => {
    // EMPTY.
  };

  const onCharging = () => {
    navigate(paths.charging);
  };

  const onAdmin = () => {
    // EMPTY.
  };

  const drawerWidth = 240;
  const drawer = (
    <Drawer
      variant="permanent"
      sx={{
        width: drawerWidth,
        flexShrink: 0,
        [`& .MuiDrawer-paper`]: {width: drawerWidth, boxSizing: 'border-box'},
      }}
    >
      <ToolbarSpace />
      <Box sx={{overflow: 'auto'}}>
        <List>
          <ListItem disablePadding onClick={onInformation}>
            <ListItemButton>
              <ListItemAvatar>
                <Avatar variant="square">
                  <LocalShippingIcon />
                </Avatar>
              </ListItemAvatar>
              <ListItemText
                primary="경기18바9151"
                primaryTypographyProps={{fontWeight: 'bold'}}
                secondary="C22033220115"
              />
            </ListItemButton>
          </ListItem>

          <Divider />

          <ListItem disablePadding onClick={onPreview}>
            <ListItemButton>
              <ListItemIcon>
                <ImageIcon />
              </ListItemIcon>
              <ListItemText primary="이벤트 영상" />
            </ListItemButton>
          </ListItem>

          <ListItem disablePadding onClick={onStatistic}>
            <ListItemButton>
              <ListItemIcon>
                <ShowChartIcon />
              </ListItemIcon>
              <ListItemText primary="통계 분석" />
            </ListItemButton>
          </ListItem>
        </List>
      </Box>
    </Drawer>
  );

  return (
    <Box sx={{display: 'flex'}}>
      <CssBaseline />
      <AppBar position="fixed" sx={{zIndex: theme => theme.zIndex.drawer + 1}}>
        <TopBar
          onClickDashboard={onDashboard}
          onClickCharging={onCharging}
          onClickAdmin={onAdmin}
        />
      </AppBar>

      {workId !== 0 && drawer}

      <Box component="main" sx={{flexGrow: 1}}>
        <ToolbarSpace />

        <CssBaseline />
        <Outlet />
      </Box>
    </Box>
  );
}

export default App;

See also