TODO App wtih React (combineReducer())

TODO app using Redux and combine multiple reducers

by Pratik Bhattachary

HTML

<!DOCTYPE html>
<html>
  <meta name="description" content="TODO App using Redux">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>TODO Redux</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.0/redux.js" type="text/javascript"></script>
  <script src="https://fb.me/react-0.14.3.js"></script>
  <script src="https://fb.me/react-dom-0.14.3.js"></script>
  <script src="https://unpkg.com/expect@%3C21/umd/expect.min.js"></script>

  <body>
    <div id="root"></div>

  </body>

</html>

Babel + JSX

//Here state refers to an individual todo object
const todo = (state, action) => {
	switch(action.type) {
		case 'ADD_TODO': return {
			id: action.id,
			text: action.text,
			completed: false
		}
		case 'TOGGLE_TODO': 
			if (state.id === action.id)
				return Object.assign({}, state, { completed: !state.completed });
			return state;
		default: return state;
	}
};

const todos = (state = [], action) => {
	switch(action.type) {
		case 'ADD_TODO': 
			return [
				...state,
				todo(undefined, action)
			];
		case 'TOGGLE_TODO': {
			return state.map(t => todo(t, action));
		}
		default:
			return state;
	}
};

const visibilityFilter = (
	state = 'SHOW_ALL',
	action
) => {
	switch(action.type) {
		case 'SET_VISIBILITY_FILTER':
			return action.filter;
		default:
			return state;
	}
}

const combineReducers = (reducers) => {
	return (state = {}, action) => {
  	return Object.keys(reducers).reduce(
    	(nextState, key) => {
      	nextState[key] = reducers[key] (state[key], action);
        return nextState;
      },
      {}
    );
  };
}

//const { combineReducers } = Redux;
//The keys are the object of the state that the individual reducer will need to manage; and the values represent the reducer that the combine reducer should call to update the respective attrbiute of the state object as mentioned in the key.
/*
const todoApp = combineReducer({
	todos: todos,
  visibilityFilter: visibilityFilter
});
*/

//Using ES6 object literal shorthand we can eliminate the key:value pair to only list of keys when key and value are same in an object
const todoApp = combineReducers({
	todos, visibilityFilter
});


const { createStore } = Redux;
const store = createStore(todoApp);

console.log('Initial state: ');
console.log(store.getState());
console.log('------------------');

console.log('Dispatching ADD_TODO');
store.dispatch({
	type: 'ADD_TODO',
	id: 0,
	text: 'Learn React'
});
console.log('Current State:...