all repos — caroster @ 4829b9cc31e622d322fe36e7ec671b78fab2e983

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

app/src/containers/CreateEvent/Step1.js (view raw)

  1import React, {useState, useEffect, useMemo} from 'react';
  2import {makeStyles} from '@material-ui/core/styles';
  3import TextField from '@material-ui/core/TextField';
  4import Button from '@material-ui/core/Button';
  5import Checkbox from '@material-ui/core/Checkbox';
  6import FormControlLabel from '@material-ui/core/FormControlLabel';
  7import {useTranslation} from 'react-i18next';
  8import useDebounce from '../../hooks/useDebounce';
  9import useProfile from '../../hooks/useProfile';
 10
 11const isValidEmail = email =>
 12  // eslint-disable-next-line
 13  /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(
 14    email
 15  );
 16
 17const Step1 = ({nextStep, event, addToEvent}) => {
 18  const classes = useStyles();
 19  const {t} = useTranslation();
 20  const {connected, user} = useProfile();
 21
 22  // States
 23  const [name, setName] = useState(event.name ?? '');
 24  const [email, setEmail] = useState(event.email ?? '');
 25  const [emailIsValid, setEmailIsValid] = useState(false);
 26  const [newsletter, setNewsletter] = useState(false);
 27  const debouncedEmail = useDebounce(email, 400);
 28
 29  useEffect(() => {
 30    setEmailIsValid(isValidEmail(debouncedEmail));
 31  }, [debouncedEmail]);
 32
 33  const canSubmit = useMemo(() => {
 34    const n = name.length > 0;
 35    const e = email.length > 0 && emailIsValid;
 36    return connected ? n : n && e;
 37  }, [name, email, emailIsValid, connected]);
 38
 39  const onNext = event => {
 40    if (event.preventDefault) event.preventDefault();
 41    const e = connected ? user.email : email;
 42    addToEvent({name, email: e, newsletter});
 43    nextStep();
 44    return false;
 45  };
 46
 47  return (
 48    <form onSubmit={onNext}>
 49      <TextField
 50        label={t('event.creation.event_name')}
 51        fullWidth
 52        autoFocus
 53        margin="dense"
 54        value={name}
 55        onChange={e => setName(e.target.value)}
 56        id="NewEventName"
 57        name="name"
 58      />
 59      {!connected && (
 60        <TextField
 61          label={t('event.creation.creator_email')}
 62          fullWidth
 63          margin="dense"
 64          value={email}
 65          onChange={e => setEmail(e.target.value)}
 66          id="NewEventEmail"
 67          name="email"
 68          type="email"
 69        />
 70      )}
 71      <FormControlLabel
 72        className={classes.newsletter}
 73        label={t('event.creation.newsletter')}
 74        control={
 75          <Checkbox
 76            name="newsletter"
 77            color="primary"
 78            id="NewEventNewsletter"
 79            checked={newsletter}
 80            onChange={e => setNewsletter(e.target.checked)}
 81          />
 82        }
 83      />
 84      <Button
 85        className={classes.button}
 86        type="submit"
 87        variant="contained"
 88        color="secondary"
 89        fullWidth
 90        disabled={!canSubmit}
 91        aria-disabled={!canSubmit}
 92      >
 93        {t('event.creation.next')}
 94      </Button>
 95    </form>
 96  );
 97};
 98
 99const useStyles = makeStyles(theme => ({
100  button: {
101    marginTop: theme.spacing(2),
102  },
103  newsletter: {
104    marginTop: theme.spacing(2),
105  },
106}));
107
108export default Step1;