@jsxc/jsxc
Version:
Real-time XMPP chat application with video calls, file transfer and encrypted communication
113 lines (84 loc) • 2.86 kB
text/typescript
import Dialog from '../Dialog';
import Contact from '../../Contact';
import * as CONST from '../../CONST';
import Client from '../../Client';
import JID from '../../JID';
let contactTemplate = require('../../../template/contact.hbs');
let dialog: Dialog;
export default function (username?: string, alias?: string) {
username = typeof username === 'string' ? username : undefined;
let content = contactTemplate({
accounts: Client.getAccountManager()
.getAccounts()
.map(account => ({
uid: account.getUid(),
jid: account.getJID().bare,
})),
username,
alias,
});
dialog = new Dialog(content);
let dom = dialog.open();
dom.find('[name="username"]').on('keyup', onUsernameKeyUp);
dom.find('[name="username"]').on('input', onUsernameInput);
dom.find('form').submit(onSubmit);
}
async function onUsernameKeyUp() {
let getUsers = Client.getOption('getUsers');
if (typeof getUsers !== 'function') {
return;
}
let val = $(this).val();
$('#jsxc-userlist').empty();
if (val === '') {
return;
}
//@TODO delay execution
let list = await getUsers(val);
$('#jsxc-userlist').empty();
for (let uid in list) {
let displayName = list[uid];
let option = $('<option>');
option.attr('data-username', uid.toString());
option.attr('data-alias', displayName);
option.attr('value', uid.toString()).appendTo('#jsxc-userlist');
if (uid !== displayName) {
option.clone().attr('value', displayName).appendTo('#jsxc-userlist');
}
}
}
function onUsernameInput() {
let val = $(this).val();
let option = $('#jsxc-userlist').find('option[data-username="' + val + '"], option[data-alias="' + val + '"]');
if (option.length > 0) {
$('#jsxc-username').val(option.attr('data-username'));
$('#jsxc-alias').val(option.attr('data-alias'));
}
}
function onSubmit(ev) {
ev.preventDefault();
let username = <string>$('#jsxc-username').val();
let alias = <string>$('#jsxc-alias').val();
let accountId = <string>$('#jsxc-account').val();
let account = Client.getAccountManager().getAccount(accountId);
if (!username.match(/@(.*)$/)) {
username += '@' + account.getJID().domain;
}
// Check if the username is valid
if (!username || !username.match(CONST.REGEX.JID)) {
// Add notification
$('#jsxc-username')
.addClass('jsxc-invalid')
.keyup(function () {
if ((<string>$(this).val()).match(CONST.REGEX.JID)) {
$(this).removeClass('jsxc-invalid');
}
});
return false;
}
let jid = new JID(username);
let contact = new Contact(account, jid, alias);
account.getContactManager().add(contact);
//@TODO show spinner
dialog.close();
}