@jsxc/jsxc
Version:
Real-time XMPP chat application with video calls, file transfer and encrypted communication
128 lines (101 loc) • 3.82 kB
text/typescript
import Dialog from '../Dialog';
import Translation from '../../util/Translation';
import Client from '../../Client';
import BlockingCommandPlugin from '../../plugins/BlockingCommandPlugin';
import Log from '@util/Log';
let contactBlockList = require('../../../template/contactBlock.hbs');
let dialog: Dialog;
export default function () {
let content = contactBlockList({});
dialog = new Dialog(content);
dialog.open();
let accounts = Client.getAccountManager().getAccounts();
accounts.forEach(account => {
let accountoption = $('<option>').text(account.getJID().bare).val(account.getUid());
dialog.getDom().find('select[name="account"]').append(accountoption);
});
//@TODO check support
dialog
.getDom()
.find('select[name="account"]')
.on('change', ev => {
let uid = $(ev.target).val().toString();
let account = Client.getAccountManager().getAccount(uid);
let blockPlugin = account
.getPluginRepository()
.getPlugin(BlockingCommandPlugin.getId()) as BlockingCommandPlugin;
removeWarnings();
dialog.getDom().find('textarea[name="jsxc-blocklist-textarea"]').val('');
blockPlugin
.hasSupport()
.then(hasSupport => {
if (hasSupport) {
getBlockList(blockPlugin);
} else {
appendWarning(Translation.t('blocking_cmd_not_supported'));
}
})
.catch(err => {
Log.warn('Can not check support for blocking command', err);
appendWarning(Translation.t('UNKNOWN_ERROR'));
});
});
dialog.getDom().find('select[name="account"]').trigger('change');
}
function getBlockList(blockPlugin: BlockingCommandPlugin) {
let dom = dialog.getDom();
dom.find('.jsxc-warning').remove();
blockPlugin
.getBlocklist()
.then(function (blocklist) {
let textfield = dialog.getDom().find('textarea[name="jsxc-blocklist-textarea"]');
textfield.val(blocklist.join('\n'));
initSubmit(dialog, blockPlugin, blocklist);
})
.catch(err => {
Log.warn('Can not get block list', err);
appendWarning(Translation.t('UNKNOWN_ERROR'));
});
}
function initSubmit(dialog: Dialog, blockPlugin: BlockingCommandPlugin, oldBlocklist: string[]) {
dialog
.getDom()
.find('form')
.off('submit')
.on('submit', ev => {
ev.preventDefault();
dialog.getDom().find('input, button').prop('disabled', true);
let textarea = dialog.getDom().find('textarea[name="jsxc-blocklist-textarea"]');
let lines = textarea
.val()
.toString()
.split('\n')
.map(item => item.trim());
lines = lines.filter(item => item.length > 0 && /^(\w+([-+.']\w+)*@)?\w+([-.]\w+)*(\/[-.\w])?$/.test(item));
textarea.val(lines.join('\n'));
let unblockedJids: string[] = <any>$(oldBlocklist)
.not(lines as any)
.get();
let blockedJids: string[] = <any>$(lines)
.not(oldBlocklist as any)
.get();
let promises = [];
if (unblockedJids.length > 0 || lines.length === 0) {
promises.push(blockPlugin.unblock(unblockedJids));
}
if (blockedJids.length > 0) {
promises.push(blockPlugin.block(blockedJids));
}
Promise.all(promises).then(() => {
dialog.close();
});
});
}
function appendWarning(text: string) {
let dom = dialog.getDom();
$('<div>').addClass('jsxc-warning').text(text).appendTo(dom);
}
function removeWarnings() {
let dom = dialog.getDom();
dom.find('.jsxc-warning').remove();
}