all repos — caroster @ bbf06ea9d86e56e5f856cafb9e2cc99777bfd16f

[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 () => {
 47    try {
 48      await strapi.services.cars.create({
 49        name,
 50        seats,
 51        meeting,
 52        departure: date.toISOString(),
 53        phone_number: phone,
 54        details,
 55        event: event.id,
 56      });
 57      addToast(t("car.creation.created"));
 58      toggle();
 59      return true;
 60    } catch (error) {
 61      console.error(error);
 62      addToast(t("car.errors.cant_create"));
 63      return false;
 64    }
 65  };
 66
 67  return (
 68    <Dialog
 69      open={open}
 70      TransitionComponent={Transition}
 71      onClose={toggle}
 72      fullWidth
 73      maxWidth="sm"
 74    >
 75      <DialogTitle>{t("car.creation.title")}</DialogTitle>
 76      <DialogContent>
 77        <DialogContentText>
 78          <TextField
 79            className={classes.textField}
 80            label={t("car.creation.name")}
 81            fullWidth
 82            autoFocus
 83            margin="dense"
 84            value={name}
 85            onChange={(e) => setName(e.target.value)}
 86            id="NewCarName"
 87            name="name"
 88          />
 89          <Typography variant="caption">{t("car.creation.seats")}</Typography>
 90          <Slider
 91            value={seats}
 92            onChange={(e, value) => setSeats(value)}
 93            step={1}
 94            marks={marks}
 95            min={1}
 96            max={marks.length}
 97            valueLabelDisplay="auto"
 98          />
 99          <TextField
100            className={classes.textField}
101            label={t("car.creation.meeting")}
102            fullWidth
103            margin="dense"
104            multiline
105            rows={2}
106            value={meeting}
107            onChange={(e) => setMeeting(e.target.value)}
108            id="NewCarMeeting"
109            name="meeting"
110          />
111          <DateTimePicker
112            label={t("event.creation.date")}
113            value={date}
114            onChange={setDate}
115            className={classes.textField}
116            fullWidth
117            format="LLLL"
118            disablePast
119            id="NewCarDateTime"
120            name="date"
121          />
122          <TextField
123            className={classes.textField}
124            label={t("car.creation.phone")}
125            fullWidth
126            autoFocus
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 onClick={toggle}>{t("generic.cancel")}</Button>
149        <Button variant="contained" onClick={onCreate} disabled={!canCreate}>
150          {t("generic.create")}
151        </Button>
152      </DialogActions>
153    </Dialog>
154  );
155};
156
157const useStyles = makeStyles((theme) => ({
158  textField: { marginBottom: theme.spacing(2) },
159}));
160
161export default NewCarDialog;