Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80698 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 assign = require('object-assign');
18
19
var ActionTypes = ChatConstants.ActionTypes;
20
var CHANGE_EVENT = 'change';
21
22
var _currentID = null;
23
var _threads = {};
24
25
var ThreadStore = assign({}, EventEmitter.prototype, {
26
27
init: function(rawMessages) {
28
rawMessages.forEach(function(message) {
29
var threadID = message.threadID;
30
var thread = _threads[threadID];
31
if (thread && thread.lastTimestamp > message.timestamp) {
32
return;
33
}
34
_threads[threadID] = {
35
id: threadID,
36
name: message.threadName,
37
lastMessage: ChatMessageUtils.convertRawMessage(message, _currentID)
38
};
39
}, this);
40
41
if (!_currentID) {
42
var allChrono = this.getAllChrono();
43
_currentID = allChrono[allChrono.length - 1].id;
44
}
45
46
_threads[_currentID].lastMessage.isRead = true;
47
},
48
49
emitChange: function() {
50
this.emit(CHANGE_EVENT);
51
},
52
53
/**
54
* @param {function} callback
55
*/
56
addChangeListener: function(callback) {
57
this.on(CHANGE_EVENT, callback);
58
},
59
60
/**
61
* @param {function} callback
62
*/
63
removeChangeListener: function(callback) {
64
this.removeListener(CHANGE_EVENT, callback);
65
},
66
67
/**
68
* @param {string} id
69
*/
70
get: function(id) {
71
return _threads[id];
72
},
73
74
getAll: function() {
75
return _threads;
76
},
77
78
getAllChrono: function() {
79
var orderedThreads = [];
80
for (var id in _threads) {
81
var thread = _threads[id];
82
orderedThreads.push(thread);
83
}
84
orderedThreads.sort(function(a, b) {
85
if (a.lastMessage.date < b.lastMessage.date) {
86
return -1;
87
} else if (a.lastMessage.date > b.lastMessage.date) {
88
return 1;
89
}
90
return 0;
91
});
92
return orderedThreads;
93
},
94
95
getCurrentID: function() {
96
return _currentID;
97
},
98
99
getCurrent: function() {
100
return this.get(this.getCurrentID());
101
}
102
103
});
104
105
ThreadStore.dispatchToken = ChatAppDispatcher.register(function(action) {
106
107
switch(action.type) {
108
109
case ActionTypes.CLICK_THREAD:
110
_currentID = action.threadID;
111
_threads[_currentID].lastMessage.isRead = true;
112
ThreadStore.emitChange();
113
break;
114
115
case ActionTypes.RECEIVE_RAW_MESSAGES:
116
ThreadStore.init(action.rawMessages);
117
ThreadStore.emitChange();
118
break;
119
120
default:
121
// do nothing
122
}
123
124
});
125
126
module.exports = ThreadStore;
127
128