0.1.1 • Published 8 years ago

redux-story v0.1.1

Weekly downloads
3
License
MIT
Repository
github
Last release
8 years ago

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
  )
)