2020-01-16 02:13:42 +00:00
|
|
|
import React, { useState } from 'react';
|
|
|
|
import './Login.scss';
|
2020-01-18 08:18:51 +00:00
|
|
|
import authServices from '../../services/authServices';
|
|
|
|
import FormError from '../FormError/FormError';
|
2020-01-16 02:13:42 +00:00
|
|
|
|
2020-01-16 23:21:23 +00:00
|
|
|
const Login = (props) => {
|
2020-01-16 02:13:42 +00:00
|
|
|
const [username, setUsername] = useState('');
|
|
|
|
const [password, setPassword] = useState('');
|
2020-01-18 08:18:51 +00:00
|
|
|
const minimumPasswordLength = 8;
|
|
|
|
const errorDispatchAction = {
|
|
|
|
type: 'ERR',
|
|
|
|
message: 'AUTH_ERROR'
|
|
|
|
}
|
|
|
|
|
|
|
|
const validateLoginForm = next => {
|
|
|
|
if (password.length < minimumPasswordLength) {
|
|
|
|
return props.dispatch({
|
|
|
|
...errorDispatchAction,
|
|
|
|
body: { authError: 'This password is invalid'}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!/^[\w\d_.-]+$/.test(username)) {
|
|
|
|
return props.dispatch({
|
|
|
|
...errorDispatchAction,
|
|
|
|
body: { authError: "This username is invalid"}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
next();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const postLoginForm = async () => {
|
|
|
|
const loginResponse = await authServices.loginService({
|
|
|
|
username,
|
|
|
|
password
|
|
|
|
})
|
|
|
|
const parsedResponse = JSON.parse(loginResponse);
|
|
|
|
if (parsedResponse.errors) {
|
|
|
|
const authError = parsedResponse.errors
|
|
|
|
return props.dispatch({
|
|
|
|
...errorDispatchAction,
|
|
|
|
body: { authError }
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return props.dispatch({
|
|
|
|
type: 'AUTH',
|
|
|
|
message: 'LOGIN',
|
|
|
|
body: parsedResponse
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleSubmit = e => {
|
|
|
|
e.preventDefault();
|
|
|
|
validateLoginForm(postLoginForm);
|
|
|
|
}
|
|
|
|
|
|
|
|
const formError = errors => {
|
|
|
|
if(!errors) return <></>;
|
|
|
|
|
|
|
|
if (errors.auth) {
|
|
|
|
return <FormError error={errors.auth}/>
|
|
|
|
}
|
|
|
|
}
|
2020-01-16 02:13:42 +00:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="Login" data-testid="Login">
|
2020-01-18 08:18:51 +00:00
|
|
|
{formError(props.state.errors)}
|
|
|
|
<form
|
|
|
|
data-testid="Login__form"
|
|
|
|
onSubmit={e => handleSubmit(e)}
|
|
|
|
>
|
2020-01-16 02:13:42 +00:00
|
|
|
|
2020-01-16 23:21:23 +00:00
|
|
|
<label htmlFor="username-input">Username:</label>
|
|
|
|
<input
|
|
|
|
name="username"
|
|
|
|
id="username-input"
|
|
|
|
type="text"
|
|
|
|
onChange={e => setUsername(e.target.value)}
|
|
|
|
default="username"
|
|
|
|
/>
|
|
|
|
|
|
|
|
<label htmlFor="password-input">Password:</label>
|
|
|
|
<input
|
|
|
|
name="password"
|
|
|
|
id="password-input"
|
|
|
|
type="text"
|
|
|
|
onChange={e => setPassword(e.target.value)}
|
|
|
|
default=""
|
|
|
|
/>
|
|
|
|
|
|
|
|
<input type="submit" value="Login!" />
|
|
|
|
|
|
|
|
</form>
|
2020-01-16 02:13:42 +00:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
2020-01-16 23:21:23 +00:00
|
|
|
|
2020-01-16 02:13:42 +00:00
|
|
|
export default Login;
|