Most of the popular React form libraries accept an onSubmit
function that is expected to return a Promise
that resolves when the submission is complete, or rejects when the submission fails. This mechanism is fundamentally incompatible with action management libraries like redux-saga
, which perform side-effects (e.g. ajax requests) in a way that does not let the submission function easily return a promise. React Redux Promise Listener is a potential solution.
Step 1 involves installing Redux middleware and is detailed here in the docs of Redux Promise Listener.
Welcome back! You may now create an async function in your React code like so:
import MakeAsyncFunction from 'react-redux-promise-listener'
import { promiseListener } from './store'
...
<MakeAsyncFunction
listener={promiseListener}
start="START_ACTION_TYPE" // the type of action to dispatch when this function is called
resolve="RESOLVE_ACTION_TYPE" // the type of action that will resolve the promise
reject="REJECT_ACTION_TYPE" // the type of action that will reject the promise
>{asyncFunc => (
<SomeFormLibrary onSubmit={asyncFunc}>
...
<button type="submit">Submit</button>
</SomeFormLibrary>
)}</MakeAsyncFunction>
A react component that passes an async function to its child render prop.
The type
of action to dispatch when the function is called.
The type
of action that will cause the promise to be resolved.
The type
of action that will cause the promise to be rejected.
A function to set the payload (the parameter passed to the async function). Defaults to (action, payload) => ({ ...action, payload })
.
A function to get the payload out of the resolve action to pass to resolve the promise with. Defaults to (action) => action.payload
.
A function to get the error out of the reject action to pass to reject the promise with. Defaults to (action) => action.payload
.