Skip to content
Snippets Groups Projects
SignInForm.tsx 2.03 KiB
Newer Older
import React, { FC } from 'react';
import { useForm } from 'react-hook-form';
Defendi Alberto's avatar
Defendi Alberto committed
import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';
Defendi Alberto's avatar
Defendi Alberto committed
import TextField from '@material-ui/core/TextField';
import Button from '@material-ui/core/Button';

const useStyles = makeStyles((theme: Theme) =>
  createStyles({
    root: {
      '& > *': {
        margin: theme.spacing(0),
      },
    },
    form: {
      width: '100%', // Fix IE 11 issue.
      marginTop: theme.spacing(1),
    },
    submit: {
      margin: theme.spacing(3, 0, 2),
    },
  }),
);

export const SignInForm: FC = () => {
  type FormData = {
Defendi Alberto's avatar
Defendi Alberto committed
    email: string;
    password: string;
Defendi Alberto's avatar
Defendi Alberto committed

  const defaultValues: FormData = {
Defendi Alberto's avatar
Defendi Alberto committed
    email: '',
    password: '',
  };

  const { register, errors, handleSubmit, getValues } = useForm({
    defaultValues,
  });

  const onSubmit = handleSubmit((values: FormData) => {
    // Send data
  });
Defendi Alberto's avatar
Defendi Alberto committed

Defendi Alberto's avatar
Defendi Alberto committed
  const classes = useStyles();

  return (
    <form className={classes.form} onSubmit={onSubmit} data-testid="Form">
Defendi Alberto's avatar
Defendi Alberto committed
      <TextField
        variant="outlined"
        margin="normal"
        required
        fullWidth
        id="email"
        label="Email Address"
        name="email"
        autoComplete="email"
        autoFocus
        inputRef={register({
          required: 'Required',
          validate: {
            emailEqual: (value) => value === getValues().email || 'Error',
          },
        })}
Defendi Alberto's avatar
Defendi Alberto committed
      />
      {errors.email && errors.email.message}
Defendi Alberto's avatar
Defendi Alberto committed
      <TextField
        variant="outlined"
        margin="normal"
        required
        fullWidth
        name="password"
        label="Password"
        type="password"
        id="password"
        autoComplete="current-password"
        inputRef={register({
          required: 'Required',
          min: 8,
          max: 60,
        })}
Defendi Alberto's avatar
Defendi Alberto committed
      />
Defendi Alberto's avatar
Defendi Alberto committed
      <Button
        type="submit"
        fullWidth
        variant="contained"
        color="primary"
Defendi Alberto's avatar
Defendi Alberto committed
        data-testid="Submit"
Defendi Alberto's avatar
Defendi Alberto committed
        className={classes.submit}
      >
        Sign In
      </Button>
    </form>
  );
};