Skip to content

johnnyji/create-reducer-redux

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

create-reducer-redux

Create simple and functional reducers that can listen to multiple action creators.

DEPRECATED:

Please do not use this library, it has been deprecated and will no longer receive support or bug fixes

Installation

npm i -S create-reducer-redux

Usage

Actions need to follow a convention of {type, data}, where type is the action type being fired, and data is the data associated with the action (if there is any). Otherwise, we can omit the data key.

const AuthActionCreators = {

  loginSuccess(user) {
    // Pretend we succesfully logged in
    return {
      type: ActionTypes.LOGIN_SUCCESS,
      data: {currentUser: user}
    };
  },

  logoutSuccess() {
    return {
      type: ActionTypes.LOGOUT_SUCCESS
    };
  }

  // ...
};

In your reducer, must provide a name and handlers key. An action handler can listen to multiple actions being fired if necessary.

// src/reducers/AuthReducer.js

// Alternate import: `import {createReducer} from 'create-reducer-redux;`
import createReducer from 'create-reducer-redux';

// Always provide an initial state to begin with
const initialState = {
  authError: null,
  currentUser: null
};

export default createReducer(initialState, {

  name: 'Authentication',

  handlers: {
    onLogin: [ActionTypes.LOGIN_SUCCESS],
    onLogout: [
      ActionTypes.LOGOUT_SUCCESS,
      ActionTypes.TOKEN_EXPIRED,
      ActionTypes.BLACKLISTED,
      // ... Other actions that trigger a logout
    ]
  },

  // Action handlers receive the current state and the `data` key from the action fired
  // as arguments. You must return a new (altered or unaltered) state from each action creator
  onLogin(state, data) {
    return {...state, currentUser: data.currentUser};
  },
  
  // Here is an example of an action handler listening to multiple actions
  onLogout() {
    return initialState;
  }

});

Immutable.js

I highly recommend pairing create-reducer-redux with Immutable.js. Immtuable.js provides immutable datatypes to ensure that actions handlers don't cause side effects.

The usage is indentical:

// Immutable.js Example

import createReducer from 'create-reducer-redux';
import Immutable from 'immutable';

// Always provide an initial state to begin with
const initialState = Immutable.fromJS({
  authError: null,
  currentUser: null
});

export default createReducer(initialState, {

  name: 'Authentication',

  handlers: {
    onLogin: [ActionTypes.LOGIN_SUCCESS],
    onLogout: [
      ActionTypes.LOGOUT_SUCCESS,
      ActionTypes.TOKEN_EXPIRED,
      ActionTypes.BLACKLISTED,
      // ... Other actions that trigger a logout
    ]
  },

  // Action handlers receive the current state and the `data` key from the action fired
  // as arguments. You must return a new (altered or unaltered) state from each action creator
  onLogin(state, data) {
    return state.merge({
      currentUser: data.currentUser
    });
  },
  
  // Here is an example of an action handler listening to multiple actions
  onLogout() {
    return initialState;
  }

});

createConstants

create-redux-reducer also provides a convenient way for you to create clean and legible action type constants:

import {createConstants} from 'create-redux-reducer';

const actionTypes = createConstants([
	'HELLO',
	'THERE',
	'WORLD'
]);

// This will become:

// const actionTypes = {
// 	'HELLO': 'HELLO',
// 	'THERE': 'THERE',
// 	'WORLD': 'WORLD'
// };

About

A clean and functional way to create Redux reducers

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published