all repos — caroster @ ec8b25be9fb27eea5119a512c5b62bc6166a5354

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

app/src/containers/SignUp/SignUp.js (view raw)

  1import React, {useCallback, useState, useMemo} from 'react';
  2import {useTranslation} from 'react-i18next';
  3import {useAuth} from 'strapi-react-context';
  4import TextField from '@material-ui/core/TextField';
  5import Button from '@material-ui/core/Button';
  6import CardContent from '@material-ui/core/CardContent';
  7import CardActions from '@material-ui/core/CardActions';
  8import {useToast} from '../../contexts/Toast';
  9import {Redirect} from 'react-router-dom';
 10import {CircularProgress} from '@material-ui/core';
 11import {makeStyles} from '@material-ui/core/styles';
 12
 13const SignUp = () => {
 14  const {t} = useTranslation();
 15  const classes = useStyles();
 16
 17  const {signUp, token} = useAuth();
 18  const [isLoading, setIsLoading] = useState(false);
 19  const [firstName, setFirstName] = useState('');
 20  const [lastName, setLastName] = useState('');
 21  const [email, setEmail] = useState('');
 22  const [password, setPassword] = useState('');
 23
 24  const canSubmit = useMemo(
 25    () =>
 26      [firstName, lastName, email, password].filter(s => s.length < 4)
 27        .length === 0,
 28    [firstName, lastName, email, password]
 29  );
 30  const {addToast} = useToast();
 31
 32  const onSubmit = useCallback(
 33    async evt => {
 34      if (evt.preventDefault) evt.preventDefault();
 35      if (isLoading) return;
 36      setIsLoading(true);
 37      try {
 38        await signUp(email.replace(/\.@/, '_'), email, password, {
 39          firstName,
 40          lastName,
 41        });
 42      } catch (error) {
 43        if (error.kind && error.kind === 'bad_data')
 44          addToast(t('signup.errors.email_taken'));
 45        else if (error.kind) {
 46          addToast(t(`generic.errors.${error.kind}`));
 47        } else {
 48          addToast(t(`generic.errors.unknown`));
 49        }
 50      }
 51      setIsLoading(false);
 52      return false;
 53    },
 54    [firstName, lastName, email, password, addToast, signUp, t, isLoading]
 55  );
 56
 57  if (!!token) {
 58    return <Redirect to="/register/success" />;
 59  }
 60
 61  return (
 62    <form onSubmit={onSubmit}>
 63      <CardContent>
 64        <TextField
 65          label={t('signup.firstName')}
 66          fullWidth
 67          autoFocus
 68          margin="dense"
 69          value={firstName}
 70          required={true}
 71          onChange={({target: {value = ''}}) => setFirstName(value)}
 72          id="SignUpFirstName"
 73          name="firstName"
 74        />
 75        <TextField
 76          label={t('signup.lastName')}
 77          fullWidth
 78          required={true}
 79          margin="dense"
 80          value={lastName}
 81          onChange={({target: {value = ''}}) => setLastName(value)}
 82          id="SignUpLastName"
 83          name="lastName"
 84        />
 85        <TextField
 86          label={t('signup.email')}
 87          fullWidth
 88          required={true}
 89          margin="dense"
 90          value={email}
 91          onChange={({target: {value = ''}}) => setEmail(value)}
 92          id="SignUpEmail"
 93          name="email"
 94          type="email"
 95        />
 96        <TextField
 97          label={t('signup.password')}
 98          fullWidth
 99          required={true}
100          margin="dense"
101          value={password}
102          onChange={({target: {value = ''}}) => setPassword(value)}
103          id="SignUpEmail"
104          name="password"
105          type="password"
106        />
107      </CardContent>
108      <CardActions>
109        <Button
110          color="primary"
111          variant="contained"
112          type="submit"
113          disabled={!canSubmit}
114          aria-disabled={!canSubmit}
115          id="SignUpSubmit"
116        >
117          {t('signup.submit')}
118          {isLoading && (
119            <CircularProgress class={classes.loader} size={20} color="white" />
120          )}
121        </Button>
122        <Button id="SignUpLogin" href="/login">
123          {t('signup.login')}
124        </Button>
125      </CardActions>
126    </form>
127  );
128};
129
130const useStyles = makeStyles(theme => ({
131  loader: {
132    marginLeft: '14px',
133  },
134}));
135export default SignUp;