Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add selectors for submitting, submitSucceeded and submitFailed #2289

Merged
merged 2 commits into from
Dec 19, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
22 changes: 20 additions & 2 deletions docs/api/Selectors.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ import {
isDirty,
isPristine,
isValid,
isInvalid
isInvalid,
isSubmitting,
hasSubmitSucceeded,
hasSubmitFailed
} from 'redux-form'

MyComponent = connect(
Expand All @@ -28,7 +31,10 @@ MyComponent = connect(
dirty: isDirty('myForm')(state),
pristine: isPristine('myForm')(state),
valid: isValid('myForm')(state),
invalid: isInvalid('myForm')(state)
invalid: isInvalid('myForm')(state),
submitting: isSubmitting('myForm')(state),
submitSucceeded: hasSubmitSucceeded('myForm')(state),
submitFailed: hasSubmitFailed('myForm')(state)
})
)(MyComponent)
```
Expand Down Expand Up @@ -66,3 +72,15 @@ of `isInvalid`.

> Returns `true` if the form is invalid, i.e. has sync, async, or submission errors. The opposite
of `isValid`.

### `isSubmitting(formName:String)` returns `(state) => submitting:boolean`

> Returns `true` if the form is submitting.

### `hasSubmitSucceeded(formName:String)` returns `(state) => submitSucceeded:boolean`

> Returns `true` if the form has previously been successfully submitted.

### `hasSubmitFailed(formName:String)` returns `(state) => submitFailed:boolean`

> Returns `true` if the form has previously failed to submit.
6 changes: 6 additions & 0 deletions src/createAll.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ import createIsDirty from './selectors/isDirty'
import createIsInvalid from './selectors/isInvalid'
import createIsPristine from './selectors/isPristine'
import createIsValid from './selectors/isValid'
import createIsSubmitting from './selectors/isSubmitting'
import createHasSubmitSucceeded from './selectors/hasSubmitSucceeded'
import createHasSubmitFailed from './selectors/hasSubmitFailed'
import FormSection from './FormSection'
import SubmissionError from './SubmissionError'
import propTypes from './propTypes'
Expand All @@ -34,6 +37,9 @@ const createAll = structure => ({
isInvalid: createIsInvalid(structure),
isPristine: createIsPristine(structure),
isValid: createIsValid(structure),
isSubmitting: createIsSubmitting(structure),
hasSubmitSucceeded: createHasSubmitSucceeded(structure),
hasSubmitFailed: createHasSubmitFailed(structure),
propTypes,
reduxForm: createReduxForm(structure),
reducer: createReducer(structure),
Expand Down
3 changes: 3 additions & 0 deletions src/immutable.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ export const {
isInvalid,
isPristine,
isValid,
isSubmitting,
hasSubmitSucceeded,
hasSubmitFailed,
propTypes,
reducer,
reduxForm,
Expand Down
3 changes: 3 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ export const {
isInvalid,
isPristine,
isValid,
isSubmitting,
hasSubmitSucceeded,
hasSubmitFailed,
propTypes,
reducer,
reduxForm,
Expand Down
47 changes: 47 additions & 0 deletions src/selectors/__tests__/hasSubmitFailed.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import createHasSubmitFailed from '../hasSubmitFailed'
import plain from '../../structure/plain'
import plainExpectations from '../../structure/plain/expectations'
import immutable from '../../structure/immutable'
import immutableExpectations from '../../structure/immutable/expectations'
import addExpectations from '../../__tests__/addExpectations'

const describeHasSubmitFailed = (name, structure, expect) => {
const hasSubmitFailed = createHasSubmitFailed(structure)

const { fromJS, getIn } = structure

describe(name, () => {
it('should return a function XXX', () => {
expect(hasSubmitFailed('foo')).toBeA('function')
})

it('should return false when value not present', () => {
expect(hasSubmitFailed('foo')(fromJS({
form: {}
}))).toBe(false)
})

it('should return true when submitting', () => {
expect(hasSubmitFailed('foo')(fromJS({
form: {
foo: {
submitFailed: true
}
}
}))).toBe(true)
})

it('should use getFormState if provided', () => {
expect(hasSubmitFailed('foo', state => getIn(state, 'someOtherSlice'))(fromJS({
someOtherSlice: {
foo: {
submitFailed: true
}
}
}))).toBe(true)
})
})
}

describeHasSubmitFailed('hasSubmitFailed.plain', plain, addExpectations(plainExpectations))
describeHasSubmitFailed('hasSubmitFailed.immutable', immutable, addExpectations(immutableExpectations))
47 changes: 47 additions & 0 deletions src/selectors/__tests__/hasSubmitSucceeded.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import createHasSubmitSucceeded from '../hasSubmitSucceeded'
import plain from '../../structure/plain'
import plainExpectations from '../../structure/plain/expectations'
import immutable from '../../structure/immutable'
import immutableExpectations from '../../structure/immutable/expectations'
import addExpectations from '../../__tests__/addExpectations'

const describeHasSubmitSucceeded = (name, structure, expect) => {
const hasSubmitSucceeded = createHasSubmitSucceeded(structure)

const { fromJS, getIn } = structure

describe(name, () => {
it('should return a function XXX', () => {
expect(hasSubmitSucceeded('foo')).toBeA('function')
})

it('should return false when value not present', () => {
expect(hasSubmitSucceeded('foo')(fromJS({
form: {}
}))).toBe(false)
})

it('should return true when submitting', () => {
expect(hasSubmitSucceeded('foo')(fromJS({
form: {
foo: {
submitSucceeded: true
}
}
}))).toBe(true)
})

it('should use getFormState if provided', () => {
expect(hasSubmitSucceeded('foo', state => getIn(state, 'someOtherSlice'))(fromJS({
someOtherSlice: {
foo: {
submitSucceeded: true
}
}
}))).toBe(true)
})
})
}

describeHasSubmitSucceeded('hasSubmitSucceeded.plain', plain, addExpectations(plainExpectations))
describeHasSubmitSucceeded('hasSubmitSucceeded.immutable', immutable, addExpectations(immutableExpectations))
47 changes: 47 additions & 0 deletions src/selectors/__tests__/isSubmitting.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import createIsSubmitting from '../isSubmitting'
import plain from '../../structure/plain'
import plainExpectations from '../../structure/plain/expectations'
import immutable from '../../structure/immutable'
import immutableExpectations from '../../structure/immutable/expectations'
import addExpectations from '../../__tests__/addExpectations'

const describeIsSubmitting = (name, structure, expect) => {
const isSubmitting = createIsSubmitting(structure)

const { fromJS, getIn } = structure

describe(name, () => {
it('should return a function XXX', () => {
expect(isSubmitting('foo')).toBeA('function')
})

it('should return false when value not present', () => {
expect(isSubmitting('foo')(fromJS({
form: {}
}))).toBe(false)
})

it('should return true when submitting', () => {
expect(isSubmitting('foo')(fromJS({
form: {
foo: {
submitting: true
}
}
}))).toBe(true)
})

it('should use getFormState if provided', () => {
expect(isSubmitting('foo', state => getIn(state, 'someOtherSlice'))(fromJS({
someOtherSlice: {
foo: {
submitting: true
}
}
}))).toBe(true)
})
})
}

describeIsSubmitting('isSubmitting.plain', plain, addExpectations(plainExpectations))
describeIsSubmitting('isSubmitting.immutable', immutable, addExpectations(immutableExpectations))
8 changes: 8 additions & 0 deletions src/selectors/hasSubmitFailed.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const createHasSubmitFailed = ({ getIn }) =>
(form, getFormState = state => getIn(state, 'form')) =>
state => {
const formState = getFormState(state)
return getIn(formState, `${form}.submitFailed`) || false
}

export default createHasSubmitFailed
8 changes: 8 additions & 0 deletions src/selectors/hasSubmitSucceeded.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const createHasSubmitSucceeded = ({ getIn }) =>
(form, getFormState = state => getIn(state, 'form')) =>
state => {
const formState = getFormState(state)
return getIn(formState, `${form}.submitSucceeded`) || false
}

export default createHasSubmitSucceeded
8 changes: 8 additions & 0 deletions src/selectors/isSubmitting.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const createIsSubmitting = ({ getIn }) =>
(form, getFormState = state => getIn(state, 'form')) =>
state => {
const formState = getFormState(state)
return getIn(formState, `${form}.submitting`) || false
}

export default createIsSubmitting