143 lines
5.5 KiB
JavaScript
Executable File
143 lines
5.5 KiB
JavaScript
Executable File
Chat = React.createClass({
|
|
mixins: [ReactMeteorData],
|
|
getMeteorData() {
|
|
let chatMessages, privateChatName, chattingWith, user, messageFontSize, temp;
|
|
|
|
messageFontSize = { fontSize: getInSession("messageFontSize") + 'px' };
|
|
chattingWith = getInSession('inChatWith');
|
|
if(chattingWith === 'PUBLIC_CHAT') { // find all public and system messages
|
|
chatMessages = Meteor.Chat.find({ 'message.chat_type': { $in: ["SYSTEM_MESSAGE", "PUBLIC_CHAT"] }},
|
|
{ sort: { 'message.from_time': 1 }}).fetch();
|
|
} else {
|
|
chatMessages = Meteor.Chat.find({ 'message.chat_type': 'PRIVATE_CHAT', $or: [{ 'message.to_userid': chattingWith },
|
|
{ 'message.from_userid': chattingWith }]}).fetch();
|
|
}
|
|
user = Meteor.Users.findOne({ userId: chattingWith });
|
|
if(user != null) {
|
|
privateChatName = user.user.name;
|
|
}
|
|
|
|
return {
|
|
chatMessages: chatMessages,
|
|
privateChatName: privateChatName,
|
|
messageFontSize: messageFontSize
|
|
};
|
|
},
|
|
|
|
detectUnreadChat: function() {
|
|
//if the current tab is not the same as the tab we just published in
|
|
return Meteor.Chat.find({}).observe({
|
|
added: (_this => {
|
|
return function(chatMessage) {
|
|
let findDestinationTab;
|
|
findDestinationTab = function() {
|
|
let ref, ref1;
|
|
if(((ref = chatMessage.message) != null ? ref.chat_type : void 0) === "PUBLIC_CHAT") {
|
|
return "PUBLIC_CHAT";
|
|
} else {
|
|
return (ref1 = chatMessage.message) != null ? ref1.from_userid : void 0;
|
|
}
|
|
};
|
|
return Tracker.autorun(comp => {
|
|
let destinationTab, tabsTime;
|
|
tabsTime = getInSession('userListRenderedTime');
|
|
if((tabsTime != null) && chatMessage.message.from_userid !== "SYSTEM_MESSAGE" && chatMessage.message.from_time - tabsTime > 0) {
|
|
populateNotifications(chatMessage); // check if we need to show a new notification
|
|
destinationTab = findDestinationTab();
|
|
if(destinationTab !== getInSession("inChatWith")) {
|
|
setInSession('chats', getInSession('chats').map(tab => {
|
|
if(tab.userId === destinationTab) {
|
|
tab.gotMail = true;
|
|
tab.number++;
|
|
}
|
|
return tab;
|
|
}));
|
|
}
|
|
}
|
|
return comp.stop();
|
|
});
|
|
};
|
|
})(this)
|
|
});
|
|
},
|
|
|
|
componentDidMount: function(){
|
|
this.detectUnreadChat();
|
|
},
|
|
|
|
getCombinedMessagesForChat(msgs) {
|
|
let deleted, i, j, len;
|
|
len = msgs != null ? msgs.length : void 0; // get length of messages
|
|
i = 0;
|
|
while(i < len) { // Must be a do while, for loop compiles and stores the length of array which can change inside the loop!
|
|
if(msgs[i].message.from_userid !== 'System') { // skip system messages
|
|
j = i + 1; // Start looking at messages right after the current one
|
|
while(j < len) {
|
|
deleted = false;
|
|
if(msgs[j].message.from_userid !== 'System') { // Ignore system messages
|
|
// Check if the time discrepancy between the two messages exceeds window for grouping
|
|
if((parseFloat(msgs[j].message.from_time) - parseFloat(msgs[i].message.from_time)) >= 60000) { // 60 seconds/1 minute
|
|
break; // Messages are too far between, so them seperated and stop joining here
|
|
}
|
|
if(msgs[i].message.from_userid === msgs[j].message.from_userid) { // Both messages are from the same user
|
|
// insert a '\r' carriage return character between messages to put them on a new line
|
|
msgs[i].message.message += `${CARRIAGE_RETURN}${msgs[j].message.message}`; // Combine the messages
|
|
msgs.splice(j, 1); // Delete the message from the collection
|
|
deleted = true;
|
|
} else {
|
|
break; // Messages are from different people, move on
|
|
}
|
|
} else {
|
|
break; // This is the break point in the chat, don't merge
|
|
}
|
|
len = msgs.length;
|
|
if(!deleted) {
|
|
++j;
|
|
}
|
|
}
|
|
}
|
|
++i;
|
|
len = msgs.length;
|
|
}
|
|
return msgs;
|
|
},
|
|
|
|
inPrivateChat(){
|
|
return (getInSession('inChatWith') !== 'PUBLIC_CHAT');
|
|
},
|
|
|
|
userExists() {
|
|
if(getInSession('inChatWith') === "PUBLIC_CHAT") {
|
|
return true;
|
|
} else {
|
|
return Meteor.Users.findOne({
|
|
userId: getInSession('inChatWith')
|
|
}) != null;
|
|
}
|
|
},
|
|
|
|
render(){
|
|
return (
|
|
<div id="chat" className="component">
|
|
<div className="chatBodyContainer">
|
|
{this.inPrivateChat() ?
|
|
<PrivateChatToolBar inPrivateChat={this.inPrivateChat} privateChatName={this.data.privateChatName}/>
|
|
: null }
|
|
<div id="chatbody">
|
|
<ul className="chat" style={this.data.messageFontSize}>
|
|
{this.getCombinedMessagesForChat(this.data.chatMessages).map((message) =>
|
|
<ChatMessage key={message.id} message={message} messageFontSize={this.data.messageFontSize}/>
|
|
)}
|
|
{this.userExists ? null : <li>The user has left</li> }
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{this.userExists ?
|
|
<div className="panel-footer">
|
|
<ChatInputControls inPrivateChat={this.inPrivateChat()}/>
|
|
</div>
|
|
: null }
|
|
</div>
|
|
);
|
|
}
|
|
}); |