redux-story v0.1.1
redux-story
Create and dispatch weaved stories
redux-story is a redux middleware which lets you dispatch functions or generators that we will call stories.
Stories gets injected with dispatch and getState from the store, but also with helper functions.
A bunch of handy helpers are provided, but you can create your own and inject them anytime.
Fast Setup
import { createStore } from 'redux'
import storyMiddleware from 'redux-story'
  
const store = createStore(
	appReducer,
	{
		user: null,
		posts: [],
	},
	applyMiddleware(
		storyMiddleware()
	)
)If you want more control over storyMiddleware helpers and processors, see storyMiddleware signature.
Stories signature
function ({ dispatch, getState }, helpers)
/* or */
function* ({ dispatch, getState }, helpers)Built-in helpers
take
take(actionType)take returns a Promise object which get resolved when the specified action gets dispatched.
@param actionType : string, the action type to wait for
@returns a Promise object
@resolves with the action object
takeWhen
takeWhen(stateComparison[, actionComparison])takeWhen returns a Promise which gets resolved when the state meets stateComparison requirements, and optionally, the dispatched action meets actionComparison requirements.
@param stateComparison : function, a function taking store state in parameter and returns true of false
@param optional actionComparison : function, a function taking dispatched action and returns true of false
@returns a Promise object
@resolves with { state, action }
Create and inject your helpers
Example. Too lazy for now.
import {
  default as storyMiddleware,
  createDefaultHelpers,
} from 'redux-story'
const createMyHelpers = ({dispatch, getState, subscribe}) => {
  /*
   * subscribe() is a special function which takes a function as first argument
   * and calls it anytimes an action gets dispatched.
   *
   * The function signature is (updatedState, dispatchedAction)
   * It returns an unsubscribe function to stop listening
   */
  return {
    // Dispatch an action after `delay`ms
    dispatchIn: (action, delay = 500) => setTimeout(() => dispatch(action), delay),
    
    // Returns a Promise which gets resolved when 2 specified actions gets dispatched within 1 second
    takeTwoActionsWithinOneSecond: (actionOne, actionTwo) => new Promise((resolve, reject) => {
      let actionsTime = {
        [actionOne]: 0,
        [actionTwo]: 0
      }
      
      let unsubscribe = subscribe((state, action) => {
        let time = (new Date()).getTime()
        
        if (action.type == actionOne || action.type == actionTwo) {
           actionsTime[action.type] = time
          if (Math.abs(actionsTime[actionOne] - actionsTime[actionTwo]) <= 1000) {
            unsubscribe()
            resolve()
          }
        }
      }
    }
  }
}
       
const store = createStore(
  appReducer,
  null,
  applyMiddleware(
    storyMiddleware([createDefaultHelpers, createMyHelpers]) // Left ones gets erased if same key
  )
)