all repos — caroster @ 124dfa21a7100f628775f5a0f49841048f8584ea

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

frontend/containers/NewPassengerDialog/AddPassengerToTravel.tsx (view raw)

 1import {FormEvent, useState} from 'react';
 2import Dialog from '@material-ui/core/Dialog';
 3import DialogContent from '@material-ui/core/DialogContent';
 4import DialogTitle from '@material-ui/core/DialogTitle';
 5import Icon from '@material-ui/core/Icon';
 6import {useTranslation} from 'react-i18next';
 7import useAddToEvents from '../../hooks/useAddToEvents';
 8import useEventStore from '../../stores/useEventStore';
 9import {
10  Travel as TravelType,
11} from '../../generated/graphql';
12import SubmitButton from './SubmitButton';
13import Transition from './Transition';
14import AddPassengerCommonFields from './AddPassengerCommonFields';
15import useStyles from './useStyles';
16import useToastStore from '../../stores/useToastStore';
17import usePassengersActions from '../../hooks/usePassengersActions';
18
19interface Props {
20  travel: TravelType;
21  toggle: () => void;
22  open: boolean;
23}
24
25const NewPassengerDialog = ({open, toggle, travel}: Props) => {
26  const {t} = useTranslation();
27  const classes = useStyles();
28  const event = useEventStore(s => s.event);
29  const {addToEvent} = useAddToEvents();
30  const addToast = useToastStore(s => s.addToast);
31
32  // States
33  const [name, setName] = useState('');
34  const [email, setEmail] = useState('');
35  const canAddPassenger = !!name && !!email;
36  const {addPassengerToTravel} = usePassengersActions();
37
38  const onSubmit = async (e: FormEvent) => {
39    e.preventDefault();
40    const passenger = {
41      email,
42      name,
43    };
44
45    return addPassengerToTravel({passenger, travel, onSucceed: () => {
46      addToEvent(event.id);
47      addToast(t('passenger.success.added_to_car', {name}));
48      toggle();
49    }});
50  };
51
52  return (
53    <Dialog
54      fullWidth
55      maxWidth="xs"
56      open={open}
57      onClose={toggle}
58      TransitionComponent={Transition}
59    >
60      <form onSubmit={onSubmit}>
61        <DialogTitle className={classes.title}>
62          {travel.vehicle.name}
63          <Icon
64            className={classes.closeIcon}
65            onClick={toggle}
66            aria-label="close"
67          >
68            close
69          </Icon>
70        </DialogTitle>
71        <DialogContent className={classes.dialogContent}>
72          <AddPassengerCommonFields
73            email={email}
74            setEmail={setEmail}
75            name={name}
76            setName={setName}
77          />
78          <SubmitButton disabled={!canAddPassenger}>
79            {t('travel.passengers.add_to_car')}
80          </SubmitButton>
81        </DialogContent>
82      </form>
83    </Dialog>
84  );
85};
86
87export default NewPassengerDialog;