Last active
June 29, 2017 07:18
-
-
Save mdboop/3ee77cfe0319a6e417ca08e0d1307a78 to your computer and use it in GitHub Desktop.
A little function, which could be paired with flux standard actions to help reduce redux boilerplate.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { actionCreatorFactory } from 'typescript-fsa' | |
import { ajaxGetJSON, ajaxPost, ajaxPut, ajaxDelete } from 'rxjs' | |
import { combineEpics } from 'redux-observable' | |
const createEpic = (fsa, request, prepare) => | |
(action$, store) => | |
action$.ofType(fsa.started.type) | |
.map( | |
action => (typeof prepare === 'function' ? prepare(action, store.getState() : action.payload) | |
) | |
.switchMap(data => request(data) | |
.map(fsa.done) | |
.catch(e => [fsa.failed(e)])) | |
const api = { | |
fetchUsers: () => ajaxGetJSON('/users'), | |
createUser: (user) => ajaxPost('/users', user, { 'content-type': 'application/json' }), | |
updateUser: (user) => ajaxPut(`/users/${user.id}`, user, { 'content-type': 'application/json' }), | |
deleteUser: (id) => ajaxDelete(`/users/${id}`) | |
} | |
const createAction = actionCreatorFactory() | |
const fetchUsers = createAction('FETCH_USERS') | |
const createUser = createAction('CREATE_USER') | |
const updateUser = createAction('UPDATE_USER') | |
const deleteUser = createAction('DELETE_USER') | |
const rootEpic$ = combineEpics( | |
createEpic(fetchUsers, api.fetchUsers), | |
createEpic(createUser, api.createUser), | |
createEpic(updateUser, api.updateUser), | |
createEpic(deleteUser, api.deleteUser) | |
) | |
export default rootEpic$ // register with redux middleware elsewhere |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment