import React, { FC } from 'react'; import axios from 'axios'; import { SubmitHandler, useForm } from 'react-hook-form'; import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import { Button } from '@material-ui/core'; import { InputField } from 'components/AuthUser/SignInForm/InputField/InputField'; import { useHistory } from 'react-router-dom'; import { AuthRoutes } from 'components/api/routes'; 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 = () => { const history = useHistory(); interface FormData { email: string; password: string; } const defaultValues: FormData = { email: '', password: '', }; const { control, errors, handleSubmit } = useForm<FormData>({ defaultValues, }); const onSubmit: SubmitHandler<FormData> = (values: FormData) => { axios .post( '/api/web/login', { username: values.email, password: values.password, }, { headers: { 'Content-Type': 'application/json', }, }, ) .then(() => { history.replace(AuthRoutes.dashboard); }); }; const classes = useStyles(); return ( <> <form className={classes.form} onSubmit={handleSubmit(onSubmit)} data-testid="Form" > <InputField name="email" control={control} rules={{ validate: (value: string) => /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(value), required: { value: true, message: 'Email is not valid', }, }} label="Email" error={!!errors.email} errorMessage="Insert email" /> <InputField name="password" control={control} rules={{ minLength: 8, maxLength: 60, required: { value: true, message: 'Insert valid password', }, }} label="Password" error={!!errors.password} errorMessage="Insert valid password" /> <Button data-testid="Submit" type="submit" fullWidth variant="contained" color="primary" className={classes.submit} > Sign In </Button> </form> </> ); };