You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.5 KiB
JavaScript
86 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
|
|
define('forum/chats/user-list', ['api'], function (api) {
|
|
const userList = {};
|
|
|
|
let updateInterval = 0;
|
|
|
|
userList.init = function (roomId, container) {
|
|
const userListEl = container.find('[component="chat/user/list"]');
|
|
if (!userListEl.length) {
|
|
return;
|
|
}
|
|
const pinnedMessageListEl = container.find('[component="chat/messages/pinned/container"]');
|
|
container.find('[component="chat/user/list/btn"]').on('click', () => {
|
|
userListEl.toggleClass('hidden');
|
|
if (userListEl.hasClass('hidden')) {
|
|
stopUpdating();
|
|
} else {
|
|
pinnedMessageListEl.addClass('hidden');
|
|
startUpdating(roomId, userListEl);
|
|
}
|
|
});
|
|
|
|
$(window).off('action:ajaxify.start', stopUpdating)
|
|
.one('action:ajaxify.start', stopUpdating);
|
|
|
|
userList.addInfiniteScrollHandler(roomId, userListEl, async (listEl, data) => {
|
|
listEl.append(await app.parseAndTranslate('partials/chats/user-list', 'users', data));
|
|
});
|
|
};
|
|
|
|
function startUpdating(roomId, userListEl) {
|
|
if (updateInterval) {
|
|
clearInterval(updateInterval);
|
|
}
|
|
updateInterval = setInterval(() => {
|
|
updateUserList(roomId, userListEl);
|
|
}, 5000);
|
|
}
|
|
|
|
function stopUpdating() {
|
|
if (updateInterval) {
|
|
clearInterval(updateInterval);
|
|
updateInterval = 0;
|
|
}
|
|
}
|
|
|
|
async function updateUserList(roomId, userListEl) {
|
|
if (ajaxify.data.template.chats && app.isFocused && userListEl.scrollTop() === 0 && !userListEl.hasClass('hidden')) {
|
|
const data = await api.get(`/chats/${roomId}/users`, { start: 0 });
|
|
userListEl.find('[data-bs-toggle="tooltip"]').tooltip('dispose');
|
|
userListEl.html(await app.parseAndTranslate('partials/chats/user-list', 'users', data));
|
|
userListEl.find('[data-bs-toggle="tooltip"]').tooltip();
|
|
}
|
|
}
|
|
|
|
userList.addInfiniteScrollHandler = function (roomId, listEl, callback) {
|
|
listEl.on('scroll', utils.debounce(async () => {
|
|
const bottom = (listEl[0].scrollHeight - listEl.height()) * 0.85;
|
|
if (listEl.scrollTop() > bottom) {
|
|
const lastIndex = listEl.find('[data-index]').last().attr('data-index');
|
|
const data = await api.get(`/chats/${roomId}/users`, {
|
|
start: parseInt(lastIndex, 10) + 1,
|
|
});
|
|
if (data && data.users.length) {
|
|
callback(listEl, data);
|
|
}
|
|
}
|
|
}, 200));
|
|
};
|
|
|
|
userList.addSearchHandler = function (roomId, inputEl, callback) {
|
|
inputEl.on('keyup', utils.debounce(async () => {
|
|
const username = inputEl.val();
|
|
const data = await socket.emit('modules.chats.searchMembers', {
|
|
username: username,
|
|
roomId: roomId,
|
|
});
|
|
callback(data);
|
|
}, 200));
|
|
};
|
|
|
|
return userList;
|
|
});
|