2018-10-01 14:01:20 -07:00
|
|
|
import React from 'react';
|
|
|
|
import { connect } from 'react-redux';
|
2019-02-04 12:45:11 -08:00
|
|
|
import { Form, Input, Button, Checkbox, Alert } from 'antd';
|
2018-12-14 11:36:22 -08:00
|
|
|
import { FormComponentProps } from 'antd/lib/form';
|
2018-10-01 14:01:20 -07:00
|
|
|
import { authActions } from 'modules/auth';
|
|
|
|
import { AppState } from 'store/reducers';
|
2018-12-14 11:36:22 -08:00
|
|
|
import PasswordFormItems from 'components/PasswordFormItems';
|
2018-10-01 14:01:20 -07:00
|
|
|
import './SignUp.less';
|
2019-02-04 12:45:11 -08:00
|
|
|
import { Link } from 'react-router-dom';
|
2018-10-01 14:01:20 -07:00
|
|
|
|
|
|
|
interface StateProps {
|
|
|
|
isCreatingUser: AppState['auth']['isCreatingUser'];
|
|
|
|
createUserError: AppState['auth']['createUserError'];
|
|
|
|
}
|
|
|
|
|
|
|
|
interface DispatchProps {
|
|
|
|
createUser: typeof authActions['createUser'];
|
|
|
|
}
|
|
|
|
|
2018-12-14 11:36:22 -08:00
|
|
|
type Props = StateProps & DispatchProps & FormComponentProps;
|
2018-10-01 14:01:20 -07:00
|
|
|
|
2018-12-14 11:36:22 -08:00
|
|
|
class SignUp extends React.Component<Props> {
|
2018-10-01 14:01:20 -07:00
|
|
|
render() {
|
2018-12-14 11:36:22 -08:00
|
|
|
const { isCreatingUser, createUserError } = this.props;
|
|
|
|
const { getFieldDecorator } = this.props.form;
|
2018-10-01 14:01:20 -07:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="SignUp">
|
|
|
|
<div className="SignUp-container">
|
2018-12-14 11:36:22 -08:00
|
|
|
<Form className="SignUp-form" onSubmit={this.handleSubmit}>
|
2018-10-01 14:01:20 -07:00
|
|
|
<Form.Item className="SignUp-form-item" label="Display name">
|
2018-12-14 11:36:22 -08:00
|
|
|
{getFieldDecorator('name', {
|
|
|
|
rules: [{ required: true, message: 'Please add a display name' }],
|
|
|
|
})(
|
|
|
|
<Input
|
|
|
|
name="name"
|
|
|
|
placeholder="Non-unique name that others will see you as"
|
|
|
|
autoComplete="name"
|
2019-03-18 12:05:08 -07:00
|
|
|
maxLength={50}
|
2018-12-14 11:36:22 -08:00
|
|
|
/>,
|
|
|
|
)}
|
2018-10-01 14:01:20 -07:00
|
|
|
</Form.Item>
|
|
|
|
|
2018-10-01 16:22:56 -07:00
|
|
|
<Form.Item className="SignUp-form-item" label="Title">
|
2018-12-14 11:36:22 -08:00
|
|
|
{getFieldDecorator('title', {
|
|
|
|
rules: [{ required: true, message: 'Please add your title' }],
|
|
|
|
})(
|
|
|
|
<Input
|
|
|
|
name="title"
|
|
|
|
placeholder="A short description about you, e.g. Core Ethereum Developer"
|
2019-03-18 12:05:08 -07:00
|
|
|
maxLength={50}
|
2018-12-14 11:36:22 -08:00
|
|
|
/>,
|
|
|
|
)}
|
2018-10-01 16:22:56 -07:00
|
|
|
</Form.Item>
|
|
|
|
|
2018-10-01 14:01:20 -07:00
|
|
|
<Form.Item className="SignUp-form-item" label="Email address">
|
2018-12-14 11:36:22 -08:00
|
|
|
{getFieldDecorator('email', {
|
|
|
|
rules: [
|
|
|
|
{ type: 'email', message: 'Invalid email' },
|
|
|
|
{ required: true, message: 'Please enter your email' },
|
|
|
|
],
|
|
|
|
})(
|
|
|
|
<Input
|
|
|
|
name="email"
|
|
|
|
placeholder="We promise not to spam you or share your email"
|
|
|
|
autoComplete="username"
|
2019-03-18 12:05:08 -07:00
|
|
|
maxLength={255}
|
2018-12-14 11:36:22 -08:00
|
|
|
/>,
|
|
|
|
)}
|
2018-10-01 14:01:20 -07:00
|
|
|
</Form.Item>
|
|
|
|
|
2018-12-14 11:36:22 -08:00
|
|
|
<PasswordFormItems form={this.props.form} />
|
2018-10-01 16:22:56 -07:00
|
|
|
|
2019-02-04 12:45:11 -08:00
|
|
|
<Form.Item className="SignUp-form-legal">
|
|
|
|
{getFieldDecorator('hasAgreed', {
|
|
|
|
rules: [
|
|
|
|
{ required: true, message: 'You must agree to create an account' },
|
|
|
|
],
|
|
|
|
})(
|
|
|
|
<Checkbox name="hasAgreed">
|
|
|
|
<span className="SignUp-form-legal-text">
|
|
|
|
I agree to the{' '}
|
|
|
|
<Link target="_blank" to="/code-of-conduct">
|
|
|
|
code of conduct
|
|
|
|
</Link>
|
|
|
|
,{' '}
|
|
|
|
<Link target="_blank" to="/tos">
|
|
|
|
terms of service
|
|
|
|
</Link>
|
|
|
|
, and{' '}
|
|
|
|
<Link target="_blank" to="/privacy">
|
|
|
|
privacy policy
|
|
|
|
</Link>
|
|
|
|
.
|
|
|
|
</span>
|
|
|
|
</Checkbox>,
|
|
|
|
)}
|
|
|
|
</Form.Item>
|
|
|
|
|
2018-12-14 11:36:22 -08:00
|
|
|
<div className="SignUp-form-controls">
|
|
|
|
<Button
|
|
|
|
type="primary"
|
|
|
|
htmlType="submit"
|
|
|
|
size="large"
|
|
|
|
block
|
|
|
|
loading={isCreatingUser}
|
|
|
|
>
|
|
|
|
Create account
|
|
|
|
</Button>
|
|
|
|
</div>
|
2018-10-01 16:22:56 -07:00
|
|
|
{createUserError && (
|
|
|
|
<Alert
|
|
|
|
type="error"
|
|
|
|
message={createUserError}
|
|
|
|
showIcon
|
|
|
|
closable
|
2018-12-14 11:36:22 -08:00
|
|
|
className="SignUp-form-alert"
|
2018-10-01 16:22:56 -07:00
|
|
|
/>
|
|
|
|
)}
|
2018-10-01 14:01:20 -07:00
|
|
|
</Form>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private handleSubmit = (ev: React.FormEvent<HTMLFormElement>) => {
|
|
|
|
ev.preventDefault();
|
2018-12-14 11:36:22 -08:00
|
|
|
const { createUser } = this.props;
|
|
|
|
this.props.form.validateFieldsAndScroll((err: any, values: any) => {
|
|
|
|
if (!err) {
|
|
|
|
delete values.passwordConfirm;
|
|
|
|
createUser(values);
|
|
|
|
}
|
|
|
|
});
|
2018-10-01 14:01:20 -07:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-12-14 11:36:22 -08:00
|
|
|
const FormWrappedSignUp = Form.create()(SignUp);
|
|
|
|
|
|
|
|
export default connect<StateProps, DispatchProps, {}, AppState>(
|
2018-10-01 14:01:20 -07:00
|
|
|
state => ({
|
|
|
|
isCreatingUser: state.auth.isCreatingUser,
|
|
|
|
createUserError: state.auth.createUserError,
|
|
|
|
}),
|
|
|
|
{
|
|
|
|
createUser: authActions.createUser,
|
|
|
|
},
|
2018-12-14 11:36:22 -08:00
|
|
|
)(FormWrappedSignUp);
|