From 55396ca442033ebb11302a7ea06170815dd3b85d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 20 Sep 2016 16:58:50 +0300 Subject: [PATCH] inf scroll in chat-content --- public/src/client/chats.js | 33 +++++++++++++++++++++++++++++++++ public/src/modules/chat.js | 4 +++- src/messaging.js | 33 ++++++++++++++++++++++++--------- src/socket.io/modules.js | 22 ++++++++++++++++++++++ 4 files changed, 82 insertions(+), 10 deletions(-) diff --git a/public/src/client/chats.js b/public/src/client/chats.js index e2019c6c5a..2435042289 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -81,6 +81,39 @@ define('forum/chats', [ Chats.addSinceHandler(ajaxify.data.roomId, $('.expanded-chat .chat-content'), $('.expanded-chat [data-since]')); Chats.addRenameHandler(ajaxify.data.roomId, $('[component="chat/room/name"]')); + Chats.addScrollHandler(ajaxify.data.roomId, ajaxify.data.uid, $('.chat-content')); + }; + + Chats.addScrollHandler = function(roomId, uid, el) { + var loading = false; + el.off('scroll').on('scroll', function() { + if (loading) { + return; + } + + var top = (el[0].scrollHeight - el.height()) * 0.1; + if (el.scrollTop() >= top) { + return; + } + loading = true; + + socket.emit('modules.chats.getMessages', {roomId: roomId, uid: uid, start: $('.chat-content').children('[data-index]').first().attr('data-index')}, function(err, data) { + if (err) { + return app.alertError(err.message); + } + + messages.parseMessage(data, function(html) { + var currentScrollTop = el.scrollTop(); + var previousHeight = el[0].scrollHeight; + html = $(html); + el.prepend(html); + html.find('.timeago').timeago(); + html.find('img:not(.not-responsive)').addClass('img-responsive'); + el.scrollTop((el[0].scrollHeight - previousHeight) + currentScrollTop); + loading = false; + }); + }); + }); }; Chats.addEditDeleteHandler = function(element, roomId) { diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 5178d2d03c..7b87b6e376 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -104,7 +104,7 @@ define('chat', [ }; module.loadChatsDropdown = function(chatsListEl) { - socket.emit('modules.chats.getRecentChats', {after: 0}, function(err, data) { + socket.emit('modules.chats.getRecentChats', {uid: app.user.uid, after: 0}, function(err, data) { if (err) { return app.alertError(err.message); } @@ -261,6 +261,8 @@ define('chat', [ Chats.loadChatSince(chatModal.attr('roomId'), chatModal.find('.chat-content'), 'recent'); + Chats.addScrollHandler(chatModal.attr('roomId'), app.user.uid, chatModal.find('.chat-content')); + checkStatus(chatModal); taskbar.push('chat', chatModal.attr('UUID'), { diff --git a/src/messaging.js b/src/messaging.js index b17bea6ec2..2fe69e50fe 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -49,21 +49,22 @@ var async = require('async'), }; Messaging.getMessages = function(params, callback) { - var uid = params.uid, - roomId = params.roomId, - since = params.since, - isNew = params.isNew, - count = params.count || 250, - markRead = params.markRead || true; + var uid = params.uid; + var roomId = params.roomId; + var since = params.since; + var isNew = params.isNew; + var start = params.hasOwnProperty('start') ? params.start : 0; + var count = params.count || 250; + var markRead = params.markRead || true; var min = params.count ? 0 : Date.now() - (terms[since] || terms.day); if (since === 'recent') { - count = 49; + count = 50; min = 0; } - db.getSortedSetRevRangeByScore('uid:' + uid + ':chat:room:' + roomId + ':mids', 0, count, '+inf', min, function(err, mids) { + db.getSortedSetRevRangeByScore('uid:' + uid + ':chat:room:' + roomId + ':mids', start, count, '+inf', min, function(err, mids) { if (err) { return callback(err); } @@ -71,10 +72,24 @@ var async = require('async'), if (!Array.isArray(mids) || !mids.length) { return callback(null, []); } + var indices = {}; + mids.forEach(function(mid, index) { + indices[mid] = start + index; + }); mids.reverse(); - Messaging.getMessagesData(mids, uid, roomId, isNew, callback); + Messaging.getMessagesData(mids, uid, roomId, isNew, function(err, messageData) { + if (err) { + return callback(err); + } + + for(var i=0; i