all repos — caroster @ 7a12fb97085f03194e0569b2b56ecbea4192630c

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

frontend/containers/CarColumns/index.tsx (view raw)

 1import {useRef, useEffect} from 'react';
 2import Slider from 'react-slick';
 3import Box from '@material-ui/core/Box';
 4import {makeStyles} from '@material-ui/core/styles';
 5import Container from '@material-ui/core/Container';
 6import WaitingList from '../WaitingList';
 7import Car from '../Car';
 8import AddCar from './AddCar';
 9import useEventStore from '../../stores/useEventStore';
10import sliderSettings from './_SliderSettings';
11import {Car as CarType} from '../../generated/graphql';
12
13interface Props {
14  toggleNewCar: () => void;
15}
16
17const CarColumns = (props: Props) => {
18  const wrapper = useRef();
19  const slider = useRef();
20  const event = useEventStore(s => s.event);
21  const {cars} = event || {};
22  const classes = useStyles();
23
24  useEffect(() => {
25    if (wrapper.current)
26      wrapper.current.addEventListener('wheel', e => {
27        e.preventDefault();
28        if (e.deltaY < 0) slider.current.slickPrev();
29        else slider.current.slickNext();
30      });
31  }, [wrapper, slider]);
32
33  return (
34    <Box ref={wrapper}>
35      <Slider className={classes.slider} ref={slider} {...sliderSettings}>
36        <Container maxWidth="sm" className={classes.slide}>
37          <WaitingList />
38        </Container>
39        {cars?.length > 0 &&
40          cars
41            .slice()
42            .sort(sortCars)
43            .map(car => (
44              <Container key={car.id} maxWidth="sm" className={classes.slide}>
45                <Car car={car} {...props} />
46              </Container>
47            ))}
48        <Container maxWidth="sm" className={classes.slide}>
49          <AddCar {...props} />
50        </Container>
51      </Slider>
52    </Box>
53  );
54};
55
56const sortCars = (a: CarType, b: CarType) => {
57  if (!b) return 1;
58  const dateA = new Date(a.departure).getTime();
59  const dateB = new Date(b.departure).getTime();
60  if (dateA === dateB) return new Date(a.createdAt) - new Date(b.createdAt);
61  else return dateA - dateB;
62};
63
64const useStyles = makeStyles(theme => ({
65  slider: {
66    marginTop: theme.mixins.toolbar.minHeight,
67    padding: theme.spacing(1, 6),
68    overflow: 'hidden',
69
70    [theme.breakpoints.down('sm')]: {
71      padding: theme.spacing(1),
72    },
73
74    '& .slick-list': {
75      overflow: 'visible',
76    },
77    '& .slick-dots': {
78      '& li': {
79        display: 'block',
80      },
81    },
82  },
83  slide: {
84    marginTop: 24,
85    minHeight: `calc(100vh - ${
86      theme.mixins.toolbar.minHeight + theme.spacing(14) + 36
87    }px)`,
88    outline: 'none',
89    padding: theme.spacing(1),
90    marginBottom: theme.spacing(12),
91  },
92}));
93
94export default CarColumns;