Skip to content

Commit f4c7bb4

Browse files
committed
Converts MessageStore
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.
1 parent 58ea141 commit f4c7bb4

File tree

1 file changed

+64
-112
lines changed

1 file changed

+64
-112
lines changed
Lines changed: 64 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,134 +1,86 @@
1-
/**
2-
* This file is provided by Facebook for testing and evaluation purposes
3-
* only. Facebook reserves all rights not expressly granted.
4-
*
5-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
6-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
8-
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
9-
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
10-
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11-
*/
1+
var alt = require('../alt')
2+
3+
var ChatThreadActionCreators = require('../actions/ChatThreadActionCreators')
4+
var ChatServerActionCreators = require('../actions/ChatServerActionCreators')
5+
var ChatMessageActionCreators = require('../actions/ChatMessageActionCreators')
6+
var ThreadStore = require('../stores/ThreadStore')
7+
var ChatMessageDataUtils = require('../utils/ChatMessageDataUtils')
8+
var ChatMessageUtils = require('../utils/ChatMessageUtils')
9+
10+
class MessageStore {
11+
constructor() {
12+
this.bindActions(ChatThreadActionCreators)
13+
this.bindActions(ChatMessageActionCreators)
14+
this.bindActions(ChatServerActionCreators)
15+
16+
this.messages = {}
17+
}
1218

13-
var ChatAppDispatcher = require('../dispatcher/ChatAppDispatcher');
14-
var ChatConstants = require('../constants/ChatConstants');
15-
var ChatMessageUtils = require('../utils/ChatMessageUtils');
16-
var EventEmitter = require('events').EventEmitter;
17-
var ThreadStore = require('../stores/ThreadStore');
18-
var merge = require('react/lib/merge');
19+
onCreateMessage(text) {
20+
var message = ChatMessageDataUtils.getCreatedMessageData(text)
21+
this.messages[message.id] = message
22+
}
1923

20-
var ActionTypes = ChatConstants.ActionTypes;
21-
var CHANGE_EVENT = 'change';
24+
onReceiveAll(rawMessages) {
25+
this._addMessages(rawMessages)
26+
this.waitFor([ThreadStore.dispatchToken])
27+
this._markAllInThreadRead(ThreadStore.getCurrentID())
28+
}
2229

23-
var _messages = {};
30+
onClickThread() {
31+
this.waitFor([ThreadStore.dispatchToken])
32+
this._markAllInThreadRead(ThreadStore.getCurrentID())
33+
}
2434

25-
function _addMessages(rawMessages) {
26-
rawMessages.forEach(function(message) {
27-
if (!_messages[message.id]) {
28-
_messages[message.id] = ChatMessageUtils.convertRawMessage(
29-
message,
30-
ThreadStore.getCurrentID()
31-
);
32-
}
33-
});
34-
}
35+
_addMessages(rawMessages) {
36+
rawMessages.forEach((message) => {
37+
if (!this.messages[message.id]) {
38+
this.messages[message.id] = ChatMessageUtils.convertRawMessage(
39+
message,
40+
ThreadStore.getCurrentID()
41+
)
42+
}
43+
})
44+
}
3545

36-
function _markAllInThreadRead(threadID) {
37-
for (var id in _messages) {
38-
if (_messages[id].threadID === threadID) {
39-
_messages[id].isRead = true;
46+
_markAllInThreadRead(threadID) {
47+
for (var id in this.messages) {
48+
if (this.messages[id].threadID === threadID) {
49+
this.messages[id].isRead = true
50+
}
4051
}
4152
}
42-
}
43-
44-
var MessageStore = merge(EventEmitter.prototype, {
45-
46-
emitChange: function() {
47-
this.emit(CHANGE_EVENT);
48-
},
49-
50-
/**
51-
* @param {function} callback
52-
*/
53-
addChangeListener: function(callback) {
54-
this.on(CHANGE_EVENT, callback);
55-
},
5653

57-
get: function(id) {
58-
return _messages[id];
59-
},
60-
61-
getAll: function() {
62-
return _messages;
63-
},
64-
65-
/**
66-
* @param {string} threadID
67-
*/
68-
getAllForThread: function(threadID) {
69-
var threadMessages = [];
54+
static getAllForThread(threadID) {
55+
var threadMessages = []
56+
var _messages = this.getState().messages
7057
for (var id in _messages) {
7158
if (_messages[id].threadID === threadID) {
72-
threadMessages.push(_messages[id]);
59+
threadMessages.push(_messages[id])
7360
}
7461
}
7562
threadMessages.sort(function(a, b) {
7663
if (a.date < b.date) {
77-
return -1;
64+
return -1
7865
} else if (a.date > b.date) {
79-
return 1;
66+
return 1
8067
}
81-
return 0;
82-
});
83-
return threadMessages;
84-
},
85-
86-
getAllForCurrentThread: function() {
87-
return this.getAllForThread(ThreadStore.getCurrentID());
88-
},
89-
90-
getCreatedMessageData: function(text) {
91-
var timestamp = Date.now();
92-
return {
93-
id: 'm_' + timestamp,
94-
threadID: ThreadStore.getCurrentID(),
95-
authorName: 'Bill', // hard coded for the example
96-
date: new Date(timestamp),
97-
text: text,
98-
isRead: true
99-
};
68+
return 0
69+
})
70+
return threadMessages
10071
}
10172

102-
});
103-
104-
MessageStore.dispatchToken = ChatAppDispatcher.register(function(payload) {
105-
var action = payload.action;
106-
107-
switch(action.type) {
108-
109-
case ActionTypes.CLICK_THREAD:
110-
ChatAppDispatcher.waitFor([ThreadStore.dispatchToken]);
111-
_markAllInThreadRead(ThreadStore.getCurrentID());
112-
MessageStore.emitChange();
113-
break;
114-
115-
case ActionTypes.CREATE_MESSAGE:
116-
var message = MessageStore.getCreatedMessageData(action.text);
117-
_messages[message.id] = message;
118-
MessageStore.emitChange();
119-
break;
120-
121-
case ActionTypes.RECEIVE_RAW_MESSAGES:
122-
_addMessages(action.rawMessages);
123-
ChatAppDispatcher.waitFor([ThreadStore.dispatchToken]);
124-
_markAllInThreadRead(ThreadStore.getCurrentID());
125-
MessageStore.emitChange();
126-
break;
73+
static getAllForCurrentThread() {
74+
return this.getAllForThread(ThreadStore.getCurrentID())
75+
}
12776

128-
default:
129-
// do nothing
77+
static get(id) {
78+
return this.getState().messages[id]
13079
}
13180

132-
});
81+
static getAll() {
82+
return this.getState().messages
83+
}
84+
}
13385

134-
module.exports = MessageStore;
86+
module.exports = alt.createStore(MessageStore, 'MessageStore')

0 commit comments

Comments
 (0)