Transform verbose logic in redux-saga into compact callbacks. You need to have redux-saga installed to use the library.
Before
import { takeEvery, all, put } from "redux-saga"; import { BUTTON_PRESSED, FETCH_TODOS, FETCH_USERS, FETCH_PAYMENTS } from "./types"; export function* root() { yield takeEvery(BUTTON_PRESSED, _dispatchMultipleRequests), } function* _dispatchMultipleRequests(){ yield all([ put({ type: FETCH_TODOS }), put({ type: FETCH_USERS }), put({ type: FETCH_PAYMENTS }), ]); }After
import { takeEvery } from "redux-saga"; import { relay } from "redux-saga-relay"; import { BUTTON_PRESSED, FETCH_TODOS, FETCH_USERS, FETCH_PAYMENTS } from "./types"; export function* root() { yield takeEvery(BUTTON_PRESSED, (action) => relay([FETCH_TODOS, FETCH_USERS, FETCH_PAYMENTS], action) ) }See below for all options and complex transformations.
NPM:
npm install redux-saga-relayYarn:
yarn add redux-saga-relayPass a string and relay a single action:
(action) => relay(TYPE_1, action)Pass an array of strings and relay multiple actions:
(action) => relay([TYPE_1, TYPE_2, TYPE_2], action)The triggered action will be spread into TYPE_1, TYPE_2 and TYPE_3 and dispatched to the redux store, after a transformation has been applied (more on transformations below).
Pass a function and relay to a callback:
takeEvery(CUSTOM_BUTTON_PRESS, action => relay(() => { // Do something here }) )You can extend your actions in your sagas with additional payload or metadata using the extend method exposed by the library.
import { relay, extend } from "redux-saga-relay"; takeEvery(CUSTOM_BUTTON_PRESS, action => relay(FETCH_ORDERS, extend(action, { ...payload }, { ...meta })) )The relay code is wrapped in a try - catch block, meaning that you can catch errors in your callbacks, to hook into the catch statement pass a function as the third parameter of the relay function.
(action) => relay(() => { const { value } = object.that.does.not.exist; //Bad code }, null, _recordErrorInSentry)Actions are transformed by default to remove meta.analytics from the action before it is relayed. You can optionally overwrite this transformation by passing a function to the forth parameter of the relay function.
(action) => relay(TYPE_1, action, _recordErrorInSentry, _customTransform) function _customTransform(action) { return _.omit(action, "payload") // apply custom transform to action before it is relayed }- Luke Brandon Farrell - Author
This project is licensed under the MIT Licence