rsnext/examples/with-redux-observable/redux/epics.js
Tim Neutkens 9c4eefcdbf
Add prettier for examples directory (#5909)
* Add prettier for examples directory

* Fix files

* Fix linting

* Add prettier script in case it has to be ran again
2018-12-17 17:34:32 +01:00

50 lines
1.4 KiB
JavaScript

import { interval, of } from 'rxjs'
import { takeUntil, mergeMap, catchError, map } from 'rxjs/operators'
import { combineEpics, ofType } from 'redux-observable'
import { request } from 'universal-rxjs-ajax' // because standard AjaxObservable only works in browser
import * as actions from './actions'
import * as types from './actionTypes'
export const fetchUserEpic = (action$, state$) =>
action$.pipe(
ofType(types.START_FETCHING_CHARACTERS),
mergeMap(action => {
return interval(3000).pipe(
map(x => actions.fetchCharacter()),
takeUntil(
action$.ofType(
types.STOP_FETCHING_CHARACTERS,
types.FETCH_CHARACTER_FAILURE
)
)
)
})
)
export const fetchCharacterEpic = (action$, state$) =>
action$.pipe(
ofType(types.FETCH_CHARACTER),
mergeMap(action =>
request({
url: `https://swapi.co/api/people/${state$.value.nextCharacterId}`
}).pipe(
map(response =>
actions.fetchCharacterSuccess(
response.response,
action.payload.isServer
)
),
catchError(error =>
of(
actions.fetchCharacterFailure(
error.xhr.response,
action.payload.isServer
)
)
)
)
)
)
export const rootEpic = combineEpics(fetchUserEpic, fetchCharacterEpic)