var AppDispatcher = require('../dispatcher/appDispatcher'); var EventEmitter = require('events').EventEmitter; var SectionCollection = require('../models/sectionCollection'); var Section = require('../models/section'); var SectionConstants = require('../constants/sectionConstants'); var _ = require('underscore'); var _sectionDetails = new Section(); var sectionState = { sections : [], hoveredSection : '' }; var loadSections = function() { var sections = new SectionCollection(); sections.fetch({success: function() { sectionState.sections = sections.models; // change will be called automatically when // action is run but we need to emit it again // when the data arive // it's a bit "unfluxy" but convenient. // "true philosophy" would be to run another "data arrived" action SectionStore.emitChange(); }}); }; var loadSectionDetails = function(sectionId) { var section = new Section({id : sectionId}); section.fetch({ success: function() { _sectionDetails = section; SectionStore.emitChange(); } }); }; var setHovered = function(id) { sectionState.hoveredSection = id; } // Extend SectionStore with EventEmitter to add eventing capabilities var SectionStore = _.extend({}, EventEmitter.prototype, { // Return Single Item With Details getState: function() { return sectionState; }, getSectionDetails: function() { return _sectionDetails; }, // Emit Change event emitChange: function() { 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) { // Respond to SELECT_ITEM action case SectionConstants.LOAD_SECTIONS: loadSections(); break; case SectionConstants.SET_SECTION_HOVER: setHovered(action.section.get('id')); break; case SectionConstants.UNSET_SECTION_HOVER: setHovered(''); break; case SectionConstants.LOAD_SECTION_DETAILS: loadSectionDetails(action.sectionId); break; default: return true; } // If action was responded to, emit change event SectionStore.emitChange(); return true; }); module.exports = SectionStore;