Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80699 views
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
*/
12
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 assign = require('object-assign');
19
20
var ActionTypes = ChatConstants.ActionTypes;
21
var CHANGE_EVENT = 'change';
22
23
var _messages = {};
24
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
36
function _markAllInThreadRead(threadID) {
37
for (var id in _messages) {
38
if (_messages[id].threadID === threadID) {
39
_messages[id].isRead = true;
40
}
41
}
42
}
43
44
var MessageStore = assign({}, 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
},
56
57
removeChangeListener: function(callback) {
58
this.removeListener(CHANGE_EVENT, callback);
59
},
60
61
get: function(id) {
62
return _messages[id];
63
},
64
65
getAll: function() {
66
return _messages;
67
},
68
69
/**
70
* @param {string} threadID
71
*/
72
getAllForThread: function(threadID) {
73
var threadMessages = [];
74
for (var id in _messages) {
75
if (_messages[id].threadID === threadID) {
76
threadMessages.push(_messages[id]);
77
}
78
}
79
threadMessages.sort(function(a, b) {
80
if (a.date < b.date) {
81
return -1;
82
} else if (a.date > b.date) {
83
return 1;
84
}
85
return 0;
86
});
87
return threadMessages;
88
},
89
90
getAllForCurrentThread: function() {
91
return this.getAllForThread(ThreadStore.getCurrentID());
92
}
93
94
});
95
96
MessageStore.dispatchToken = ChatAppDispatcher.register(function(action) {
97
98
switch(action.type) {
99
100
case ActionTypes.CLICK_THREAD:
101
ChatAppDispatcher.waitFor([ThreadStore.dispatchToken]);
102
_markAllInThreadRead(ThreadStore.getCurrentID());
103
MessageStore.emitChange();
104
break;
105
106
case ActionTypes.CREATE_MESSAGE:
107
var message = ChatMessageUtils.getCreatedMessageData(
108
action.text,
109
action.currentThreadID
110
);
111
_messages[message.id] = message;
112
MessageStore.emitChange();
113
break;
114
115
case ActionTypes.RECEIVE_RAW_MESSAGES:
116
_addMessages(action.rawMessages);
117
ChatAppDispatcher.waitFor([ThreadStore.dispatchToken]);
118
_markAllInThreadRead(ThreadStore.getCurrentID());
119
MessageStore.emitChange();
120
break;
121
122
default:
123
// do nothing
124
}
125
126
});
127
128
module.exports = MessageStore;
129
130