all files / src/ createField.js

97.7% Statements 85/87
95.35% Branches 41/43
100% Functions 17/17
88.24% Lines 15/17
11 statements, 2 functions, 16 branches Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56                                                                                   
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux'
import createFieldProps from './createFieldProps'
import bindActionData from './bindActionData'
 
const createField = ({ getIn }) => {
 
  const createConnectedField = ({ blur, change, focus, getFormState }, name) => {
    const actions = bindActionData({ blur, change, focus }, { field: name })
    return connect(
      state => ({
        initial: getIn(getFormState(state), `initial.${name}`),
        value: getIn(getFormState(state), `values.${name}`),
        state: getIn(getFormState(state), `fields.${name}`)
      })
    )(({ component, ...props }) => {
      const Component = component // gotta make this uppercase for some reason
      return <Component {...createFieldProps(getIn, name, {...props, ...actions})}/>
    })
  }
 
  class Field extends Component {
    constructor(props, context) {
      super(props, context)
      if (!context._reduxForm) {
        throw new Error('Field must be inside a component decorated with reduxForm()')
      }
      this.ConnectedField = createConnectedField(context._reduxForm, props.name)
    }
 
    componentWillReceiveProps(nextProps) {
      if (this.props.name !== nextProps.name) {
        // name changed, regenerate connected field
        this.ConnectedField = createConnectedField(this.context._reduxForm, nextProps.name)
      }
    }
 
    render() {
      const { ConnectedField } = this
      return <ConnectedField {...this.props}/>
    }
  }
 
  Field.propTypes = {
    name: PropTypes.string.isRequired,
    component: PropTypes.func.isRequired
  }
  Field.contextTypes = {
    _reduxForm: PropTypes.object
  }
 
  return Field
}
 
export default createField