all files / src/ readFields.js

100% Statements 43/43
100% Branches 22/22
100% Functions 6/6
100% Lines 24/24
6 statements, 1 function, 4 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         179×   179× 179× 178× 178× 178× 178× 178× 178× 339× 31× 31×   339× 89×     196×     178× 347×   178×                 178×      
import readField from './readField';
import write from './write';
import getValues from './getValues';
import removeField from './removeField';
 
/**
 * Reads props and generates (or updates) field structure
 */
const readFields = (props, previousProps, myFields, asyncValidate, isReactNative) => {
  const {fields, form, validate, initialValues} = props;
  const previousFields = previousProps.fields;
  const values = form._initialized === false ? initialValues : getValues(fields, form);
  const syncErrors = validate(values, props) || {};
  let errors = {};
  const formError = syncErrors._error || form._error;
  let allValid = !formError;
  let allPristine = true;
  const tally = field => {
    if (field.error) {
      errors = write(field.name, field.error, errors);
      allValid = false;
    }
    if (field.dirty) {
      allPristine = false;
    }
  };
  const fieldObjects = previousFields ? previousFields.reduce((accumulator, previousField) =>
    ~fields.indexOf(previousField) ? accumulator : removeField(accumulator, previousField),
    {...myFields}) : {...myFields};
  fields.forEach(name => {
    readField(form, name, undefined, fieldObjects, syncErrors, asyncValidate, isReactNative, props, tally);
  });
  Object.defineProperty(fieldObjects, '_meta', {
    value: {
      allPristine,
      allValid,
      values,
      errors,
      formError
    }
  });
  return fieldObjects;
};
export default readFields;