-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
Copy pathLogin.js
More file actions
113 lines (103 loc) · 3.7 KB
/
Login.js
File metadata and controls
113 lines (103 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/* eslint-disable no-unused-vars */
/* eslint-disable max-len */
/* eslint-disable import/extensions */
/* eslint-disable jsx-a11y/label-has-associated-control */
/* eslint-disable react/function-component-definition */
/* eslint-disable jsx-a11y/anchor-is-valid */
import { useMutation } from '@apollo/client';
import React, { useState } from 'react';
import { Link, useNavigate } from 'react-router-dom';
import { signup } from '../../../config/content';
import LOGIN from '../../../graphql/mutation/login';
import { toErrorMap } from '../../../utils/toErrorMap';
import {
ButtonContainer,
FormContentRight,
FormDiv,
FormH1,
FormH2,
FormInput,
FormInputBtn,
FormInputs,
FormInputsP,
FormLabel,
} from './styles';
const FormLogin = () => {
const [login, { loading, error }] = useMutation(LOGIN);
const history = useNavigate();
const [isUsernameOrEmailError, setIsUsernameOrEmailError] = useState(false);
const [isPasswordError, setIsPasswordError] = useState(false);
const [usernameOrEmailErrorMessage, setUsernameOrEmailErrorMessage] = useState('');
const [passwordErrorMessage, setPasswordErrorMessage] = useState('');
const resetErrorStateValues = () => {
setIsUsernameOrEmailError(false);
setIsPasswordError(false);
setUsernameOrEmailErrorMessage('');
setPasswordErrorMessage('');
};
const handleSubmit = async (event) => {
event.preventDefault();
resetErrorStateValues();
const data = new FormData(event.currentTarget);
const usernameOrEmail = data.get('email');
const password = data.get('password');
const response = await login({
variables: {
userInfo: { usernameOrEmail, password },
},
});
if (response.data?.login.errors) {
const errorMapped = toErrorMap(response.data.login.errors);
if (errorMapped.usernameOrEmail) {
setUsernameOrEmailErrorMessage(errorMapped.usernameOrEmail);
setIsUsernameOrEmailError(true);
}
if (!/\S+@\S+\.\S+/.test(usernameOrEmail)) {
setUsernameOrEmailErrorMessage('Invalid email');
setIsUsernameOrEmailError(true);
}
if (errorMapped.password) {
setPasswordErrorMessage(errorMapped.password);
setIsPasswordError(true);
}
if (!password) {
setPasswordErrorMessage('Password required');
setIsPasswordError(true);
}
if (password.length < 6) {
setPasswordErrorMessage('Password needs to be 6 characters or more');
setIsPasswordError(true);
}
} else if (response.data?.login.user) {
resetErrorStateValues();
history.push('/journal');
}
};
return (
<FormContentRight>
<FormDiv onSubmit={handleSubmit}>
<FormH1>{signup.head}</FormH1>
<FormH2>{signup.head2}</FormH2>
<FormInputs>
<FormLabel htmlFor='email'>{signup.labelEmail}</FormLabel>
<FormInput id='email' label='Email Address' type='email' name='email' />
{isUsernameOrEmailError && <FormInputsP>{usernameOrEmailErrorMessage}</FormInputsP>}
</FormInputs>
<FormInputs>
<FormLabel htmlFor='password'>{signup.labelPassword}</FormLabel>
<FormInput id='password' label='Password' type='password' name='password' />
{isPasswordError && <FormInputsP>{passwordErrorMessage}</FormInputsP>}
</FormInputs>
<ButtonContainer>
<FormInputBtn type='submit'>{signup.buttonLogin}</FormInputBtn>
<FormInputBtn primary type='button'>
<Link to='/Signup' style={{ color: '#EA8900', hover: '#fff' }}>
{signup.button}
</Link>
</FormInputBtn>
</ButtonContainer>
</FormDiv>
</FormContentRight>
);
};
export default FormLogin;