all repos — caroster @ c9bd2e937edf564930965e3b1bc3baaf2ce8686c

[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 Avatar from '@material-ui/core/Avatar';
  7import Icon from '@material-ui/core/Icon';
  8import {makeStyles} from '@material-ui/core/styles';
  9import GenericToolbar from './Toolbar';
 10import {useTranslation} from 'react-i18next';
 11import {useStrapi, useAuth} from 'strapi-react-context';
 12import {useHistory} from 'react-router-dom';
 13
 14const GenericMenu = ({title, actions = [], goBack = false}) => {
 15  const {t} = useTranslation();
 16  const history = useHistory();
 17  const [anchorEl, setAnchorEl] = useState(null);
 18  const classes = useStyles();
 19  const strapi = useStrapi();
 20  const {logout, authState} = useAuth();
 21  const [settings] = strapi.stores?.settings || [{}];
 22  const validActions = useMemo(() => actions.filter(Boolean), [actions]);
 23
 24  const logoutMenuItem = authState?.user && {
 25    label: t('menu.logout'),
 26    onClick: () => logout(settings['about_link']),
 27    id: 'LogoutTabs',
 28  };
 29  const aboutMenuItem = {
 30    label: t('menu.about'),
 31    onClick: () => (window.location.href = settings['about_link']),
 32    id: 'AboutTabs',
 33  };
 34  const userInfos = authState?.user
 35    ? [{label: authState.user.username, id: 'Email'}, {divider: true}]
 36    : [];
 37  useEffect(() => {
 38    window.scrollTo(0, 0);
 39  }, []);
 40
 41  return (
 42    <AppBar
 43      position="static"
 44      color="primary"
 45      className={classes.appbar}
 46      id="Menu"
 47    >
 48      <Toolbar>
 49        {goBack && (
 50          <IconButton
 51            edge="start"
 52            className={classes.goBack}
 53            onClick={() =>
 54              history.length > 2 ? history.goBack() : history.push('/dashboard')
 55            }
 56          >
 57            <Icon>arrow_back</Icon>
 58          </IconButton>
 59        )}
 60        <div className={classes.name}>
 61          <Typography variant="h6" noWrap id="MenuHeaderTitle">
 62            {title}
 63          </Typography>
 64        </div>
 65        {validActions.length > 0 && (
 66          <>
 67            <IconButton
 68              color="inherit"
 69              edge="end"
 70              id="MenuMoreInfo"
 71              onClick={e => setAnchorEl(e.currentTarget)}
 72            >
 73              {authState?.user ? (
 74                <Avatar className={classes.avatar}>
 75                  {`${authState.user.username[0]}`.toUpperCase()}
 76                </Avatar>
 77              ) : (
 78                <Icon>more_vert</Icon>
 79              )}
 80            </IconButton>
 81
 82            <GenericToolbar
 83              anchorEl={anchorEl}
 84              setAnchorEl={setAnchorEl}
 85              actions={[
 86                ...userInfos,
 87                ...validActions,
 88                {divider: true},
 89                aboutMenuItem,
 90                logoutMenuItem,
 91              ].filter(Boolean)}
 92            />
 93          </>
 94        )}
 95      </Toolbar>
 96    </AppBar>
 97  );
 98};
 99
100const useStyles = makeStyles(theme => ({
101  container: {
102    padding: theme.spacing(2),
103  },
104  appbar: {
105    overflow: 'hidden',
106    height: theme.mixins.toolbar.minHeight,
107    transition: 'height 0.3s ease',
108    zIndex: theme.zIndex.appBar,
109    position: 'fixed',
110    top: 0,
111  },
112  name: {
113    flexGrow: 1,
114    display: 'flex',
115    alignItems: 'center',
116  },
117  shareIcon: {
118    marginRight: theme.spacing(0),
119  },
120  avatar: {
121    width: theme.spacing(3),
122    height: theme.spacing(3),
123    fontSize: 16,
124  },
125  goBack: {
126    color: theme.palette.common.white,
127  },
128}));
129
130export default GenericMenu;