| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- import React, { Component } from 'react';
- import { connect } from 'dva';
- import { formatMessage, FormattedMessage } from 'umi-plugin-react/locale';
- import Link from 'umi/link';
- import router from 'umi/router';
- import { Form, Input, Button, message, Select, Row, Col, Popover, Progress } from 'antd';
- import styles from './Register.less';
- const FormItem = Form.Item;
- const { Option } = Select;
- const InputGroup = Input.Group;
- const passwordStatusMap = {
- ok: (
- <div className={styles.success}>
- <FormattedMessage id="validation.password.strength.strong" />
- </div>
- ),
- pass: (
- <div className={styles.warning}>
- <FormattedMessage id="validation.password.strength.medium" />
- </div>
- ),
- poor: (
- <div className={styles.error}>
- <FormattedMessage id="validation.password.strength.short" />
- </div>
- ),
- };
- const passwordProgressMap = {
- ok: 'success',
- pass: 'normal',
- poor: 'exception',
- };
- @connect(({ register, loading }) => ({
- register,
- submitting: loading.effects['register/submit'],
- }))
- @Form.create()
- class Register extends Component {
- state = {
- count: 0,
- confirmDirty: false,
- visible: false,
- help: '',
- prefix: '86',
- };
- componentDidUpdate() {
- const { form, register } = this.props;
- const account = form.getFieldValue('mail');
- if (register.status === 'ok') {
- router.push({
- pathname: '/user/register-result',
- state: {
- account,
- },
- });
- }
- }
- componentWillUnmount() {
- clearInterval(this.interval);
- }
- onGetCaptcha = () => {
- let count = 59;
- this.setState({ count });
- this.interval = setInterval(() => {
- count -= 1;
- this.setState({ count });
- if (count === 0) {
- clearInterval(this.interval);
- }
- }, 1000);
- message.warning(formatMessage({ id: 'app.login.verification-code-warning' }));
- };
- getPasswordStatus = () => {
- const { form } = this.props;
- const value = form.getFieldValue('password');
- if (value && value.length > 9) {
- return 'ok';
- }
- if (value && value.length > 5) {
- return 'pass';
- }
- return 'poor';
- };
- handleSubmit = e => {
- e.preventDefault();
- const { form, dispatch } = this.props;
- form.validateFields({ force: true }, (err, values) => {
- if (!err) {
- const { prefix } = this.state;
- dispatch({
- type: 'register/submit',
- payload: {
- ...values,
- prefix,
- },
- });
- }
- });
- };
- handleConfirmBlur = e => {
- const { value } = e.target;
- const { confirmDirty } = this.state;
- this.setState({ confirmDirty: confirmDirty || !!value });
- };
- checkConfirm = (rule, value, callback) => {
- const { form } = this.props;
- if (value && value !== form.getFieldValue('password')) {
- callback(formatMessage({ id: 'validation.password.twice' }));
- } else {
- callback();
- }
- };
- checkPassword = (rule, value, callback) => {
- const { visible, confirmDirty } = this.state;
- if (!value) {
- this.setState({
- help: formatMessage({ id: 'validation.password.required' }),
- visible: !!value,
- });
- callback('error');
- } else {
- this.setState({
- help: '',
- });
- if (!visible) {
- this.setState({
- visible: !!value,
- });
- }
- if (value.length < 6) {
- callback('error');
- } else {
- const { form } = this.props;
- if (value && confirmDirty) {
- form.validateFields(['confirm'], { force: true });
- }
- callback();
- }
- }
- };
- changePrefix = value => {
- this.setState({
- prefix: value,
- });
- };
- renderPasswordProgress = () => {
- const { form } = this.props;
- const value = form.getFieldValue('password');
- const passwordStatus = this.getPasswordStatus();
- return value && value.length ? (
- <div className={styles[`progress-${passwordStatus}`]}>
- <Progress
- status={passwordProgressMap[passwordStatus]}
- className={styles.progress}
- strokeWidth={6}
- percent={value.length * 10 > 100 ? 100 : value.length * 10}
- showInfo={false}
- />
- </div>
- ) : null;
- };
- render() {
- const { form, submitting } = this.props;
- const { getFieldDecorator } = form;
- const { count, prefix, help, visible } = this.state;
- return (
- <div className={styles.main}>
- <h3>
- <FormattedMessage id="app.register.register" />
- </h3>
- <Form onSubmit={this.handleSubmit}>
- <FormItem>
- {getFieldDecorator('mail', {
- rules: [
- {
- required: true,
- message: formatMessage({ id: 'validation.email.required' }),
- },
- {
- type: 'email',
- message: formatMessage({ id: 'validation.email.wrong-format' }),
- },
- ],
- })(
- <Input size="large" placeholder={formatMessage({ id: 'form.email.placeholder' })} />
- )}
- </FormItem>
- <FormItem help={help}>
- <Popover
- getPopupContainer={node => node.parentNode}
- content={
- <div style={{ padding: '4px 0' }}>
- {passwordStatusMap[this.getPasswordStatus()]}
- {this.renderPasswordProgress()}
- <div style={{ marginTop: 10 }}>
- <FormattedMessage id="validation.password.strength.msg" />
- </div>
- </div>
- }
- overlayStyle={{ width: 240 }}
- placement="right"
- visible={visible}
- >
- {getFieldDecorator('password', {
- rules: [
- {
- validator: this.checkPassword,
- },
- ],
- })(
- <Input
- size="large"
- type="password"
- placeholder={formatMessage({ id: 'form.password.placeholder' })}
- />
- )}
- </Popover>
- </FormItem>
- <FormItem>
- {getFieldDecorator('confirm', {
- rules: [
- {
- required: true,
- message: formatMessage({ id: 'validation.confirm-password.required' }),
- },
- {
- validator: this.checkConfirm,
- },
- ],
- })(
- <Input
- size="large"
- type="password"
- placeholder={formatMessage({ id: 'form.confirm-password.placeholder' })}
- />
- )}
- </FormItem>
- <FormItem>
- <InputGroup compact>
- <Select
- size="large"
- value={prefix}
- onChange={this.changePrefix}
- style={{ width: '20%' }}
- >
- <Option value="86">+86</Option>
- <Option value="87">+87</Option>
- </Select>
- {getFieldDecorator('mobile', {
- rules: [
- {
- required: true,
- message: formatMessage({ id: 'validation.phone-number.required' }),
- },
- {
- pattern: /^\d{11}$/,
- message: formatMessage({ id: 'validation.phone-number.wrong-format' }),
- },
- ],
- })(
- <Input
- size="large"
- style={{ width: '80%' }}
- placeholder={formatMessage({ id: 'form.phone-number.placeholder' })}
- />
- )}
- </InputGroup>
- </FormItem>
- <FormItem>
- <Row gutter={8}>
- <Col span={16}>
- {getFieldDecorator('captcha', {
- rules: [
- {
- required: true,
- message: formatMessage({ id: 'validation.verification-code.required' }),
- },
- ],
- })(
- <Input
- size="large"
- placeholder={formatMessage({ id: 'form.verification-code.placeholder' })}
- />
- )}
- </Col>
- <Col span={8}>
- <Button
- size="large"
- disabled={count}
- className={styles.getCaptcha}
- onClick={this.onGetCaptcha}
- >
- {count
- ? `${count} s`
- : formatMessage({ id: 'app.register.get-verification-code' })}
- </Button>
- </Col>
- </Row>
- </FormItem>
- <FormItem>
- <Button
- size="large"
- loading={submitting}
- className={styles.submit}
- type="primary"
- htmlType="submit"
- >
- <FormattedMessage id="app.register.register" />
- </Button>
- <Link className={styles.login} to="/User/Login">
- <FormattedMessage id="app.register.sign-in" />
- </Link>
- </FormItem>
- </Form>
- </div>
- );
- }
- }
- export default Register;
|