<!DOCTYPE html>
<html>
<head>
  <link href="//cdn.jsdelivr.net/picnicss/4.1.1/picnic.min.css" rel="stylesheet">
  <style>
    li:empty {
      list-style-type:none;
    }
  </style>
</head>
<body>
  <h1>Hello Mag.JS - Redux!</h1>
  <a target="_tab" href="https://github.com/magnumjs/mag.js">GitHub</a>
  <hr/>
  <div id="counter">
    <div>
      <button name="down">Decrease</button>
      <button name="up">Increase</button>
      <b></b>
    </div>
    <div>
      <input>
      <button name="add">Add</button>
      <ul>
        <li></li>
      </ul>
    </div>
  </div>
 <script src="//rawgit.com/magnumjs/mag.js/master/dist/mag.0.21.2.min.js"></script>
  <script src="//rawgit.com/magnumjs/mag.js/master/dist/mag.addons.0.21.min.js"></script>
  <script src="//rawgit.com/magnumjs/mag.js/master/dist/mag-redux.0.21.min.js"></script>
  <script src="mag-redux.js"></script>
  <script src="mag-mod.js"></script>
  <script src="app-init.js"></script>
</body>
</html>
                
            
        
            
                
                    (function(namespace) {
  var props = {
    counter: {
      count: 0
    }
  }
  var Counter = {}
  Counter.controller = function() {
    this.input = ''
  }
  Counter.view = function(state, props) {
    state.b = props.counter.count
    state.li = props.todos || []
    state.up = {
      _onClick: props.increaseAction
    }
    state.down = {
      _onClick: props.decreaseAction
    }
    state.add = {
      _onClick: function() {
        props.addTodo(state.input)
        state.input = ''
      }
    }
  }
  namespace.Counter = mag.create('counter', Counter, props);
})(mag.namespace('mods.demo'));
                
            
        
            
                
                    var magRedux = (function() {
  //Types:
  var types = {
    ADD_TODO: 'ADD_TODO',
    DECREASE: 'DECREASE',
    INCREASE: 'INCREASE'
  }
  // Actions as objects:
  var actions1 = {
    decreaseAction: {
      type: types.DECREASE
    },
    increaseAction: {
      type: types.INCREASE
    },
    addTodo: {
      type: types.ADD_TODO,
      text: ''
    }
  }
  //Action as functions:
  var actions2 = {
    addTodo: function(text) {
      return {
        type: types.ADD_TODO,
        text: text
      };
    },
    decreaseAction: function() {
      return {
        type: types.DECREASE
      };
    },
    increaseAction: function() {
      return {
        type: types.INCREASE
      };
    }
  }
  // Reducer:
  function counter(state, action) {
    switch (action.type) {
      case types.INCREASE:
        return {
          count: state.count + 1
        };
      case types.DECREASE:
        return {
          count: state.count - 1
        };
      default:
        return state || {
          count: 0
        };
    }
  }
  // Reducer:
  function todos(state, action) {
    switch (action.type) {
      case types.ADD_TODO:
        console.log(action)
        return state.concat([action.text]);
      default:
        return state || [];
    }
  }
  //Optional: Map Redux state to component props
  var mapStateToProps = function(state) {
      return {
        todos: state.todos,
        value: state.counter.count
      };
    }
    //Remove mapping, use default
  mapStateToProps = {}
  // Map Redux actions to component props
  var mapDispatchToProps = function(dispatch) {
    return {
      increaseAction: function() {
        dispatch(actions2.increaseAction())
      },
      decreaseAction: function() {
        dispatch(actions2.decreaseAction())
      },
      addTodo: function(text) {
        dispatch(actions2.addTodo(text))
      }
    };
  }
  //Middleware:
  var logger = function logger(store) {
    return function(next) {
      return function(action) {
        console.log('dispatching', action);
        var result = next(action);
        console.log('next state', store.getState());
        return result;
      };
    };
  };
  return {
    mapStateToProps: mapStateToProps,
    mapDispatchToProps: mapDispatchToProps,
    middleware: [logger],
    //Combine reducers:
    reducers: {
      counter: counter,
      todos: todos
    }
  }
})();
                
            
        
            
                
                    
// Connect Component:
var App = mag.reduxConnect(
  magRedux.mapStateToProps,
  magRedux.mapDispatchToProps,
  magRedux.reducers,
  magRedux.middleware
)(mag.mods.demo.Counter);
//Run instance:
var modInstance = App({
  anotherThing: true
})