diff --git a/src/__tests__/reducer.setSubmitSuceeded.spec.js b/src/__tests__/reducer.setSubmitSuceeded.spec.js index 332f17aa4..2c90a4b80 100644 --- a/src/__tests__/reducer.setSubmitSuceeded.spec.js +++ b/src/__tests__/reducer.setSubmitSuceeded.spec.js @@ -31,7 +31,8 @@ const describeSetSubmitSucceeded = (reducer, expect, { fromJS }) => () => { foo: { doesnt: 'matter', should: 'change', - submitSucceeded: true + submitSucceeded: true, + submitting: true } }) }) @@ -50,7 +51,8 @@ const describeSetSubmitSucceeded = (reducer, expect, { fromJS }) => () => { foo: { doesnt: 'matter', should: 'notchange', - submitSucceeded: true + submitSucceeded: true, + submitting: true } }) }) diff --git a/src/__tests__/reduxForm.spec.js b/src/__tests__/reduxForm.spec.js index 9fe80f591..fec885491 100644 --- a/src/__tests__/reduxForm.spec.js +++ b/src/__tests__/reduxForm.spec.js @@ -10,6 +10,7 @@ import createReducer from '../reducer' import createReduxForm from '../reduxForm' import createField from '../Field' import createFieldArray from '../FieldArray' +import { startSubmit } from '../actions'; import plain from '../structure/plain' import plainExpectations from '../structure/plain/expectations' import immutable from '../structure/immutable' @@ -2746,6 +2747,111 @@ const describeReduxForm = (name, structure, combineReducers, expect) => { expect(inputRender.calls.length).toBe(3) expect(inputRender.calls[ 2 ].arguments[ 0 ].input.value).toBe('fooChanged') }) + it('startSubmit in onSubmit promise', () => { + const store = makeStore({}) + class Form extends Component { + render() { + const { handleSubmit } = this.props; + return ( +
+ + + ) + } + } + const resolvedProm = Promise.resolve(); + const Decorated = reduxForm({ + form: 'testForm', + destroyOnUnmount: false, + onSubmit(data, dispatch) { + dispatch(startSubmit('testForm')); + + return resolvedProm; + } + })(Form) + + const dom = TestUtils.renderIntoDocument( + + + + ); + + // unmount form + const stub = TestUtils.findRenderedComponentWithType(dom, Decorated) + stub.submit() + + + return resolvedProm.then(() => { + // form state not destroyed (just fields unregistered) + expect(store.getState()).toEqualMap({ + form: { + testForm: { + anyTouched: true, + fields: { + foo: { + touched: true + } + }, + registeredFields: [{ + name: 'foo', + type: 'Field' + }], + submitSucceeded: true + } + } + }) + }) + }) + it('startSubmit in onSubmit sync', () => { + const store = makeStore({}) + class Form extends Component { + render() { + const { handleSubmit } = this.props + return ( +
+ + + ) + } + } + const Decorated = reduxForm({ + form: 'testForm', + destroyOnUnmount: false, + onSubmit(data, dispatch) { + dispatch(startSubmit('testForm')) + } + })(Form) + + const dom = TestUtils.renderIntoDocument( + + + + ) + + // unmount form + const stub = TestUtils.findRenderedComponentWithType(dom, Decorated) + stub.submit() + + // form state not destroyed (just fields unregistered) + expect(store.getState()).toEqualMap({ + form: { + testForm: { + anyTouched: true, + fields: { + foo: { + touched: true + } + }, + registeredFields: [{ + name: 'foo', + type: 'Field' + }], + submitting: true, + submitSucceeded: true + } + } + }) + }) }) } diff --git a/src/reducer.js b/src/reducer.js index d39a3a945..c6a12a4b0 100644 --- a/src/reducer.js +++ b/src/reducer.js @@ -298,7 +298,6 @@ const createReducer = structure => { let result = state result = deleteIn(result, 'submitFailed') result = setIn(result, 'submitSucceeded', true) - result = deleteIn(result, 'submitting') return result }, [TOUCH](state, { meta: { fields } }) {