UNPKG

typescript-fsa-redux-observable

Version:

TypeScript FSA utilities for redux-observable

106 lines (78 loc) 2.78 kB
# [TypeScript FSA](https://github.com/aikoven/typescript-fsa) utilities for redux-observable [![npm version](https://badge.fury.io/js/typescript-fsa-redux-observable.svg)](https://badge.fury.io/js/typescript-fsa-redux-observable) [![Build Status](https://travis-ci.org/m0a/typescript-fsa-redux-observable.svg?branch=master)](https://travis-ci.org/m0a/typescript-fsa-redux-observable) ## Installation ``` yarn add typescript-fsa-redux-observable ``` ## API ### ofAction(action: ActionCreator) **Example:** ```ts // for actions import actionCreatorFactory from 'typescript-fsa'; // for reducers import { reducerWithInitialState } from 'typescript-fsa-reducers'; import { combineReducers } from 'redux'; //for epics import 'rxjs'; import 'typescript-fsa-redux-observable'; // <-- here import { combineEpics, Epic, createEpicMiddleware } from 'redux-observable'; //reducer import { createStore, applyMiddleware } from 'redux'; // action const actionCreator = actionCreatorFactory(); const actions = { increment: actionCreator.async<undefined, undefined>('INCREMENT'), decrement: actionCreator.async<undefined, undefined>('DECREMENT') } // reducers & state interface State { counter: number; } const counter = reducerWithInitialState(0) .case(actions.increment.done, state => state + 1) .case(actions.decrement.done, state => state - 1) ; const rootReducer = combineReducers({ counter }); // epics const counterIncrementEpic: Epic<Action, State> = (action$, store) => action$.ofAction(actions.increment.started) .delay(300) .map(action => actions.increment.done({ params: action.payload, result: undefined })); const counterDecrementEpic: Epic<Action, State> = (action$, store) => action$.ofAction(actions.decrement.started) .delay(300) .map(action => actions.decrement.done({ params: action.payload, result: undefined })); const epics = combineEpics( counterIncrementEpic, counterDecrementEpic ); const epicMiddleware = createEpicMiddleware(epics); const store = createStore(rootReducer,applyMiddleware(epicMiddleware)) // tool async function sleep(time: number) { return new Promise<void>(resolve => { setTimeout(() => (resolve()),time) }) } it("incremnet decrement test", async () => { expect(store.getState()).toEqual({counter:0}) store.dispatch(actions.increment.started(undefined)) expect(store.getState()).toEqual({counter:0}) await sleep(300) expect(store.getState()).toEqual({counter:1}) store.dispatch(actions.decrement.started(undefined)) expect(store.getState()).toEqual({counter:1}) await sleep(300) expect(store.getState()).toEqual({counter:0}) }) ```