all repos — caroster @ e169aeb694c522258a9cbdca0e2ada0eb8d4a417

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