Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.7.2/redux.js"></script>
</body>
</html>
 
const {
  createStore,
  combineReducers,
  compose,
  bindActionCreators,
  applyMiddleware
} = Redux;
const initialState = { result: 0 };
const addAction = {
  type: 'ADD',
  value: 4
};
const calculatorReducer = (
  state = initialState,
  action
) => {
  if (action.type === 'ADD') {
    return {
      ...state,
      result: state.result + action.value
    }
  }
  return state;  
}
const subscriber = () => {
  console.log('SUBSCRIPTION!!!!', store.getState())
};
const logger = ({ getState }) => {
  return next => action => {
    console.log(
      'MIDDLEWARE',
      getState(),
      action
    );
    const value = next(action);
    console.log({value});
    return value;
  }
}
const initialError = { message: '' };
let errorMessageReducer = (
  state = initialError,
  action
) => {
  if (action.type === 'SET_ERROR_MESSAGE')
    return { message: action.message };
  if (action.type === 'CLEAR_ERROR_MESSAGE')
    return { message: '' };
  return state;
};
const store = createStore(combineReducers({
  calculator: calculatorReducer,
  error: errorMessageReducer
}), {}, applyMiddleware(logger));
const unsubscribe = store.subscribe(subscriber);
const add = value => ({ type: 'ADD', value });
const setError = (message) => (
  { type: 'SET_ERROR_MESSAGE', message}
);
const clearError = () => (
  { type: 'CLEAR_ERROR_MESSAGE' }
);
const bindActionCreator =
      (action, dispatch) => 
        (...args) => dispatch(action(...args));
const addValue = bindActionCreator(add, store.dispatch);
const bindActionCreatorz = (actions, dispatch) => {
  return Object.keys(actions).reduce((boundActions, key) => {
    boundActions[key] = bindActionCreator(actions[key], dispatch);
    return boundActions;
  }, {});
}
const errors = bindActionCreatorz({ 
  set: setError,
  clear: clearError
}, store.dispatch);
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
stevekinneypro
0viewers