mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 11:35:55 +01:00
inf scroll in chat-content
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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'), {
|
||||
|
||||
@@ -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<messageData.length; i++) {
|
||||
messageData[i].index = indices[messageData[i].messageId.toString()];
|
||||
}
|
||||
|
||||
callback(null, messageData);
|
||||
});
|
||||
});
|
||||
|
||||
if (markRead) {
|
||||
|
||||
@@ -316,6 +316,28 @@ SocketModules.chats.hasPrivateChat = function(socket, uid, callback) {
|
||||
Messaging.hasPrivateChat(socket.uid, uid, callback);
|
||||
};
|
||||
|
||||
SocketModules.chats.getMessages = function(socket, data, callback) {
|
||||
if (!socket.uid || !data.uid || !data.roomId) {
|
||||
return callback(new Error('[[error:invalid-data]]'));
|
||||
}
|
||||
var params = {
|
||||
uid: data.uid,
|
||||
roomId: data.roomId,
|
||||
start: parseInt(data.start, 10) + 1,
|
||||
count: 50,
|
||||
markRead: false
|
||||
};
|
||||
if (socket.uid === parseInt(data.uid, 10)) {
|
||||
return Messaging.getMessages(params, callback);
|
||||
}
|
||||
user.isAdminOrGlobalMod(socket.uid, function(err, isAdminOrGlobalMod) {
|
||||
if (err || !isAdminOrGlobalMod) {
|
||||
return callback(err || new Error('[[error:no-privileges]]'));
|
||||
}
|
||||
Messaging.getMessages(params, callback);
|
||||
});
|
||||
};
|
||||
|
||||
/* Sounds */
|
||||
SocketModules.sounds.getSounds = function(socket, data, callback) {
|
||||
// Read sounds from local directory
|
||||
|
||||
Reference in New Issue
Block a user