all repos — caroster @ 9079b470260a87959da56f303e6682211cb847d1

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

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

  1import React, {useState} from 'react';
  2import Dialog from '@material-ui/core/Dialog';
  3import DialogActions from '@material-ui/core/DialogActions';
  4import DialogContent from '@material-ui/core/DialogContent';
  5import DialogContentText from '@material-ui/core/DialogContentText';
  6import DialogTitle from '@material-ui/core/DialogTitle';
  7import Button from '@material-ui/core/Button';
  8import Slide from '@material-ui/core/Slide';
  9import moment from 'moment';
 10import {useStrapi} from 'strapi-react-context';
 11import {useTranslation} from 'react-i18next';
 12import TextField from '@material-ui/core/TextField';
 13import Slider from '@material-ui/core/Slider';
 14import Typography from '@material-ui/core/Typography';
 15import {makeStyles} from '@material-ui/core/styles';
 16import {DateTimePicker} from '@material-ui/pickers';
 17import {useToast} from '../../contexts/Toast';
 18import {useEvent} from '../../contexts/Event';
 19
 20const Transition = React.forwardRef(function Transition(props, ref) {
 21  return <Slide direction="up" ref={ref} {...props} />;
 22});
 23
 24const marks = [1, 2, 3, 4, 5, 6, 7, 8].map(value => ({
 25  value,
 26  label: value,
 27}));
 28
 29const NewCarDialog = ({open, toggle}) => {
 30  const strapi = useStrapi();
 31  const {t} = useTranslation();
 32  const classes = useStyles();
 33  const {addToast} = useToast();
 34  const {event} = useEvent();
 35
 36  // States
 37  const [name, setName] = useState('');
 38  const [seats, setSeats] = useState(4);
 39  const [meeting, setMeeting] = useState('');
 40  const [date, setDate] = useState(moment());
 41  const [phone, setPhone] = useState('');
 42  const [details, setDetails] = useState('');
 43
 44  const canCreate = !!name && !!seats;
 45
 46  const onCreate = async e => {
 47    if (e.preventDefault) e.preventDefault();
 48    try {
 49      await strapi.services.cars.create({
 50        name,
 51        seats,
 52        meeting,
 53        departure: date.toISOString(),
 54        phone_number: phone,
 55        details,
 56        event: event.id,
 57      });
 58      addToast(t('car.creation.created'));
 59      toggle();
 60    } catch (error) {
 61      console.error(error);
 62      addToast(t('car.errors.cant_create'));
 63    }
 64    return false;
 65  };
 66
 67  return (
 68    <Dialog
 69      open={open}
 70      TransitionComponent={Transition}
 71      onClose={toggle}
 72      fullWidth
 73      maxWidth="sm"
 74    >
 75      <form onSubmit={onCreate}>
 76        <DialogTitle>{t('car.creation.title')}</DialogTitle>
 77        <DialogContent>
 78          <DialogContentText>
 79            <TextField
 80              className={classes.textField}
 81              label={t('car.creation.name')}
 82              fullWidth
 83              autoFocus
 84              margin="dense"
 85              value={name}
 86              onChange={e => setName(e.target.value)}
 87              id="NewCarName"
 88              name="name"
 89            />
 90            <Typography variant="caption">{t('car.creation.seats')}</Typography>
 91            <Slider
 92              value={seats}
 93              onChange={(e, value) => setSeats(value)}
 94              step={1}
 95              marks={marks}
 96              min={1}
 97              max={marks.length}
 98              valueLabelDisplay="auto"
 99            />
100            <TextField
101              className={classes.textField}
102              label={t('car.creation.meeting')}
103              fullWidth
104              margin="dense"
105              multiline
106              rows={2}
107              value={meeting}
108              onChange={e => setMeeting(e.target.value)}
109              id="NewCarMeeting"
110              name="meeting"
111            />
112            <DateTimePicker
113              label={t('event.creation.date')}
114              value={date}
115              onChange={setDate}
116              className={classes.textField}
117              fullWidth
118              format="LLLL"
119              disablePast
120              id="NewCarDateTime"
121              name="date"
122            />
123            <TextField
124              className={classes.textField}
125              label={t('car.creation.phone')}
126              fullWidth
127              margin="dense"
128              value={phone}
129              onChange={e => setPhone(e.target.value)}
130              id="NewCarPhone"
131              name="phone"
132            />
133            <TextField
134              className={classes.textField}
135              label={t('car.creation.notes')}
136              fullWidth
137              margin="dense"
138              multiline
139              rows={2}
140              value={details}
141              onChange={e => setDetails(e.target.value)}
142              id="NewCarDetails"
143              name="details"
144            />
145          </DialogContentText>
146        </DialogContent>
147        <DialogActions>
148          <Button id="NewCarCancel" onClick={toggle} tabIndex={-1}>
149            {t('generic.cancel')}
150          </Button>
151          <Button
152            variant="contained"
153            type="submit"
154            disabled={!canCreate}
155            aria-disabled={!canCreate}
156            id="NewCarSubmit"
157          >
158            {t('generic.create')}
159          </Button>
160        </DialogActions>
161      </form>
162    </Dialog>
163  );
164};
165
166const useStyles = makeStyles(theme => ({
167  textField: {marginBottom: theme.spacing(2)},
168}));
169
170export default NewCarDialog;