all repos — caroster @ 54cb6c4b8a7dd7edbecc198ae921331a52d5aa90

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

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

 1import {useMemo, useReducer} from 'react';
 2import Divider from '@mui/material/Divider';
 3import Paper from '@mui/material/Paper';
 4import Button from '@mui/material/Button';
 5import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction';
 6import {useTheme} from '@mui/styles';
 7import {useTranslation} from 'react-i18next';
 8import HeaderEditing from './HeaderEditing';
 9import Header from './Header';
10import useActions from './useActions';
11import PassengersList from '../PassengersList';
12import AddPassengerButtons from '../AddPassengerButtons';
13import useProfile from '../../hooks/useProfile';
14import useMapStore from '../../stores/useMapStore';
15import {Travel as TravelType} from '../../generated/graphql';
16
17interface Props {
18  travel: TravelType & {id: string};
19  getAddPassengerFunction: (addSelf: boolean) => () => void;
20}
21
22const Travel = (props: Props) => {
23  const {travel} = props;
24
25  const {t} = useTranslation();
26  const theme = useTheme();
27  const [isEditing, toggleEditing] = useReducer(i => !i, false);
28  const actions = useActions({travel});
29  const {userId, connected} = useProfile();
30  const {focusedTravel} = useMapStore();
31  const focused = focusedTravel === travel.id;
32
33  if (!travel) return null;
34  const disableNewPassengers = travel.passengers.data?.length >= travel.seats;
35
36  const registered = useMemo(() => {
37    if (!connected) return false;
38    const isInTravel = travel.passengers?.data.some(
39      passenger => passenger.attributes.user?.data?.id === `${userId}`
40    );
41
42    return isInTravel;
43  }, [travel, userId]);
44
45  return (
46    <Paper
47      sx={{
48        position: 'relative',
49        boxShadow: focused
50          ? `0px 0px 5px 2px ${theme.palette.primary.main}`
51          : 'none',
52      }}
53      id={travel.id}
54    >
55      {isEditing ? (
56        <HeaderEditing travel={travel} toggleEditing={toggleEditing} />
57      ) : (
58        <Header travel={travel} toggleEditing={toggleEditing} />
59      )}
60      {!isEditing && (
61        <>
62          <Divider />
63          <AddPassengerButtons
64            getOnClickFunction={props.getAddPassengerFunction}
65            canAddSelf={connected}
66            registered={registered}
67            variant="travel"
68            disabled={disableNewPassengers}
69          />
70          {travel.passengers.data.length > 0 && <Divider />}
71          <PassengersList
72            passengers={travel.passengers.data}
73            onClick={actions.sendPassengerToWaitingList}
74            isTravel
75            Button={({onClick}: {onClick: () => void}) => (
76              <ListItemSecondaryAction>
77                <Button
78                  color="primary"
79                  onClick={onClick}
80                  tabIndex={-1}
81                >
82                  {t`travel.passengers.remove`}
83                </Button>
84              </ListItemSecondaryAction>
85            )}
86          />
87        </>
88      )}
89    </Paper>
90  );
91};
92
93export default Travel;