feat: #8509, don't scroll chat to bottom if user scrolled up

v1.18.x
Barış Soner Uşaklı 5 years ago
parent b5df576646
commit 320008cd49

@ -1,6 +1,7 @@
{ {
"chat.chatting_with": "Chat with", "chat.chatting_with": "Chat with",
"chat.placeholder": "Type chat message here, press enter to send", "chat.placeholder": "Type chat message here, press enter to send",
"chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.",
"chat.send": "Send", "chat.send": "Send",
"chat.no_active": "You have no active chats.", "chat.no_active": "You have no active chats.",
"chat.user_typing": "%1 is typing ...", "chat.user_typing": "%1 is typing ...",

@ -56,6 +56,7 @@ define('forum/chats', [
Chats.addRenameHandler(ajaxify.data.roomId, components.get('chat/controls').find('[data-action="rename"]')); Chats.addRenameHandler(ajaxify.data.roomId, components.get('chat/controls').find('[data-action="rename"]'));
Chats.addLeaveHandler(ajaxify.data.roomId, components.get('chat/controls').find('[data-action="leave"]')); Chats.addLeaveHandler(ajaxify.data.roomId, components.get('chat/controls').find('[data-action="leave"]'));
Chats.addScrollHandler(ajaxify.data.roomId, ajaxify.data.uid, $('.chat-content')); Chats.addScrollHandler(ajaxify.data.roomId, ajaxify.data.uid, $('.chat-content'));
Chats.addScrollBottomHandler($('.chat-content'));
Chats.addCharactersLeftHandler($('[component="chat/main-wrapper"]')); Chats.addCharactersLeftHandler($('[component="chat/main-wrapper"]'));
Chats.addIPHandler($('[component="chat/main-wrapper"]')); Chats.addIPHandler($('[component="chat/main-wrapper"]'));
Chats.createAutoComplete($('[component="chat/input"]')); Chats.createAutoComplete($('[component="chat/input"]'));
@ -101,6 +102,7 @@ define('forum/chats', [
Chats.addScrollHandler = function (roomId, uid, el) { Chats.addScrollHandler = function (roomId, uid, el) {
var loading = false; var loading = false;
el.off('scroll').on('scroll', function () { el.off('scroll').on('scroll', function () {
messages.toggleScrollUpAlert(el);
if (loading) { if (loading) {
return; return;
} }
@ -144,6 +146,14 @@ define('forum/chats', [
}); });
}; };
Chats.addScrollBottomHandler = function (chatContent) {
chatContent.parent()
.find('[component="chat/messages/scroll-up-alert"]')
.off('click').on('click', function () {
messages.scrollToBottom(chatContent);
});
};
Chats.addCharactersLeftHandler = function (parent) { Chats.addCharactersLeftHandler = function (parent) {
var element = parent.find('[component="chat/input"]'); var element = parent.find('[component="chat/input"]');
element.on('change keyup paste', function () { element.on('change keyup paste', function () {

@ -84,11 +84,13 @@ define('forum/chats/messages', ['components', 'sounds', 'translator', 'benchpres
function onMessagesParsed(chatContentEl, html) { function onMessagesParsed(chatContentEl, html) {
var newMessage = $(html); var newMessage = $(html);
var isAtBottom = messages.isAtBottom(chatContentEl);
newMessage.appendTo(chatContentEl); newMessage.appendTo(chatContentEl);
newMessage.find('.timeago').timeago(); newMessage.find('.timeago').timeago();
newMessage.find('img:not(.not-responsive)').addClass('img-responsive'); newMessage.find('img:not(.not-responsive)').addClass('img-responsive');
messages.scrollToBottom(chatContentEl); if (isAtBottom) {
messages.scrollToBottom(chatContentEl);
}
$(window).trigger('action:chat.received', { $(window).trigger('action:chat.received', {
messageEl: newMessage, messageEl: newMessage,
@ -112,13 +114,31 @@ define('forum/chats/messages', ['components', 'sounds', 'translator', 'benchpres
} }
}; };
messages.isAtBottom = function (containerEl, threshold) {
if (containerEl.length) {
var distanceToBottom = containerEl[0].scrollHeight - (
containerEl.outerHeight() + containerEl.scrollTop()
);
return distanceToBottom < (threshold || 100);
}
};
messages.scrollToBottom = function (containerEl) { messages.scrollToBottom = function (containerEl) {
if (containerEl.length) { if (containerEl && containerEl.length) {
containerEl.scrollTop(containerEl[0].scrollHeight - containerEl.height()); containerEl.scrollTop(containerEl[0].scrollHeight - containerEl.height());
containerEl.parent()
.find('[component="chat/messages/scroll-up-alert"]')
.addClass('hidden');
} }
}; };
messages.toggleScrollUpAlert = function (containerEl) {
var isAtBottom = messages.isAtBottom(containerEl, 300);
containerEl.parent()
.find('[component="chat/messages/scroll-up-alert"]')
.toggleClass('hidden', isAtBottom);
};
messages.prepEdit = function (inputEl, messageId, roomId) { messages.prepEdit = function (inputEl, messageId, roomId) {
socket.emit('modules.chats.getRaw', { mid: messageId, roomId: roomId }, function (err, raw) { socket.emit('modules.chats.getRaw', { mid: messageId, roomId: roomId }, function (err, raw) {
if (err) { if (err) {

@ -91,7 +91,9 @@ define('chat', [
if (modal.is(':visible')) { if (modal.is(':visible')) {
taskbar.updateActive(modal.attr('data-uuid')); taskbar.updateActive(modal.attr('data-uuid'));
ChatsMessages.scrollToBottom(modal.find('.chat-content')); if (ChatsMessages.isAtBottom(modal.find('.chat-content'))) {
ChatsMessages.scrollToBottom(modal.find('.chat-content'));
}
} else if (!ajaxify.data.template.chats) { } else if (!ajaxify.data.template.chats) {
module.toggleNew(modal.attr('data-uuid'), true, true); module.toggleNew(modal.attr('data-uuid'), true, true);
} }
@ -239,6 +241,7 @@ define('chat', [
Chats.createAutoComplete(chatModal.find('[component="chat/input"]')); Chats.createAutoComplete(chatModal.find('[component="chat/input"]'));
Chats.addScrollHandler(chatModal.attr('data-roomid'), data.uid, chatModal.find('.chat-content')); Chats.addScrollHandler(chatModal.attr('data-roomid'), data.uid, chatModal.find('.chat-content'));
Chats.addScrollBottomHandler(chatModal.find('.chat-content'));
Chats.addCharactersLeftHandler(chatModal); Chats.addCharactersLeftHandler(chatModal);
Chats.addIPHandler(chatModal); Chats.addIPHandler(chatModal);

Loading…
Cancel
Save