var AppDispatcher = require('../dispatcher/appDispatcher'); var EventEmitter = require('events').EventEmitter; var CartConstants = require('../constants/cartConstants'); var CartActions = require('../actions/cartActions'); var NavigationActions = require('../actions/navigationActions'); var ItemInCart = require('../models/itemInCart'); var ItemInCartCollection = require('../models/itemInCartCollection'); var ItemCollection = require('../models/itemCollection'); var DeliveryDestination = require('../models/deliveryDestination'); var OrderConfirmation = require('../models/orderConfirmation'); var globals = require('../globals'); var Superagent = require('superagent'); var _ = require('underscore'); var states = {} var initialized = false; var _itemsInCart = new ItemInCartCollection(); var _itemsForDisplay = new ItemCollection(); _itemsForDisplay.setFromCart(true); var _deliveryDestination = new DeliveryDestination(); var loadCart = function() { var get = 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(); _itemsForDisplay.fetch({ success: function() { //CartActions.dataLoaded(); if (!_deliveryDestination.get('id')) { _deliveryDestination.fetch({ success: function() { CartActions.dataLoaded(); } }); } else { CartActions.dataLoaded(); } } }); } }); }; get(); //if(initialized) { //get(); //} else { //Superagent //.get(globals.ApiUrl + '/cart/init') //.withCredentials() //.end(function(response) { //if(response.ok) { //initialized = true; //get(); //} //}); //} }; var saveCartStateForItem = function(itemId) { var item = CartStore.getStateFor(itemId); item.save({ success: function() { 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 changeDeliveryDestinationProperty = function(property, value) { _deliveryDestination.set(property, value); }; var confirmOrder = function () { console.log("confirming"); var oc = new OrderConfirmation({ hamo: 'meho' }); oc.save({b:'b'}, { success: function () { console.log("done"); NavigationActions.goToThankYou(); } }); }; var saveDeliveryDestination = function() { console.log("saving delivery destination"); _deliveryDestination.save(null,{ success: function() { console.log("saved delivery destination"); confirmOrder(); } }) }; // 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 += value.get('count'); } } }; var state = { count: numberOfItems, items: _itemsForDisplay, itemCounts: states, deliveryDestination: _deliveryDestination }; 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: // do nothing - jsut emmit change break; case CartConstants.SAVE_CART_STATE_FOR_ITEM: saveCartStateForItem(action.itemId); break; case CartConstants.CHANGE_DELIVERY_DESTINATION_PROPERTY: changeDeliveryDestinationProperty(action.propertyName, action.value) break; case CartConstants.CONFIRM_DELIVERY: saveDeliveryDestination(); break; default: return true; } // If action was responded to, emit change event CartStore.emitChange(); return true; }); module.exports = CartStore;