all files / src/ handleSubmit.js

100% Statements 50/50
96.15% Branches 25/26
100% Functions 6/6
100% Lines 33/33
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 57 58 59 60 61   17×         17×   17× 14× 11× 11×                 14×                              
import isPromise from 'is-promise';
import isValid from './isValid';
 
const handleSubmit = (submit, values, props, asyncValidate) => {
  const {
    dispatch, fields, onSubmitSuccess, onSubmitFail, startSubmit, stopSubmit,
    submitFailed, returnRejectedSubmitPromise, touch, validate
  } = props;
  const syncErrors = validate(values, props);
  touch(...fields); // touch all fields
  if (isValid(syncErrors)) {
    const doSubmit = () => {
      const result = submit(values, dispatch);
      if (isPromise(result)) {
        startSubmit();
        return result.then(submitResult => {
          stopSubmit();
          if (onSubmitSuccess) {
            onSubmitSuccess(submitResult);
          }
          return submitResult;
        }, submitError => {
          stopSubmit(submitError);
          if (onSubmitFail) {
            onSubmitFail(submitError);
          }
          if (returnRejectedSubmitPromise) {
            return Promise.reject(submitError);
          }
        });
      }
      if (onSubmitSuccess) {
        onSubmitSuccess(result);
      }
      return result;
    };
    const asyncValidateResult = asyncValidate();
    return isPromise(asyncValidateResult) ?
      // asyncValidateResult will be rejected if async validation failed
      asyncValidateResult.then(doSubmit, () => {
        submitFailed();
        if (onSubmitFail) {
          onSubmitFail();
        }
        return returnRejectedSubmitPromise ? Promise.reject() : Promise.resolve();
      }) :
      doSubmit(); // no async validation, so submit
  }
  submitFailed();
 
  Eif (onSubmitFail) {
    onSubmitFail(syncErrors);
  }
 
  if (returnRejectedSubmitPromise) {
    return Promise.reject(syncErrors);
  }
};
 
export default handleSubmit;