all repos — caroster @ 0cf7e5b8e2927cf655d498d134ec5dc86b69c37b

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

app/src/pages/Event.js (view raw)

  1import React, {useState, useReducer, useEffect} from 'react';
  2import {useTranslation} from 'react-i18next';
  3import AppBar from '@material-ui/core/AppBar';
  4import Toolbar from '@material-ui/core/Toolbar';
  5import Container from '@material-ui/core/Container';
  6import Typography from '@material-ui/core/Typography';
  7import IconButton from '@material-ui/core/IconButton';
  8import Icon from '@material-ui/core/Icon';
  9import {makeStyles} from '@material-ui/core/styles';
 10import Layout from '../layouts/Default';
 11import EventMenu from '../containers/EventMenu';
 12import EventDetails from '../containers/EventDetails';
 13import EventFab from '../containers/EventFab';
 14import {useEvent, EventProvider} from '../contexts/Event';
 15import CarColumns from '../containers/CarColumns';
 16import {useToast} from '../contexts/Toast';
 17import NewCarDialog from '../containers/NewCarDialog';
 18import Loading from '../pages/Loading';
 19
 20const Event = () => {
 21  const {t} = useTranslation();
 22  const {addToast} = useToast();
 23  const [anchorEl, setAnchorEl] = useState(null);
 24  const [detailsOpen, toggleDetails] = useReducer(i => !i, false);
 25  const classes = useStyles({detailsOpen});
 26  const [openNewCar, toggleNewCar] = useReducer(i => !i, false);
 27  const {event, isEditing, setIsEditing, updateEvent} = useEvent();
 28
 29  useEffect(() => {
 30    window.scrollTo(0, 0);
 31  }, []);
 32
 33  useEffect(() => {
 34    if (!detailsOpen) setIsEditing(false);
 35  }, [detailsOpen]); // eslint-disable-line react-hooks/exhaustive-deps
 36
 37  const onEventSave = async e => {
 38    try {
 39      await updateEvent();
 40      setIsEditing(false);
 41    } catch (error) {
 42      console.error(error);
 43      addToast(t('event.errors.cant_update'));
 44    }
 45  };
 46
 47  if (!event) return <Loading />;
 48
 49  return (
 50    <Layout>
 51      <AppBar
 52        position="static"
 53        className={classes.appbar}
 54        id={(isEditing && 'EditEvent') || (detailsOpen && 'Details') || 'Menu'}
 55      >
 56        <Toolbar>
 57          <Typography
 58            variant="h6"
 59            className={classes.name}
 60            id="MenuHeaderTitle"
 61          >
 62            {event.name}
 63          </Typography>
 64          {!detailsOpen && (
 65            <IconButton
 66              edge="end"
 67              id="MenuMoreInfo"
 68              onClick={e => setAnchorEl(e.currentTarget)}
 69            >
 70              <Icon className={classes.barIcon}>more_vert</Icon>
 71            </IconButton>
 72          )}
 73          {detailsOpen && !isEditing && (
 74            <IconButton
 75              edge="end"
 76              id="DetailsEditBtn"
 77              onClick={e => setIsEditing(true)}
 78            >
 79              <Icon className={classes.barIcon}>edit</Icon>
 80            </IconButton>
 81          )}
 82          {detailsOpen && isEditing && (
 83            <IconButton edge="end" id="EditEventSubmit" onClick={onEventSave}>
 84              <Icon className={classes.barIcon}>done</Icon>
 85            </IconButton>
 86          )}
 87          <EventMenu
 88            anchorEl={anchorEl}
 89            setAnchorEl={setAnchorEl}
 90            actions={[
 91              {
 92                label: detailsOpen
 93                  ? t('event.actions.hide_details')
 94                  : t('event.actions.show_details'),
 95                onClick: toggleDetails,
 96                id: 'DetailsTab',
 97              },
 98              {
 99                label: t('event.actions.add_car'),
100                onClick: toggleNewCar,
101                id: 'NewCarTab',
102              },
103              {
104                label: t('event.actions.invite'),
105                onClick: () => {},
106                id: 'InviteTab',
107              },
108            ]}
109          />
110        </Toolbar>
111        <Container className={classes.container} maxWidth="sm">
112          <EventDetails toggleDetails={toggleDetails} />
113        </Container>
114      </AppBar>
115      <CarColumns toggleNewCar={toggleNewCar} />
116      <EventFab toggleNewCar={toggleNewCar} />
117      <NewCarDialog open={openNewCar} toggle={toggleNewCar} />
118    </Layout>
119  );
120};
121
122const useStyles = makeStyles(theme => ({
123  container: {padding: theme.spacing(2)},
124  appbar: ({detailsOpen}) => ({
125    transition: 'height 0.3s ease',
126    overflow: 'hidden',
127    height: detailsOpen ? '100vh' : theme.mixins.toolbar.minHeight,
128    zIndex: theme.zIndex.appBar,
129  }),
130  name: {
131    flexGrow: 1,
132  },
133  barIcon: {
134    color: 'white',
135  },
136}));
137
138const EventWithContext = props => (
139  <EventProvider {...props}>
140    <Event {...props} />
141  </EventProvider>
142);
143export default EventWithContext;