Skip to content

Commit

Permalink
Converts MessageStore
Browse files Browse the repository at this point in the history
Stores are arguably the most complex piece in flux so we can convert
each in a single commit. We can start with MessageStore, a lot of the
basic internals of the code is left unchanged sans semicolons. The bulk
of the dispatcher logic has been moved inside the store class' action
listener methods that correspond to the proper action. Notably the
underscore variable `_messages` has been introduced as state inside our
store, and all the loose functions that existed are now static functions
of the class.
  • Loading branch information
goatslacker committed Dec 27, 2014
1 parent 58ea141 commit f4c7bb4
Showing 1 changed file with 64 additions and 112 deletions.
176 changes: 64 additions & 112 deletions examples/chat/js/stores/MessageStore.js
@@ -1,134 +1,86 @@
/** var alt = require('../alt')
* This file is provided by Facebook for testing and evaluation purposes
* only. Facebook reserves all rights not expressly granted. var ChatThreadActionCreators = require('../actions/ChatThreadActionCreators')
* var ChatServerActionCreators = require('../actions/ChatServerActionCreators')
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR var ChatMessageActionCreators = require('../actions/ChatMessageActionCreators')
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, var ThreadStore = require('../stores/ThreadStore')
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL var ChatMessageDataUtils = require('../utils/ChatMessageDataUtils')
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN var ChatMessageUtils = require('../utils/ChatMessageUtils')
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. class MessageStore {
*/ constructor() {
this.bindActions(ChatThreadActionCreators)
this.bindActions(ChatMessageActionCreators)
this.bindActions(ChatServerActionCreators)

this.messages = {}
}


var ChatAppDispatcher = require('../dispatcher/ChatAppDispatcher'); onCreateMessage(text) {
var ChatConstants = require('../constants/ChatConstants'); var message = ChatMessageDataUtils.getCreatedMessageData(text)
var ChatMessageUtils = require('../utils/ChatMessageUtils'); this.messages[message.id] = message
var EventEmitter = require('events').EventEmitter; }
var ThreadStore = require('../stores/ThreadStore');
var merge = require('react/lib/merge');


var ActionTypes = ChatConstants.ActionTypes; onReceiveAll(rawMessages) {
var CHANGE_EVENT = 'change'; this._addMessages(rawMessages)
this.waitFor([ThreadStore.dispatchToken])
this._markAllInThreadRead(ThreadStore.getCurrentID())
}


var _messages = {}; onClickThread() {
this.waitFor([ThreadStore.dispatchToken])
this._markAllInThreadRead(ThreadStore.getCurrentID())
}


function _addMessages(rawMessages) { _addMessages(rawMessages) {
rawMessages.forEach(function(message) { rawMessages.forEach((message) => {
if (!_messages[message.id]) { if (!this.messages[message.id]) {
_messages[message.id] = ChatMessageUtils.convertRawMessage( this.messages[message.id] = ChatMessageUtils.convertRawMessage(
message, message,
ThreadStore.getCurrentID() ThreadStore.getCurrentID()
); )
} }
}); })
} }


function _markAllInThreadRead(threadID) { _markAllInThreadRead(threadID) {
for (var id in _messages) { for (var id in this.messages) {
if (_messages[id].threadID === threadID) { if (this.messages[id].threadID === threadID) {
_messages[id].isRead = true; this.messages[id].isRead = true
}
} }
} }
}

var MessageStore = merge(EventEmitter.prototype, {

emitChange: function() {
this.emit(CHANGE_EVENT);
},

/**
* @param {function} callback
*/
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, callback);
},


get: function(id) { static getAllForThread(threadID) {
return _messages[id]; var threadMessages = []
}, var _messages = this.getState().messages

getAll: function() {
return _messages;
},

/**
* @param {string} threadID
*/
getAllForThread: function(threadID) {
var threadMessages = [];
for (var id in _messages) { for (var id in _messages) {
if (_messages[id].threadID === threadID) { if (_messages[id].threadID === threadID) {
threadMessages.push(_messages[id]); threadMessages.push(_messages[id])
} }
} }
threadMessages.sort(function(a, b) { threadMessages.sort(function(a, b) {
if (a.date < b.date) { if (a.date < b.date) {
return -1; return -1
} else if (a.date > b.date) { } else if (a.date > b.date) {
return 1; return 1
} }
return 0; return 0
}); })
return threadMessages; return threadMessages
},

getAllForCurrentThread: function() {
return this.getAllForThread(ThreadStore.getCurrentID());
},

getCreatedMessageData: function(text) {
var timestamp = Date.now();
return {
id: 'm_' + timestamp,
threadID: ThreadStore.getCurrentID(),
authorName: 'Bill', // hard coded for the example
date: new Date(timestamp),
text: text,
isRead: true
};
} }


}); static getAllForCurrentThread() {

return this.getAllForThread(ThreadStore.getCurrentID())
MessageStore.dispatchToken = ChatAppDispatcher.register(function(payload) { }
var action = payload.action;

switch(action.type) {

case ActionTypes.CLICK_THREAD:
ChatAppDispatcher.waitFor([ThreadStore.dispatchToken]);
_markAllInThreadRead(ThreadStore.getCurrentID());
MessageStore.emitChange();
break;

case ActionTypes.CREATE_MESSAGE:
var message = MessageStore.getCreatedMessageData(action.text);
_messages[message.id] = message;
MessageStore.emitChange();
break;

case ActionTypes.RECEIVE_RAW_MESSAGES:
_addMessages(action.rawMessages);
ChatAppDispatcher.waitFor([ThreadStore.dispatchToken]);
_markAllInThreadRead(ThreadStore.getCurrentID());
MessageStore.emitChange();
break;


default: static get(id) {
// do nothing return this.getState().messages[id]
} }


}); static getAll() {
return this.getState().messages
}
}


module.exports = MessageStore; module.exports = alt.createStore(MessageStore, 'MessageStore')

0 comments on commit f4c7bb4

Please sign in to comment.