all repos — caroster @ 64235997e5bde9d3bc1a2afda911dda2d952b866

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

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

 1import React, {useReducer} from 'react';
 2import {makeStyles} from '@material-ui/core/styles';
 3import Divider from '@material-ui/core/Divider';
 4import Paper from '@material-ui/core/Paper';
 5import {useTranslation} from 'react-i18next';
 6import {useStrapi} from 'strapi-react-context';
 7import {useEvent} from '../../contexts/Event';
 8import {useToast} from '../../contexts/Toast';
 9import PassengersList from '../PassengersList';
10import HeaderEditing from './HeaderEditing';
11import Header from './Header';
12
13const Car = ({car}) => {
14  const classes = useStyles();
15  const {t} = useTranslation();
16  const {event} = useEvent();
17  const {addToast} = useToast();
18  const strapi = useStrapi();
19  const [isEditing, toggleEditing] = useReducer(i => !i, false);
20
21  if (!car) return null;
22
23  const addPassenger = async passenger => {
24    try {
25      await strapi.services.cars.update(car.id, {
26        passengers: [...(car.passengers || []), passenger],
27      });
28    } catch (error) {
29      console.error(error);
30      addToast(t('car.errors.cant_add_passenger'));
31    }
32  };
33
34  const removePassenger = async idx => {
35    if (!car?.passengers) return false;
36    try {
37      await strapi.services.events.update(event.id, {
38        waiting_list: [...(event.waiting_list || []), car.passengers[idx]],
39      });
40      return await strapi.services.cars.update(car.id, {
41        passengers: car.passengers.filter((_, i) => i !== idx),
42      });
43    } catch (error) {
44      console.error(error);
45      addToast(t('car.errors.cant_remove_passenger'));
46      return false;
47    }
48  };
49
50  return (
51    <Paper className={classes.root}>
52      {isEditing ? (
53        <HeaderEditing car={car} toggleEditing={toggleEditing} />
54      ) : (
55        <Header car={car} toggleEditing={toggleEditing} />
56      )}
57      <Divider />
58      {!isEditing && (
59        <PassengersList
60          passengers={car.passengers}
61          places={car.seats}
62          addPassenger={addPassenger}
63          onClick={removePassenger}
64          icon="close"
65        />
66      )}
67    </Paper>
68  );
69};
70
71const useStyles = makeStyles(theme => ({
72  root: {
73    position: 'relative',
74  },
75}));
76
77export default Car;