more chat refactors

This commit is contained in:
barisusakli
2016-04-30 22:34:36 +03:00
parent bea2344ad4
commit 7365b9cc73
3 changed files with 189 additions and 187 deletions

View File

@@ -1,17 +1,15 @@
'use strict';
/* globals define, app, ajaxify, utils, socket, templates, bootbox */
/* globals define, app, ajaxify, utils, socket, templates */
define('forum/chats', [
'components',
'string',
'sounds',
'forum/infinitescroll',
'translator',
'mousetrap',
'forum/chats/recent',
'forum/chats/search'
], function(components, S, sounds, infinitescroll, translator, mousetrap, recentChats, search) {
'forum/chats/search',
'forum/chats/messages'
], function(components, translator, mousetrap, recentChats, search, messages) {
var Chats = {
initialised: false
};
@@ -35,7 +33,7 @@ define('forum/chats', [
Chats.addHotkeys();
}
Chats.scrollToBottom($('.expanded-chat ul'));
messages.scrollToBottom($('.expanded-chat ul'));
Chats.initialised = true;
@@ -77,16 +75,7 @@ define('forum/chats', [
});
});
components.get('chat/messages')
.on('click', '[data-action="edit"]', function() {
var messageId = $(this).parents('[data-mid]').attr('data-mid');
var inputEl = components.get('chat/input');
Chats.prepEdit(inputEl, messageId, ajaxify.data.roomId);
})
.on('click', '[data-action="delete"]', function() {
var messageId = $(this).parents('[data-mid]').attr('data-mid');
Chats.delete(messageId, ajaxify.data.roomId);
});
Chats.addEditDeleteHandler(components.get('chat/messages'), ajaxify.data.roomId);
recentChats.init();
@@ -94,6 +83,17 @@ define('forum/chats', [
Chats.addRenameHandler(ajaxify.data.roomId, $('[component="chat/room/name"]'));
};
Chats.addEditDeleteHandler = function(element, roomId) {
element.on('click', '[data-action="edit"]', function() {
var messageId = $(this).parents('[data-mid]').attr('data-mid');
var inputEl = components.get('chat/input');
messages.prepEdit(inputEl, messageId, roomId);
}).on('click', '[data-action="delete"]', function() {
var messageId = $(this).parents('[data-mid]').attr('data-mid');
messages.delete(messageId, roomId);
});
};
Chats.addHotkeys = function() {
mousetrap.bind('ctrl+up', function() {
var activeContact = $('.chats-list .bg-primary'),
@@ -118,49 +118,11 @@ define('forum/chats', [
var lastMid = message.attr('data-mid');
var inputEl = components.get('chat/input');
Chats.prepEdit(inputEl, lastMid, ajaxify.data.roomId);
messages.prepEdit(inputEl, lastMid, ajaxify.data.roomId);
}
});
};
Chats.prepEdit = function(inputEl, messageId, roomId) {
socket.emit('modules.chats.getRaw', { mid: messageId, roomId: roomId }, function(err, raw) {
if (err) {
return app.alertError(err.message);
}
// Populate the input field with the raw message content
if (inputEl.val().length === 0) {
// By setting the `data-mid` attribute, I tell the chat code that I am editing a
// message, instead of posting a new one.
inputEl.attr('data-mid', messageId).addClass('editing');
inputEl.val(raw);
}
});
};
Chats.delete = function(messageId, roomId) {
translator.translate('[[modules:chat.delete_message_confirm]]', function(translated) {
bootbox.confirm(translated, function(ok) {
if (!ok) {
return;
}
socket.emit('modules.chats.delete', {
messageId: messageId,
roomId: roomId
}, function(err) {
if (err) {
return app.alertError(err.message);
}
components.get('chat/message', messageId).slideUp('slow', function() {
$(this).remove();
});
});
});
});
};
Chats.addSinceHandler = function(roomId, chatContentEl, sinceEl) {
sinceEl.on('click', function() {
var since = $(this).attr('data-since');
@@ -193,25 +155,15 @@ define('forum/chats', [
};
Chats.addSendHandlers = function(roomId, inputEl, sendEl) {
inputEl.off('keypress').on('keypress', function(e) {
if (e.which === 13 && !e.shiftKey) {
Chats.sendMessage(roomId, inputEl);
messages.sendMessage(roomId, inputEl);
return false;
}
});
inputEl.off('keyup').on('keyup', function() {
var val = !!$(this).val();
if ((val && $(this).attr('data-typing') === 'true') || (!val && $(this).attr('data-typing') === 'false')) {
return;
}
$(this).attr('data-typing', val);
});
sendEl.off('click').on('click', function() {
Chats.sendMessage(roomId, inputEl);
messages.sendMessage(roomId, inputEl);
inputEl.focus();
return false;
});
@@ -320,14 +272,14 @@ define('forum/chats', [
if (!roomId) {
return;
}
socket.emit('modules.chats.get', {roomId: roomId, since: since}, function(err, messages) {
socket.emit('modules.chats.get', {roomId: roomId, since: since}, function(err, messageData) {
if (err) {
return app.alertError(err.message);
}
chatContentEl.find('[component="chat/message"]').remove();
Chats.appendChatMessage(chatContentEl, messages);
messages.appendChatMessage(chatContentEl, messageData);
});
};
@@ -341,34 +293,13 @@ define('forum/chats', [
});
};
Chats.appendChatMessage = function(chatContentEl, data) {
var lastSpeaker = parseInt(chatContentEl.find('.chat-message').last().attr('data-uid'), 10);
if (!Array.isArray(data)) {
data.newSet = lastSpeaker !== data.fromuid;
}
Chats.parseMessage(data, function(html) {
onMessagesParsed(chatContentEl, html);
});
};
function onMessagesParsed(chatContentEl, html) {
var newMessage = $(html);
newMessage.appendTo(chatContentEl);
newMessage.find('.timeago').timeago();
newMessage.find('img:not(.not-responsive)').addClass('img-responsive');
Chats.scrollToBottom(chatContentEl);
}
Chats.addSocketListeners = function() {
socket.on('event:chats.receive', function(data) {
if (parseInt(data.roomId, 10) === parseInt(ajaxify.data.roomId, 10)) {
newMessage = data.self === 0;
data.message.self = data.self;
Chats.appendChatMessage($('.expanded-chat .chat-content'), data.message);
messages.appendChatMessage($('.expanded-chat .chat-content'), data.message);
} else {
if (ajaxify.currentPage.startsWith("chats")) {
var roomEl = $('[data-roomid=' + data.roomId + ']');
@@ -393,29 +324,13 @@ define('forum/chats', [
app.updateUserStatus($('.chats-list [data-uid="' + data.uid + '"] [component="user/status"]'), data.status);
});
Chats.onChatEdit();
messages.onChatMessageEdit();
socket.on('event:chats.roomRename', function(data) {
$('[component="chat/room/name"]').val($('<div/>').html(data.newName).text());
});
};
Chats.onChatEdit = function() {
socket.on('event:chats.edit', function(data) {
data.messages.forEach(function(message) {
var self = parseInt(message.fromuid, 10) === parseInt(app.user.uid);
message.self = self ? 1 : 0;
Chats.parseMessage(message, function(html) {
var body = components.get('chat/message', message.messageId);
if (body.length) {
body.replaceWith(html);
components.get('chat/message', message.messageId).find('.timeago').timeago();
}
});
});
});
};
Chats.resizeMainWindow = function() {
var messagesList = $('.expanded-chat .chat-content');
@@ -434,56 +349,6 @@ define('forum/chats', [
Chats.setActive();
};
Chats.sendMessage = function(roomId, inputEl) {
var msg = inputEl.val();
var mid = inputEl.attr('data-mid');
if (msg.length > ajaxify.data.maximumChatMessageLength) {
return app.alertError('[[error:chat-message-too-long]]');
}
if (!msg.length) {
return;
}
inputEl.val('');
inputEl.removeAttr('data-mid');
if (!mid) {
socket.emit('modules.chats.send', {
roomId: roomId,
message: msg
}, function(err) {
if (err) {
if (err.message === '[[error:email-not-confirmed-chat]]') {
return app.showEmailConfirmWarning(err);
}
return app.alertError(err.message);
}
sounds.play('chat-outgoing');
});
} else {
socket.emit('modules.chats.edit', {
roomId: roomId,
mid: mid,
message: msg
}, function(err) {
if (err) {
return app.alertError(err.message);
}
});
}
};
Chats.scrollToBottom = function(containerEl) {
if (containerEl.length) {
containerEl.scrollTop(
containerEl[0].scrollHeight - containerEl.height()
);
}
};
Chats.setActive = function() {
if (ajaxify.data.roomId) {
socket.emit('modules.chats.markRead', ajaxify.data.roomId);
@@ -493,13 +358,6 @@ define('forum/chats', [
$('.chats-list li[data-roomid="' + ajaxify.data.roomId + '"]').addClass('bg-primary');
};
Chats.parseMessage = function(data, callback) {
templates.parse('partials/chat_message' + (Array.isArray(data) ? 's' : ''), {
messages: data
}, function(html) {
translator.translate(html, callback);
});
};
return Chats;
});