all repos — caroster @ 8a3f929f7db1c92e4c4b92eee75c20aab48a9950

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

frontend/containers/EventBar/index.js (view raw)

  1import {useEffect, useState, useReducer} from 'react';
  2import AppBar from '@material-ui/core/AppBar';
  3import Toolbar from '@material-ui/core/Toolbar';
  4import Typography from '@material-ui/core/Typography';
  5import Avatar from '@material-ui/core/Avatar';
  6import IconButton from '@material-ui/core/IconButton';
  7import Icon from '@material-ui/core/Icon';
  8import {makeStyles} from '@material-ui/core/styles';
  9import {useTranslation} from 'react-i18next';
 10import {useRouter} from 'next/router';
 11import Link from 'next/link';
 12import EventMenu from '../EventMenu';
 13import EventDetails from '../EventDetails';
 14import useAuthStore from '../../stores/useAuthStore';
 15import useEventStore from '../../stores/useEventStore';
 16import useProfile from '../../hooks/useProfile';
 17import useSettings from '../../hooks/useSettings';
 18
 19const EventBar = ({event, onAdd, onSave, onShare}) => {
 20  const {t} = useTranslation();
 21  const router = useRouter();
 22  const [detailsOpen, toggleDetails] = useReducer(i => !i, false);
 23  const [anchorEl, setAnchorEl] = useState(null);
 24  const isEditing = useEventStore(s => s.isEditing);
 25  const setIsEditing = useEventStore(s => s.setIsEditing);
 26  const classes = useStyles({detailsOpen});
 27  const token = useAuthStore(s => s.token);
 28  const {user} = useProfile();
 29  const settings = useSettings();
 30
 31  useEffect(() => {
 32    if (!detailsOpen) setIsEditing(false);
 33  }, [detailsOpen]); // eslint-disable-line react-hooks/exhaustive-deps
 34
 35  const signUp = () =>
 36    router.push({
 37      pathname: '/auth/register',
 38      state: {event: event?.id},
 39    });
 40  const signIn = () => router.push('/auth/login');
 41  const goToDashboard = () => router.push('/dashboard');
 42  const goProfile = () => router.push('/profile');
 43
 44  const noUserMenuActions = [
 45    {
 46      label: t('event.actions.add_to_my_events'),
 47      onClick: () => {
 48        onAdd(true);
 49      },
 50      id: 'AddToMyEventsTab',
 51    },
 52    {divider: true},
 53    {
 54      label: t('menu.login'),
 55      onClick: signIn,
 56      id: 'SignInTab',
 57    },
 58    {
 59      label: t('menu.register'),
 60      onClick: signUp,
 61      id: 'SignUpTab',
 62    },
 63  ];
 64
 65  const loggedMenuActions = [
 66    {
 67      label: t('menu.dashboard'),
 68      onClick: goToDashboard,
 69      id: 'GoToDashboardTab',
 70    },
 71    {
 72      label: t('menu.profile'),
 73      onClick: goProfile,
 74      id: 'ProfileTab',
 75    },
 76    {divider: true},
 77  ];
 78
 79  const menuActions = token ? loggedMenuActions : noUserMenuActions;
 80  const userInfos = user
 81    ? [{label: user.username, id: 'Email'}, {divider: true}]
 82    : [];
 83
 84  return (
 85    <AppBar
 86      position="static"
 87      color="primary"
 88      className={classes.appbar}
 89      id={(isEditing && 'EditEvent') || (detailsOpen && 'Details') || 'Menu'}
 90    >
 91      <Toolbar>
 92        <div className={classes.name}>
 93          <Link href={settings?.['about_link'] || ''}>
 94            <img className={classes.logo} src="/assets/logo.svg" alt="Logo" />
 95          </Link>
 96          <Typography variant="h6" noWrap id="MenuHeaderTitle">
 97            {event.name}
 98          </Typography>
 99          {detailsOpen && (
100            <IconButton
101              color="inherit"
102              edge="end"
103              id="HeaderAction"
104              onClick={isEditing ? onSave : () => setIsEditing(true)}
105            >
106              <Icon>{isEditing ? 'done' : 'edit'}</Icon>
107            </IconButton>
108          )}
109        </div>
110        {detailsOpen ? (
111          <IconButton
112            color="inherit"
113            edge="end"
114            id="CloseDetailsBtn"
115            onClick={() => {
116              setIsEditing(false);
117              toggleDetails();
118            }}
119          >
120            <Icon>close</Icon>
121          </IconButton>
122        ) : (
123          <>
124            <IconButton
125              color="inherit"
126              edge="end"
127              id="ShareBtn"
128              onClick={toggleDetails}
129              className={classes.shareIcon}
130            >
131              <Icon>share</Icon>
132            </IconButton>
133            <IconButton
134              color="inherit"
135              edge="end"
136              id="ShareBtn"
137              onClick={toggleDetails}
138              className={classes.iconButtons}
139            >
140              <Icon>information_outline</Icon>
141            </IconButton>
142            <IconButton
143              color="inherit"
144              edge="end"
145              id="MenuMoreInfo"
146              onClick={e => setAnchorEl(e.currentTarget)}
147            >
148              {user ? (
149                <Avatar className={classes.avatar}>
150                  {`${user.username[0]}`.toUpperCase()}
151                </Avatar>
152              ) : (
153                <Icon>more_vert</Icon>
154              )}
155            </IconButton>
156          </>
157        )}
158        <EventMenu
159          anchorEl={anchorEl}
160          setAnchorEl={setAnchorEl}
161          actions={[
162            ...userInfos,
163            ...[
164              {
165                label: detailsOpen
166                  ? t('event.actions.hide_details')
167                  : t('event.actions.show_details'),
168                onClick: toggleDetails,
169                id: 'DetailsTab',
170              },
171            ],
172            ...menuActions,
173          ]}
174        />
175      </Toolbar>
176      {detailsOpen && (
177        <EventDetails toggleDetails={toggleDetails} onShare={onShare} />
178      )}
179    </AppBar>
180  );
181};
182
183const useStyles = makeStyles(theme => ({
184  appbar: ({detailsOpen}) => ({
185    overflow: 'hidden',
186    height: detailsOpen ? '100vh' : theme.mixins.toolbar.minHeight,
187    overflowY: detailsOpen ? 'scroll' : 'hidden',
188    transition: 'height 0.3s ease',
189    zIndex: theme.zIndex.appBar,
190    position: 'fixed',
191    top: 0,
192  }),
193  logo: {
194    marginRight: theme.spacing(2),
195    width: 32,
196    height: 32,
197    cursor: 'pointer',
198  },
199  name: {
200    flexGrow: 1,
201    display: 'flex',
202    alignItems: 'center',
203  },
204  iconButtons: {
205    margin: theme.spacing(0),
206  },
207  avatar: {
208    width: theme.spacing(3),
209    height: theme.spacing(3),
210    fontSize: 16,
211  },
212  withDivider: {
213    borderBottom: `1px solid ${theme.palette.divider}`,
214  },
215}));
216
217export default EventBar;