all repos — caroster @ 601d15906bd7d6e531e2db5b1a44d6f8d94c41e7

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