121 lines
3.7 KiB
JavaScript
121 lines
3.7 KiB
JavaScript
'use strict';
|
|
|
|
|
|
define('forum/chats/manage', [
|
|
'api', 'alerts', 'translator', 'autocomplete', 'forum/chats/user-list',
|
|
], function (api, alerts, translator, autocomplete, userList) {
|
|
const manage = {};
|
|
|
|
manage.init = function (roomId, buttonEl) {
|
|
let modal;
|
|
|
|
buttonEl.on('click', async function () {
|
|
let groups = [];
|
|
if (app.user.isAdmin) {
|
|
groups = await socket.emit('groups.getChatGroups', {});
|
|
if (Array.isArray(ajaxify.data.groups)) {
|
|
groups.forEach((g) => {
|
|
g.selected = ajaxify.data.groups.includes(g.name);
|
|
});
|
|
}
|
|
}
|
|
|
|
const html = await app.parseAndTranslate('modals/manage-room', {
|
|
groups,
|
|
user: app.user,
|
|
group: ajaxify.data,
|
|
});
|
|
modal = bootbox.dialog({
|
|
title: '[[modules:chat.manage-room]]',
|
|
message: html,
|
|
onEscape: true,
|
|
});
|
|
|
|
modal.attr('component', 'chat/manage-modal');
|
|
|
|
refreshParticipantsList(roomId, modal);
|
|
addKickHandler(roomId, modal);
|
|
addToggleOwnerHandler(roomId, modal);
|
|
|
|
const userListEl = modal.find('[component="chat/manage/user/list"]');
|
|
const userListElSearch = modal.find('[component="chat/manage/user/list/search"]');
|
|
userList.addSearchHandler(roomId, userListElSearch, async (data) => {
|
|
if (userListElSearch.val()) {
|
|
userListEl.html(await app.parseAndTranslate('partials/chats/manage-room-users', data));
|
|
} else {
|
|
refreshParticipantsList(roomId, modal);
|
|
}
|
|
});
|
|
|
|
userList.addInfiniteScrollHandler(roomId, userListEl, async (listEl, data) => {
|
|
listEl.append(await app.parseAndTranslate('partials/chats/manage-room-users', data));
|
|
});
|
|
|
|
const searchInput = modal.find('[component="chat/manage/user/add/search"]');
|
|
const errorEl = modal.find('.text-danger');
|
|
autocomplete.user(searchInput, function (event, selected) {
|
|
errorEl.text('');
|
|
api.post(`/chats/${roomId}/users`, {
|
|
uids: [selected.item.user.uid],
|
|
}).then((body) => {
|
|
refreshParticipantsList(roomId, modal, body);
|
|
searchInput.val('');
|
|
}).catch((err) => {
|
|
translator.translate(err.message, function (translated) {
|
|
errorEl.text(translated);
|
|
});
|
|
});
|
|
});
|
|
|
|
modal.find('[component="chat/manage/save/groups"]').on('click', (ev) => {
|
|
const btn = $(ev.target);
|
|
api.put(`/chats/${roomId}`, {
|
|
groups: modal.find('[component="chat/room/groups"]').val(),
|
|
}).then((payload) => {
|
|
ajaxify.data.groups = payload.groups;
|
|
btn.addClass('btn-success');
|
|
setTimeout(() => btn.removeClass('btn-success'), 1000);
|
|
}).catch(alerts.error);
|
|
});
|
|
});
|
|
};
|
|
|
|
function addKickHandler(roomId, modal) {
|
|
modal.on('click', '[data-action="kick"]', function () {
|
|
const uid = parseInt(this.getAttribute('data-uid'), 10);
|
|
|
|
api.del(`/chats/${roomId}/users/${uid}`, {}).then((body) => {
|
|
refreshParticipantsList(roomId, modal, body);
|
|
}).catch(alerts.error);
|
|
});
|
|
}
|
|
|
|
function addToggleOwnerHandler(roomId, modal) {
|
|
modal.on('click', '[data-action="toggleOwner"]', async function () {
|
|
const uid = parseInt(this.getAttribute('data-uid'), 10);
|
|
const $this = $(this);
|
|
await socket.emit('modules.chats.toggleOwner', { roomId: roomId, uid: uid });
|
|
$this.parents('[data-uid]')
|
|
.find('[component="chat/manage/user/owner/icon"]')
|
|
.toggleClass('hidden');
|
|
});
|
|
}
|
|
|
|
async function refreshParticipantsList(roomId, modal, data) {
|
|
const listEl = modal.find('[component="chat/manage/user/list"]');
|
|
|
|
if (!data) {
|
|
try {
|
|
data = await api.get(`/chats/${roomId}/users`, {});
|
|
} catch (err) {
|
|
listEl.find('li').text(await translator.translate('[[error:invalid-data]]'));
|
|
}
|
|
}
|
|
listEl.find('[data-bs-toggle="tooltip"]').tooltip('dispose');
|
|
listEl.html(await app.parseAndTranslate('partials/chats/manage-room-users', data));
|
|
listEl.find('[data-bs-toggle="tooltip"]').tooltip();
|
|
}
|
|
|
|
return manage;
|
|
});
|