/
login-form-handler.js
115 lines (96 loc) · 3.03 KB
/
login-form-handler.js
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
114
115
import React, { createFactory } from 'react';
import { omit, isEmpty } from 'lodash';
import { setDisplayName, wrapDisplayName } from 'recompose';
import v3 from 'uuid/v3';
import { VIEWER_QUERY } from './query';
export default () => (BaseComponent) => {
const BaseFactory = createFactory(BaseComponent);
class LoginFormHandler extends React.PureComponent {
constructor(props) {
super(props);
this.reset = this.reset.bind(this);
this.valid = this.valid.bind(this);
this.printErrors = this.printErrors.bind(this);
this.processResults = this.processResults.bind(this);
this.onChange = this.onChange.bind(this);
this.onSubmit = this.onSubmit.bind(this);
this.state = {};
}
componentWillMount() {
this.reset();
}
valid() {
const { username, password } = this.state.form;
const errors = {};
if (username.length < 1) errors.user = true;
if (password.length < 1) errors.pass = true;
if (!isEmpty(errors)) {
this.setState({form: this.printErrors(errors)});
return false;
};
this.setState({ form: { username, password } });
return true;
}
printErrors({ user, pass }) {
const formError = undefined
const userFieldError = (user) ? 'You must enter a username': undefined;
const passFieldError = (pass) ? 'You must enter a password': undefined;
return Object.assign(this.state.form, { formError, userFieldError, passFieldError });
}
processResults(payload) {
const { data: { login } } = payload;
if (login && login.authToken) {
this.props.login(login.authToken);
}
}
onChange({ target: { name, value } }) {
const form = Object.assign(this.state.form, { [name]: value });
this.setState(form);
}
onSubmit(event) {
event.preventDefault();
const { mutate } = this.props;
const { password, username } = this.state.form;
// Validate
if(!this.valid()) return;
// Mutate
mutate({
variables: { clientId: v3(`${password}${username}`, v3.URL), username, password },
refetchQueries: [{ query: VIEWER_QUERY }],
})
.then(payload => {
this.processResults(payload)
})
.catch(err => {
const form = Object.assign({ formError: 'Invalid Login' }, this.state.form)
this.setState({ form });
});
}
reset(event) {
this.setState({
form: {
username: '',
password: '',
}
});
}
render() {
const { onChange, onSubmit } = this;
const { form } = this.state;
const newProps = {
...omit(this.props, [
'login', 'logout', 'mutate', 'loggedIn',
'data'
]),
...form,
onChange,
onSubmit,
};
return <BaseFactory {...newProps} />;
}
}
if (process.env.NODE_ENV !== 'production') {
return setDisplayName(wrapDisplayName(BaseComponent, 'loginFormHandler'))(LoginFormHandler)
}
return LoginFormHandler;
}