repo_description: A Higher Order Component using react-redux to keep form state in a Redux store
repo_topics: form form-validation forms react redux redux-form validation
code: // @flow
  import invariant from 'invariant'
  import plain from './structure/plain'
  import type { Structure, GetFormState } from './types'
  import type { FormValueSelectorInterface } from './formValueSelector.types'
  
  export default function createFormValueSelector({ getIn }: Structure<any, any>) {
    return (form: string, getFormState: ?GetFormState): FormValueSelectorInterface => {
      invariant(form, 'Form value must be specified')
      const nonNullGetFormState: GetFormState = getFormState || (state => getIn(state, 'form'))
      return (state: any, ...fields: string[]) => {
        invariant(fields.length, 'No fields specified')
        return fields.length === 1
          ? // only selecting one field, so return its value
            getIn(nonNullGetFormState(state), `${form}.values.${fields[0]}`)
          : // selecting many fields, so return an object of field values
            fields.reduce((accumulator, field) => {
              const value = getIn(nonNullGetFormState(state), `${form}.values.${field}`)
              return value === undefined ? accumulator : plain.setIn(accumulator, field, value)
            }, {})
      }
    }
  }
  