2021-03-26 21:57:41 +08:00
|
|
|
// Copyright 2021 The casbin Authors. All Rights Reserved.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
import React from 'react';
|
2021-03-26 21:58:10 +08:00
|
|
|
import {Link} from "react-router-dom";
|
2021-03-26 21:57:41 +08:00
|
|
|
import {Form, Input, Select, Checkbox, Button, Row, Col} from 'antd';
|
|
|
|
import * as Setting from "../Setting";
|
|
|
|
import * as AuthBackend from "./AuthBackend";
|
|
|
|
|
|
|
|
const { Option } = Select;
|
|
|
|
|
|
|
|
const formItemLayout = {
|
|
|
|
labelCol: {
|
|
|
|
xs: {
|
|
|
|
span: 24,
|
|
|
|
},
|
|
|
|
sm: {
|
|
|
|
span: 8,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
wrapperCol: {
|
|
|
|
xs: {
|
|
|
|
span: 24,
|
|
|
|
},
|
|
|
|
sm: {
|
|
|
|
span: 16,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const tailFormItemLayout = {
|
|
|
|
wrapperCol: {
|
|
|
|
xs: {
|
|
|
|
span: 24,
|
|
|
|
offset: 0,
|
|
|
|
},
|
|
|
|
sm: {
|
|
|
|
span: 16,
|
|
|
|
offset: 8,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2021-04-27 22:47:44 +08:00
|
|
|
class SignupPage extends React.Component {
|
2021-03-26 21:57:41 +08:00
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
classes: props,
|
|
|
|
};
|
|
|
|
|
|
|
|
this.form = React.createRef();
|
|
|
|
}
|
|
|
|
|
|
|
|
onFinish(values) {
|
2021-04-27 22:47:44 +08:00
|
|
|
AuthBackend.signup(values)
|
2021-03-26 21:57:41 +08:00
|
|
|
.then((res) => {
|
|
|
|
if (res.status === 'ok') {
|
|
|
|
this.props.history.push('/result');
|
|
|
|
} else {
|
2021-04-27 22:47:44 +08:00
|
|
|
Setting.showMessage("error", `Failed to sign up: ${res.msg}`);
|
2021-03-26 21:57:41 +08:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
onFinishFailed(values, errorFields, outOfDate) {
|
|
|
|
this.form.current.scrollToField(errorFields[0].name);
|
|
|
|
}
|
|
|
|
|
|
|
|
renderForm() {
|
|
|
|
const prefixSelector = (
|
|
|
|
<Form.Item name="prefix" noStyle>
|
|
|
|
<Select
|
|
|
|
style={{
|
|
|
|
width: 80,
|
|
|
|
}}
|
|
|
|
>
|
2021-04-27 22:35:14 +08:00
|
|
|
<Option value="1">+1</Option>
|
|
|
|
<Option value="86">+86</Option>
|
2021-03-26 21:57:41 +08:00
|
|
|
</Select>
|
|
|
|
</Form.Item>
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Form
|
|
|
|
{...formItemLayout}
|
|
|
|
ref={this.form}
|
2021-04-27 22:47:44 +08:00
|
|
|
name="signup"
|
2021-03-26 21:57:41 +08:00
|
|
|
onFinish={(values) => this.onFinish(values)}
|
|
|
|
onFinishFailed={(errorInfo) => this.onFinishFailed(errorInfo.values, errorInfo.errorFields, errorInfo.outOfDate)}
|
|
|
|
initialValues={{
|
2021-04-27 22:35:14 +08:00
|
|
|
prefix: '86',
|
2021-03-26 21:57:41 +08:00
|
|
|
}}
|
|
|
|
style={{width: !Setting.isMobile() ? "400px" : "250px"}}
|
|
|
|
size="large"
|
|
|
|
>
|
|
|
|
<Form.Item
|
2021-04-27 22:35:14 +08:00
|
|
|
name="name"
|
2021-03-26 21:57:41 +08:00
|
|
|
label="Username"
|
|
|
|
rules={[
|
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: 'Please input your username',
|
|
|
|
whitespace: true,
|
|
|
|
},
|
|
|
|
]}
|
|
|
|
>
|
|
|
|
<Input />
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
2021-04-27 22:35:14 +08:00
|
|
|
name="displayName"
|
|
|
|
label="Display name"
|
2021-03-26 21:57:41 +08:00
|
|
|
rules={[
|
|
|
|
{
|
|
|
|
required: true,
|
2021-04-27 22:35:14 +08:00
|
|
|
message: 'Please input your display name',
|
2021-03-26 21:57:41 +08:00
|
|
|
whitespace: true,
|
|
|
|
},
|
|
|
|
]}
|
|
|
|
>
|
|
|
|
<Input />
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
2021-04-27 22:35:14 +08:00
|
|
|
name="affiliation"
|
|
|
|
label="Affiliation"
|
2021-03-26 21:57:41 +08:00
|
|
|
rules={[
|
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: 'Please input your affiliation',
|
|
|
|
whitespace: true,
|
|
|
|
},
|
|
|
|
]}
|
|
|
|
>
|
|
|
|
<Input />
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
|
|
|
name="email"
|
|
|
|
label="Email"
|
|
|
|
rules={[
|
|
|
|
{
|
|
|
|
type: 'email',
|
|
|
|
message: 'The input is not valid Email!',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: 'Please input your Email',
|
|
|
|
},
|
|
|
|
]}
|
|
|
|
>
|
|
|
|
<Input />
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
|
|
|
name="password"
|
|
|
|
label="Password"
|
|
|
|
rules={[
|
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: 'Please input your password',
|
|
|
|
},
|
|
|
|
]}
|
|
|
|
hasFeedback
|
|
|
|
>
|
|
|
|
<Input.Password />
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
|
|
|
name="confirm"
|
|
|
|
label="Confirm"
|
|
|
|
dependencies={['password']}
|
|
|
|
hasFeedback
|
|
|
|
rules={[
|
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: 'Please confirm your password',
|
|
|
|
},
|
|
|
|
({ getFieldValue }) => ({
|
|
|
|
validator(rule, value) {
|
|
|
|
if (!value || getFieldValue('password') === value) {
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
return Promise.reject('Your confirmed password is inconsistent with the password');
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
]}
|
|
|
|
>
|
|
|
|
<Input.Password />
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
2021-04-27 22:35:14 +08:00
|
|
|
name="phone"
|
|
|
|
label="Phone number"
|
2021-03-26 21:57:41 +08:00
|
|
|
rules={[
|
|
|
|
{
|
|
|
|
required: true,
|
2021-04-27 22:35:14 +08:00
|
|
|
message: 'Please confirm your phone number',
|
2021-03-26 21:57:41 +08:00
|
|
|
},
|
|
|
|
]}
|
|
|
|
>
|
|
|
|
<Input
|
|
|
|
addonBefore={prefixSelector}
|
|
|
|
style={{
|
|
|
|
width: '100%',
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item name="agreement" valuePropName="checked" {...tailFormItemLayout}>
|
|
|
|
<Checkbox>
|
2021-03-26 21:58:10 +08:00
|
|
|
Accept
|
|
|
|
<Link to={"/agreement"}>
|
|
|
|
Terms of Use
|
|
|
|
</Link>
|
2021-03-26 21:57:41 +08:00
|
|
|
</Checkbox>
|
|
|
|
</Form.Item>
|
|
|
|
<Form.Item {...tailFormItemLayout}>
|
|
|
|
<Button type="primary" htmlType="submit">
|
2021-03-28 08:59:12 +08:00
|
|
|
Sign Up
|
2021-03-26 21:57:41 +08:00
|
|
|
</Button>
|
2021-03-26 21:58:10 +08:00
|
|
|
Have account?
|
|
|
|
<Link to={"/login"}>
|
|
|
|
sign in now
|
2021-03-26 21:57:41 +08:00
|
|
|
</Link>
|
|
|
|
</Form.Item>
|
|
|
|
</Form>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
return (
|
|
|
|
<div>
|
|
|
|
|
|
|
|
<Row>
|
|
|
|
<Col span={24} style={{display: "flex", justifyContent: "center"}} >
|
|
|
|
{
|
|
|
|
this.renderForm()
|
|
|
|
}
|
|
|
|
</Col>
|
|
|
|
</Row>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-27 22:47:44 +08:00
|
|
|
export default SignupPage;
|