index.js 2.92 KB
Newer Older
ddcat1115's avatar
ddcat1115 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Form, Tabs } from 'antd';
import classNames from 'classnames';
import LoginItem from './LoginItem';
import LoginTab from './LoginTab';
import LoginSubmit from './LoginSubmit';
import styles from './index.less';

class Login extends Component {
  static propTypes = {
    className: PropTypes.string,
    defaultActiveKey: PropTypes.string,
    onTabChange: PropTypes.func,
    onSubmit: PropTypes.func,
  };
jim's avatar
jim committed
17

ddcat1115's avatar
ddcat1115 committed
18 19 20 21 22
  static childContextTypes = {
    tabUtil: PropTypes.object,
    form: PropTypes.object,
    updateActive: PropTypes.func,
  };
jim's avatar
jim committed
23 24 25 26 27 28 29 30

  static defaultProps = {
    className: '',
    defaultActiveKey: '',
    onTabChange: () => {},
    onSubmit: () => {},
  };

ddcat1115's avatar
ddcat1115 committed
31 32 33 34 35 36 37 38
  state = {
    type: this.props.defaultActiveKey,
    tabs: [],
    active: {},
  };
  getChildContext() {
    return {
      tabUtil: {
jim's avatar
jim committed
39
        addTab: id => {
ddcat1115's avatar
ddcat1115 committed
40 41 42 43
          this.setState({
            tabs: [...this.state.tabs, id],
          });
        },
jim's avatar
jim committed
44
        removeTab: id => {
ddcat1115's avatar
ddcat1115 committed
45 46 47 48 49 50
          this.setState({
            tabs: this.state.tabs.filter(currentId => currentId !== id),
          });
        },
      },
      form: this.props.form,
jim's avatar
jim committed
51
      updateActive: activeItem => {
ddcat1115's avatar
ddcat1115 committed
52 53 54 55 56 57 58 59 60 61 62 63
        const { type, active } = this.state;
        if (active[type]) {
          active[type].push(activeItem);
        } else {
          active[type] = [activeItem];
        }
        this.setState({
          active,
        });
      },
    };
  }
jim's avatar
jim committed
64
  onSwitch = type => {
ddcat1115's avatar
ddcat1115 committed
65 66 67 68
    this.setState({
      type,
    });
    this.props.onTabChange(type);
jim's avatar
jim committed
69 70
  };
  handleSubmit = e => {
ddcat1115's avatar
ddcat1115 committed
71 72 73
    e.preventDefault();
    const { active, type } = this.state;
    const activeFileds = active[type];
jim's avatar
jim committed
74 75 76 77
    this.props.form.validateFields(activeFileds, { force: true }, (err, values) => {
      this.props.onSubmit(err, values);
    });
  };
ddcat1115's avatar
ddcat1115 committed
78 79 80 81 82
  render() {
    const { className, children } = this.props;
    const { type, tabs } = this.state;
    const TabChildren = [];
    const otherChildren = [];
jim's avatar
jim committed
83
    React.Children.forEach(children, item => {
84 85 86
      if (!item) {
        return;
      }
ddcat1115's avatar
ddcat1115 committed
87 88 89 90 91 92 93 94
      // eslint-disable-next-line
      if (item.type.__ANT_PRO_LOGIN_TAB) {
        TabChildren.push(item);
      } else {
        otherChildren.push(item);
      }
    });
    return (
95
      <div className={classNames(className, styles.login)}>
ddcat1115's avatar
ddcat1115 committed
96
        <Form onSubmit={this.handleSubmit}>
jim's avatar
jim committed
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
          {tabs.length ? (
            <div>
              <Tabs
                animated={false}
                className={styles.tabs}
                activeKey={type}
                onChange={this.onSwitch}
              >
                {TabChildren}
              </Tabs>
              {otherChildren}
            </div>
          ) : (
            [...children]
          )}
ddcat1115's avatar
ddcat1115 committed
112 113 114 115 116 117 118 119
        </Form>
      </div>
    );
  }
}

Login.Tab = LoginTab;
Login.Submit = LoginSubmit;
jim's avatar
jim committed
120
Object.keys(LoginItem).forEach(item => {
ddcat1115's avatar
ddcat1115 committed
121 122 123
  Login[item] = LoginItem[item];
});

jim's avatar
jim committed
124
export default Form.create()(Login);