| /** |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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, { Component } from 'react'; |
| import PropTypes from 'prop-types'; |
| import { Form, Button, Row, Col } from 'antd'; |
| import omit from 'omit.js'; |
| import styles from './index.less'; |
| import map from './map'; |
| |
| const FormItem = Form.Item; |
| |
| function generator({ defaultProps, defaultRules, type }) { |
| return (WrappedComponent) => { |
| return class BasicComponent extends Component { |
| static contextTypes = { |
| form: PropTypes.object, |
| updateActive: PropTypes.func, |
| }; |
| |
| constructor(props) { |
| super(props); |
| this.state = { |
| count: 0, |
| }; |
| } |
| |
| componentDidMount() { |
| const {...contextData} = this.context; |
| const {...propsData} = this.props; |
| if (contextData.updateActive) { |
| contextData.updateActive(propsData.name); |
| } |
| } |
| |
| componentWillUnmount() { |
| clearInterval(this.interval); |
| } |
| |
| onGetCaptcha = () => { |
| let count = 59; |
| const {...propsData} = this.props; |
| this.setState({ count }); |
| if (propsData.onGetCaptcha) { |
| propsData.onGetCaptcha(); |
| } |
| this.interval = setInterval(() => { |
| count -= 1; |
| this.setState({ count }); |
| if (count === 0) { |
| clearInterval(this.interval); |
| } |
| }, 1000); |
| }; |
| |
| render() { |
| const {...contextData} = this.context; |
| const { getFieldDecorator } = contextData.form; |
| const options = {}; |
| let otherProps = {}; |
| const { onChange, defaultValue, rules, name, ...restProps } = this.props; |
| const { count } = this.state; |
| options.rules = rules || defaultRules; |
| if (onChange) { |
| options.onChange = onChange; |
| } |
| if (defaultValue) { |
| options.initialValue = defaultValue; |
| } |
| otherProps = restProps || otherProps; |
| if (type === 'Captcha') { |
| const inputProps = omit(otherProps, ['onGetCaptcha']); |
| return ( |
| <FormItem> |
| <Row gutter={8}> |
| <Col span={16}> |
| {getFieldDecorator(name, options)( |
| <WrappedComponent {...defaultProps} {...inputProps} /> |
| )} |
| </Col> |
| <Col span={8}> |
| <Button |
| disabled={count} |
| className={styles.getCaptcha} |
| size="large" |
| onClick={this.onGetCaptcha} |
| > |
| {count ? `${count} s` : 'Get Verification code'} |
| </Button> |
| </Col> |
| </Row> |
| </FormItem> |
| ); |
| } |
| return ( |
| <FormItem> |
| {getFieldDecorator(name, options)( |
| <WrappedComponent {...defaultProps} {...otherProps} /> |
| )} |
| </FormItem> |
| ); |
| } |
| }; |
| }; |
| } |
| |
| const LoginItem = {}; |
| Object.keys(map).forEach((item) => { |
| LoginItem[item] = generator({ |
| defaultProps: map[item].props, |
| defaultRules: map[item].rules, |
| type: item, |
| })(map[item].component); |
| }); |
| |
| export default LoginItem; |