- Notifications
You must be signed in to change notification settings - Fork6
TypeScript FSA utilities for redux-observable
License
NotificationsYou must be signed in to change notification settings
m0a/typescript-fsa-redux-observable
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
TypeScript FSA utilities for redux-observable
yarn add typescript-fsa-redux-observableExample:
// for actionsimportactionCreatorFactory,{AnyAction,Action,Success}from'typescript-fsa';// for reducersimport{reducerWithInitialState}from'typescript-fsa-reducers';import{combineReducers}from'redux';//for epicsimport{delay,map,tap,ignoreElements}from'rxjs/operators';import{ofAction,ofActionPayload}from'typescript-fsa-redux-observable';// <-- hereimport{combineEpics,Epic,createEpicMiddleware}from'redux-observable';//reducerimport{createStore,applyMiddleware}from'redux';// actionconstactionCreator=actionCreatorFactory();constactions={increment:actionCreator.async<undefined,undefined>('INCREMENT'),decrement:actionCreator.async<undefined,undefined>('DECREMENT')};// reducers & stateinterfaceState{counter:number;}constcounter=reducerWithInitialState(0).case(actions.increment.done,state=>state+1).case(actions.decrement.done,state=>state-1);constrootReducer=combineReducers({ counter});// epicsconstcounterIncrementEpic:Epic<AnyAction,Action<Success<undefined,undefined>>,State>=action$=>action$.pipe(ofActionPayload(actions.increment.started),delay(300),map(payload=>actions.increment.done({params:payload,result:undefined})));constcounterDecrementEpic:Epic<AnyAction,Action<Success<undefined,undefined>>,State>=action$=>action$.pipe(ofActionPayload(actions.decrement.started),delay(300),map(payload=>actions.decrement.done({params:payload,result:undefined})));constloggingEpic:Epic<AnyAction,AnyAction,State>=action$=>action$.pipe(ofAction(actions.decrement.started,actions.increment.started,),tap(action=>console.log(action.type)),ignoreElements());constrootEpic=combineEpics(counterIncrementEpic,counterDecrementEpic,loggingEpic,);constepicMiddleware=createEpicMiddleware<AnyAction,AnyAction,State>();conststore=createStore(rootReducer,applyMiddleware(epicMiddleware));epicMiddleware.run(rootEpic);// toolasyncfunctionsleep(time:number){returnnewPromise<void>(resolve=>{setTimeout(()=>(resolve()),time)})}it("increment decrement test",async()=>{expect(store.getState()).toEqual({counter:0});store.dispatch(actions.increment.started(undefined));expect(store.getState()).toEqual({counter:0});awaitsleep(300);expect(store.getState()).toEqual({counter:1});store.dispatch(actions.decrement.started(undefined));expect(store.getState()).toEqual({counter:1});awaitsleep(300);expect(store.getState()).toEqual({counter:0})});
About
TypeScript FSA utilities for redux-observable
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
No releases published
Packages0
No packages published
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.