var AppDispatcher = require('../dispatcher/appDispatcher'); var EventEmitter = require('events').EventEmitter; var CartConstants = require('../constants/cartConstants'); var CartActions = require('../actions/cartActions'); var ItemInCart = require('../models/itemInCart'); var ItemInCartCollection = require('../models/itemInCartCollection'); var _ = require('underscore'); var states = {} var _itemsInCart = new ItemInCartCollection(); var loadCart = function() { _itemsInCart.fetch({ success: function() { states = {} for (var i = 0; i < _itemsInCart.models.length; i++) { var itemInCart = _itemsInCart.models[i]; states[itemInCart.get('item_id')] = itemInCart; } CartActions.dataLoaded(); } }) }; var addItem = function(itemId) { var state = states[itemId] || new ItemInCart({ item_id: itemId, count: 0 }) state.set('count', state.get('count') + 1); states[itemId] = state; saveCartStateForItem(itemId); }; var takeItemOut = function(itemId) { var state = states[itemId] || new ItemInCart({ item_id: itemId, count: 0 }) if (state.get('count') > 0) { state.set('count', state.get('count') - 1); } states[itemId] = state; saveCartStateForItem(itemId); }; var saveCartStateForItem = function(itemId) { var item = CartStore.getStateFor(itemId); item.save({ success: function () { CartActions.dataLoaded(); } }); } // Extend CartStore with EventEmitter to add eventing capabilities var CartStore = _.extend({}, EventEmitter.prototype, { getStateFor: function(itemId) { var state = states[itemId] || new ItemInCart({ item_id: itemId, count: 0 }) return state }, getWholeCartState: function() { var numberOfItems = 0; for (key in states) { if(states.hasOwnProperty(key)){ var value = states[key]; if (value.get('count') > 0) { numberOfItems++; } } }; var state = { count: numberOfItems }; return state; }, // Emit Change event emitChange: function() { console.log("Emitting cart change!"); this.emit('change'); }, // Add change listener addChangeListener: function(callback) { this.on('change', callback); }, // Remove change listener removeChangeListener: function(callback) { this.removeListener('change', callback); } }); // Register callback with AppDispatcher AppDispatcher.register(function(payload) { var action = payload.action; var text; switch (action.actionType) { case CartConstants.LOAD_CART_CONTENTS: loadCart(); break; case CartConstants.ADD_ITEM: addItem(action.itemId); break; case CartConstants.TAKE_ITEM_OUT: takeItemOut(action.itemId); break; case CartConstants.CART_DATA_LOADED: // just emit change break; case CartConstants.SAVE_CART_STATE_FOR_ITEM: saveCartStateForItem(action.itemId); break; default: return true; } // If action was responded to, emit change event CartStore.emitChange(); return true; }); module.exports = CartStore;