all repos — caroster @ b2a5134b5c341777cf857dc3e253ef93bbbc3215

[Octree] Group carpool to your event https://caroster.io

app/src/containers/GenericMenu/index.js (view raw)

 1import React, {useState, useEffect, useMemo} from 'react';
 2import AppBar from '@material-ui/core/AppBar';
 3import Toolbar from '@material-ui/core/Toolbar';
 4import Typography from '@material-ui/core/Typography';
 5import IconButton from '@material-ui/core/IconButton';
 6import Icon from '@material-ui/core/Icon';
 7import {makeStyles} from '@material-ui/core/styles';
 8import GenericToolbar from './Toolbar';
 9import {useTranslation} from 'react-i18next';
10import {useStrapi, useAuth} from 'strapi-react-context';
11
12const GenericMenu = ({title, actions = []}) => {
13  const {t} = useTranslation();
14  const [anchorEl, setAnchorEl] = useState(null);
15  const classes = useStyles();
16  const strapi = useStrapi();
17  const {logout, authState} = useAuth();
18  const [settings] = strapi.stores?.settings || [{}];
19  const validActions = useMemo(() => actions.filter(Boolean), [actions]);
20
21  const logoutMenuItem = authState?.user
22    ? {label: t('menu.logout'), onClick: logout, id: 'LogoutTabs'}
23    : null;
24  const aboutMenuItem = {
25    label: t('menu.about'),
26    onClick: () => (window.location.href = settings['about_link']),
27    id: 'AboutTabs',
28    className: classes.withDivider,
29  };
30  useEffect(() => {
31    window.scrollTo(0, 0);
32  }, []);
33
34  return (
35    <AppBar
36      position="static"
37      color="primary"
38      className={classes.appbar}
39      id="Menu"
40    >
41      <Toolbar>
42        <div className={classes.name}>
43          <Typography variant="h6" noWrap id="MenuHeaderTitle">
44            {title}
45          </Typography>
46        </div>
47        {validActions.length > 0 && (
48          <>
49            <IconButton
50              color="inherit"
51              edge="end"
52              id="MenuMoreInfo"
53              onClick={e => setAnchorEl(e.currentTarget)}
54            >
55              <Icon>more_vert</Icon>
56            </IconButton>
57
58            <GenericToolbar
59              anchorEl={anchorEl}
60              setAnchorEl={setAnchorEl}
61              actions={[...validActions, aboutMenuItem, logoutMenuItem].filter(
62                Boolean
63              )}
64            />
65          </>
66        )}
67      </Toolbar>
68    </AppBar>
69  );
70};
71
72const useStyles = makeStyles(theme => ({
73  container: {
74    padding: theme.spacing(2),
75  },
76  appbar: {
77    overflow: 'hidden',
78    height: theme.mixins.toolbar.minHeight,
79    transition: 'height 0.3s ease',
80    zIndex: theme.zIndex.appBar,
81    position: 'fixed',
82    top: 0,
83  },
84  name: {
85    flexGrow: 1,
86    display: 'flex',
87    alignItems: 'center',
88  },
89  shareIcon: {
90    marginRight: theme.spacing(0),
91  },
92  withDivider: {
93    borderTop: `1px solid ${theme.palette.divider}`,
94  },
95}));
96
97export default GenericMenu;