erikras/redux-form

View on GitHub
src/FormSection.js

Summary

Maintainability
A
0 mins
Test Coverage
// @flow
import React, { createElement, Component } from 'react'
import PropTypes from 'prop-types'
import prefixName from './util/prefixName'
import { withReduxForm, ReduxFormContext } from './ReduxFormContext'
import type { ReactContext } from './types'
import validateComponentProp from './util/validateComponentProp'

export type Props = {
  name: string,
  component: Function | string,
  children: any
}

type PropsWithContext = ReactContext & Props

export type DefaultProps = {
  component: Function | string
}

class FormSection extends Component<PropsWithContext> {
  static defaultProps: DefaultProps
  context: ReactContext

  constructor(props: PropsWithContext) {
    super(props)
    if (!props._reduxForm) {
      throw new Error(
        'FormSection must be inside a component decorated with reduxForm()'
      )
    }
  }

  render() {
    const {
      _reduxForm,
      children,
      name, // eslint-disable-line no-unused-vars
      component,
      ...rest
    } = this.props

    if (React.isValidElement(children)) {
      return createElement(ReduxFormContext.Provider, {
        value: {
          ...this.props._reduxForm,
          sectionPrefix: prefixName(this.props, name)
        },
        children
      })
    }

    return createElement(ReduxFormContext.Provider, {
      value: {
        ...this.props._reduxForm,
        sectionPrefix: prefixName(this.props, name)
      },
      children: createElement(component, {
        ...rest,
        children
      })
    })
  }
}

FormSection.propTypes = {
  name: PropTypes.string.isRequired,
  component: validateComponentProp
}

FormSection.defaultProps = {
  component: 'div'
}

export default withReduxForm(FormSection)