Skip to content

Instantly share code, notes, and snippets.

@mdboop
Last active June 29, 2017 07:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mdboop/3ee77cfe0319a6e417ca08e0d1307a78 to your computer and use it in GitHub Desktop.
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.
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