UNPKG

redux-form-submit-saga

Version:
95 lines (66 loc) 2.85 kB
# redux-form-submit-saga Handles redux-form submissions using redux-saga ## Install ``` npm install -S redux-form-submit-saga ``` ## Usage ### Integrate with Sagas You can integrate this package with your other sagas as follows: ```js import {createSagaMiddleware} from 'redux-saga'; import {addFormSubmitSagaTo} from 'redux-form-submit-saga'; import {allMySagas} from '...'; const sagaMiddleware = createSagaMiddleware(); // ... create store with middleware ... const rootSaga = addFormSubmitSagaTo(allMySagas); sagaMiddleware.run(rootSaga); ``` If you need to access the saga directly, it can be imported as `formSubmitSaga`. ### Integrate with Forms For each form where you want to submit with something async (often), you can setup the submit function like this: ```js import {reduxForm, Field} from 'redux-form'; import {onSubmitActions} from 'redux-form-submit-saga'; const MyForm = ({handleSubmit}) => ( <form onSubmit={handleSubmit}> <Field component="input" type="text"/> <button type="submit">Submit</button> </form> ); export default reduxForm({ form: 'myForm', onSubmit: onSubmitActions('MY_FORM') })(MyForm); ``` This is assuming you are using `handleSubmit` within your form and not invoking it with an inline handler function. There are multiple ways to configure `onSubmitActions`, the simplest being the one above. ``` onSubmitActions(root: string, transform?: Function) ``` You pass in a string, and the action types are derived from that with the suffixes: `_SUBMIT`, `_SUCCESS`, and `_FAILURE`. You can optionally provide a transform function which will be used to transform the form values before being added to the submit action. ``` onSubmitActions(submit: string | Function, success: string, failure: string) ``` Here you can pass each action type separately. The submit action (first parameter) can be an action creator function if desired. ### Handle Submissions using Sagas Once set up you should be able to do the following: ```js import * as api from '...'; import {call, put} from 'redux-saga/effects'; import {takeLatest} from 'redux-saga'; function* myFormSaga (action) { try { const response = yield call(api.submitMyForm, action.payload); yield put({type: 'MY_FORM_SUCCESS', payload: response.body}); } catch (err) { yield put({type: 'MY_FORM_FAILURE', payload: {_error: err.message}}); } } export function* watchMyForm () { yield* takeLatest('MY_FORM_SUBMIT', myFormSaga); } ``` ## Immutable.js support If you are using Immutable.js with redux-form, you can import the above functions from `redux-form-submit-saga/immutable`. If you want to use ES modules for tree-shaking or other purposes, you'll need to use `redux-form-submit-saga/es/immutable` directly.