Commit 37f43989 authored by JC Brand's avatar JC Brand Committed by GitHub

Merge pull request #1269 from conversejs/async-await

Async await
parents c583678c ad27edb2
...@@ -9569,12 +9569,15 @@ body.reset { ...@@ -9569,12 +9569,15 @@ body.reset {
max-height: 200px; } max-height: 200px; }
#conversejs.converse-overlayed .emoji-picker { #conversejs.converse-overlayed .emoji-picker {
height: 100px; } height: 100px; }
#conversejs.converse-overlayed .chatbox form.sendXMPPMessage .chat-toolbar li .toolbar-menu { #conversejs.converse-overlayed .chatbox .sendXMPPMessage .chat-toolbar li .toolbar-menu {
min-width: 235px; } min-width: 235px; }
#conversejs.converse-overlayed .chatbox form.sendXMPPMessage .chat-toolbar li .toolbar-menu ul.emoji-toolbar { #conversejs.converse-overlayed .chatbox .sendXMPPMessage .chat-toolbar li .toolbar-menu ul.emoji-toolbar {
width: 100%; } width: 100%; }
#conversejs.converse-overlayed .chatbox form.sendXMPPMessage .chat-toolbar li .toolbar-menu ul.emoji-toolbar .emoji-category { #conversejs.converse-overlayed .chatbox .sendXMPPMessage .chat-toolbar li .toolbar-menu ul.emoji-toolbar .emoji-category {
float: left; } float: left; }
#conversejs.converse-overlayed .chatbox .sendXMPPMessage .chat-toolbar li.toggle-smiley .emoji-toolbar .emoji-category-picker ul {
flex-wrap: wrap;
justify-content: flex-start; }
@media (max-width: 767.98px) { @media (max-width: 767.98px) {
#conversejs.converse-overlayed > .row { #conversejs.converse-overlayed > .row {
......
This diff is collapsed.
...@@ -527,7 +527,7 @@ ...@@ -527,7 +527,7 @@
height: $overlayed-emoji-picker-height; height: $overlayed-emoji-picker-height;
} }
.chatbox { .chatbox {
form.sendXMPPMessage { .sendXMPPMessage {
.chat-toolbar { .chat-toolbar {
li { li {
.toolbar-menu { .toolbar-menu {
...@@ -541,6 +541,16 @@ ...@@ -541,6 +541,16 @@
} }
} }
} }
&.toggle-smiley {
.emoji-toolbar {
.emoji-category-picker {
ul {
flex-wrap: wrap;
justify-content: flex-start;
}
}
}
}
} }
} }
} }
......
This diff is collapsed.
...@@ -150,7 +150,8 @@ ...@@ -150,7 +150,8 @@
})); }));
it("can be trimmed to conserve space", it("can be trimmed to conserve space",
mock.initConverseWithPromises(null, ['rosterGroupsFetched'], {}, function (done, _converse) { mock.initConverseWithPromises(null, ['rosterGroupsFetched'], {},
async function (done, _converse) {
spyOn(_converse.chatboxviews, 'trimChats'); spyOn(_converse.chatboxviews, 'trimChats');
...@@ -163,25 +164,23 @@ ...@@ -163,25 +164,23 @@
test_utils.openControlBox(); test_utils.openControlBox();
let online_contacts; let jid, chatboxview;
var i, jid, chatbox, chatboxview, trimmedview;
// openControlBox was called earlier, so the controlbox is // openControlBox was called earlier, so the controlbox is
// visible, but no other chat boxes have been created. // visible, but no other chat boxes have been created.
expect(_converse.chatboxes.length).toEqual(1); expect(_converse.chatboxes.length).toEqual(1);
expect(document.querySelectorAll("#conversejs .chatbox").length).toBe(1); // Controlbox is open expect(document.querySelectorAll("#conversejs .chatbox").length).toBe(1); // Controlbox is open
_converse.rosterview.update(); // XXX: Hack to make sure $roster element is attached. _converse.rosterview.update(); // XXX: Hack to make sure $roster element is attached.
test_utils.waitUntil(() => _converse.rosterview.el.querySelectorAll('.roster-group li').length) await test_utils.waitUntil(() => _converse.rosterview.el.querySelectorAll('.roster-group li').length);
.then(() => {
// Test that they can be maximized again // Test that they can be maximized again
online_contacts = _converse.rosterview.el.querySelectorAll('.roster-group .current-xmpp-contact a.open-chat'); const online_contacts = _converse.rosterview.el.querySelectorAll('.roster-group .current-xmpp-contact a.open-chat');
expect(online_contacts.length).toBe(15); expect(online_contacts.length).toBe(15);
let i;
for (i=0; i<online_contacts.length; i++) { for (i=0; i<online_contacts.length; i++) {
const el = online_contacts[i]; const el = online_contacts[i];
el.click(); el.click();
} }
return test_utils.waitUntil(() => _converse.chatboxes.length == 16) await test_utils.waitUntil(() => _converse.chatboxes.length == 16);
}).then(() => {
expect(_converse.chatboxviews.trimChats.calls.count()).toBe(16); expect(_converse.chatboxviews.trimChats.calls.count()).toBe(16);
for (i=0; i<online_contacts.length; i++) { for (i=0; i<online_contacts.length; i++) {
...@@ -193,11 +192,10 @@ ...@@ -193,11 +192,10 @@
expect(trimmed_chatboxes.addChat).toHaveBeenCalled(); expect(trimmed_chatboxes.addChat).toHaveBeenCalled();
expect(chatboxview.minimize).toHaveBeenCalled(); expect(chatboxview.minimize).toHaveBeenCalled();
} }
return test_utils.waitUntil(() => _converse.chatboxviews.keys().length); await test_utils.waitUntil(() => _converse.chatboxviews.keys().length);
}).then(function () {
var key = _converse.chatboxviews.keys()[1]; var key = _converse.chatboxviews.keys()[1];
trimmedview = trimmed_chatboxes.get(key); const trimmedview = trimmed_chatboxes.get(key);
chatbox = trimmedview.model; const chatbox = trimmedview.model;
spyOn(chatbox, 'maximize').and.callThrough(); spyOn(chatbox, 'maximize').and.callThrough();
spyOn(trimmedview, 'restore').and.callThrough(); spyOn(trimmedview, 'restore').and.callThrough();
trimmedview.delegateEvents(); trimmedview.delegateEvents();
...@@ -207,7 +205,6 @@ ...@@ -207,7 +205,6 @@
expect(chatbox.maximize).toHaveBeenCalled(); expect(chatbox.maximize).toHaveBeenCalled();
expect(_converse.chatboxviews.trimChats.calls.count()).toBe(17); expect(_converse.chatboxviews.trimChats.calls.count()).toBe(17);
done(); done();
});
})); }));
it("can be opened in minimized mode initially", it("can be opened in minimized mode initially",
...@@ -453,18 +450,16 @@ ...@@ -453,18 +450,16 @@
it("contains a button for inserting emojis", it("contains a button for inserting emojis",
mock.initConverseWithPromises( mock.initConverseWithPromises(
null, ['rosterGroupsFetched', 'chatBoxesFetched'], {}, null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
function (done, _converse) { async function (done, _converse) {
test_utils.createContacts(_converse, 'current'); test_utils.createContacts(_converse, 'current');
_converse.emit('rosterContactsFetched'); _converse.emit('rosterContactsFetched');
test_utils.openControlBox(); test_utils.openControlBox();
let timeout = false, view, toolbar;
const contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost'; const contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost';
test_utils.openChatBoxFor(_converse, contact_jid) await test_utils.openChatBoxFor(_converse, contact_jid);
.then(() => { const view = _converse.chatboxviews.get(contact_jid);
view = _converse.chatboxviews.get(contact_jid); const toolbar = view.el.querySelector('ul.chat-toolbar');
toolbar = view.el.querySelector('ul.chat-toolbar');
expect(toolbar.querySelectorAll('li.toggle-smiley').length).toBe(1); expect(toolbar.querySelectorAll('li.toggle-smiley').length).toBe(1);
// Register spies // Register spies
spyOn(view, 'toggleEmojiMenu').and.callThrough(); spyOn(view, 'toggleEmojiMenu').and.callThrough();
...@@ -473,52 +468,33 @@ ...@@ -473,52 +468,33 @@
view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
toolbar.querySelector('li.toggle-smiley').click(); toolbar.querySelector('li.toggle-smiley').click();
return test_utils.waitUntil(() => u.isVisible(view.el.querySelector('.toggle-smiley .emoji-picker-container'), 500)); await test_utils.waitUntil(() => u.isVisible(view.el.querySelector('.toggle-smiley .emoji-picker-container')));
}).then(() => {
var picker = view.el.querySelector('.toggle-smiley .emoji-picker-container'); var picker = view.el.querySelector('.toggle-smiley .emoji-picker-container');
var items = picker.querySelectorAll('.emoji-picker li'); var items = picker.querySelectorAll('.emoji-picker li');
items[0].click() items[0].click()
expect(view.insertEmoji).toHaveBeenCalled(); expect(view.insertEmoji).toHaveBeenCalled();
setTimeout(function () { timeout = true; }, 100);
return test_utils.waitUntil(() => timeout, 500);
}).then(() => {
timeout = false;
toolbar.querySelector('li.toggle-smiley').click(); // Close the panel again
return test_utils.waitUntil(() => !view.el.querySelector('.toggle-smiley .toolbar-menu').offsetHeight, 500);
}).then(() => {
setTimeout(function () { timeout = true; }, 100);
return test_utils.waitUntil(() => timeout, 500);
}).then(() => {
toolbar.querySelector('li.toggle-smiley').click();
expect(view.toggleEmojiMenu).toHaveBeenCalled();
return test_utils.waitUntil(() => u.isVisible(view.el.querySelector('.toggle-smiley .emoji-picker-container')), 500);
}).then(() => {
var nodes = view.el.querySelectorAll('.toggle-smiley ul li');
nodes[nodes.length-1].click();
expect(view.el.querySelector('textarea.chat-textarea').value).toBe(':grinning: '); expect(view.el.querySelector('textarea.chat-textarea').value).toBe(':grinning: ');
expect(view.insertEmoji).toHaveBeenCalled(); toolbar.querySelector('li.toggle-smiley').click(); // Close the panel again
done(); done();
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
})); }));
it("can contain a button for starting a call", it("can contain a button for starting a call",
mock.initConverseWithPromises( mock.initConverseWithPromises(
null, ['rosterGroupsFetched', 'chatBoxesFetched'], {}, null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
function (done, _converse) { async function (done, _converse) {
test_utils.createContacts(_converse, 'current'); test_utils.createContacts(_converse, 'current');
_converse.emit('rosterContactsFetched'); _converse.emit('rosterContactsFetched');
test_utils.openControlBox(); test_utils.openControlBox();
let view, toolbar, call_button; let toolbar, call_button;
const contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost'; const contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost';
spyOn(_converse, 'emit'); spyOn(_converse, 'emit');
// First check that the button doesn't show if it's not enabled // First check that the button doesn't show if it's not enabled
// via "visible_toolbar_buttons" // via "visible_toolbar_buttons"
_converse.visible_toolbar_buttons.call = false; _converse.visible_toolbar_buttons.call = false;
test_utils.openChatBoxFor(_converse, contact_jid) await test_utils.openChatBoxFor(_converse, contact_jid);
.then(() => { let view = _converse.chatboxviews.get(contact_jid);
view = _converse.chatboxviews.get(contact_jid);
toolbar = view.el.querySelector('ul.chat-toolbar'); toolbar = view.el.querySelector('ul.chat-toolbar');
call_button = toolbar.querySelector('.toggle-call'); call_button = toolbar.querySelector('.toggle-call');
expect(_.isNull(call_button)).toBeTruthy(); expect(_.isNull(call_button)).toBeTruthy();
...@@ -526,15 +502,13 @@ ...@@ -526,15 +502,13 @@
// Now check that it's shown if enabled and that it emits // Now check that it's shown if enabled and that it emits
// callButtonClicked // callButtonClicked
_converse.visible_toolbar_buttons.call = true; // enable the button _converse.visible_toolbar_buttons.call = true; // enable the button
return test_utils.openChatBoxFor(_converse, contact_jid); await test_utils.openChatBoxFor(_converse, contact_jid);
}).then(() => {
view = _converse.chatboxviews.get(contact_jid); view = _converse.chatboxviews.get(contact_jid);
toolbar = view.el.querySelector('ul.chat-toolbar'); toolbar = view.el.querySelector('ul.chat-toolbar');
call_button = toolbar.querySelector('.toggle-call'); call_button = toolbar.querySelector('.toggle-call');
call_button.click(); call_button.click();
expect(_converse.emit).toHaveBeenCalledWith('callButtonClicked', jasmine.any(Object)); expect(_converse.emit).toHaveBeenCalledWith('callButtonClicked', jasmine.any(Object));
done(); done();
});
})); }));
}); });
...@@ -549,9 +523,9 @@ ...@@ -549,9 +523,9 @@
test_utils.openControlBox(); test_utils.openControlBox();
spyOn(_converse, 'emit'); spyOn(_converse, 'emit');
var sender_jid = mock.cur_names[1].replace(/ /g,'.').toLowerCase() + '@localhost'; const sender_jid = mock.cur_names[1].replace(/ /g,'.').toLowerCase() + '@localhost';
// <composing> state // <composing> state
var msg = $msg({ const msg = $msg({
'from': sender_jid, 'from': sender_jid,
'to': _converse.connection.jid, 'to': _converse.connection.jid,
'type': 'chat', 'type': 'chat',
......
...@@ -2331,10 +2331,9 @@ ...@@ -2331,10 +2331,9 @@
it("can be minimized by clicking a DOM element with class 'toggle-chatbox-button'", it("can be minimized by clicking a DOM element with class 'toggle-chatbox-button'",
mock.initConverseWithPromises( mock.initConverseWithPromises(
null, ['rosterGroupsFetched', 'chatBoxesFetched'], {}, null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
function (done, _converse) { async function (done, _converse) {
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy') await test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
.then(() => {
const view = _converse.chatboxviews.get('lounge@localhost'), const view = _converse.chatboxviews.get('lounge@localhost'),
trimmed_chatboxes = _converse.minimized_chats; trimmed_chatboxes = _converse.minimized_chats;
...@@ -2349,7 +2348,8 @@ ...@@ -2349,7 +2348,8 @@
expect(u.isVisible(view.el)).toBeFalsy(); expect(u.isVisible(view.el)).toBeFalsy();
expect(view.model.get('minimized')).toBeTruthy(); expect(view.model.get('minimized')).toBeTruthy();
expect(view.minimize).toHaveBeenCalled(); expect(view.minimize).toHaveBeenCalled();
var trimmedview = trimmed_chatboxes.get(view.model.get('id')); await test_utils.waitUntil(() => trimmed_chatboxes.get(view.model.get('id')));
const trimmedview = trimmed_chatboxes.get(view.model.get('id'));
trimmedview.el.querySelector("a.restore-chat").click(); trimmedview.el.querySelector("a.restore-chat").click();
expect(view.maximize).toHaveBeenCalled(); expect(view.maximize).toHaveBeenCalled();
expect(_converse.emit).toHaveBeenCalledWith('chatBoxMaximized', jasmine.any(Object)); expect(_converse.emit).toHaveBeenCalledWith('chatBoxMaximized', jasmine.any(Object));
...@@ -2357,7 +2357,6 @@ ...@@ -2357,7 +2357,6 @@
expect(_converse.emit.calls.count(), 3); expect(_converse.emit.calls.count(), 3);
done(); done();
});
})); }));
it("can be closed again by clicking a DOM element with class 'close-chatbox-button'", it("can be closed again by clicking a DOM element with class 'close-chatbox-button'",
......
This diff is collapsed.
...@@ -159,22 +159,26 @@ ...@@ -159,22 +159,26 @@
it("is played when the current user is mentioned in a chat room", it("is played when the current user is mentioned in a chat room",
mock.initConverseWithPromises( mock.initConverseWithPromises(
null, ['rosterGroupsFetched'], {}, null, ['rosterGroupsFetched'], {},
function (done, _converse) { async function (done, _converse) {
test_utils.createContacts(_converse, 'current'); test_utils.createContacts(_converse, 'current');
test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy').then(function () { await test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy');
_converse.play_sounds = true; _converse.play_sounds = true;
spyOn(_converse, 'playSoundNotification'); spyOn(_converse, 'playSoundNotification');
var view = _converse.chatboxviews.get('lounge@localhost'); const view = _converse.chatboxviews.get('lounge@localhost');
if (!$(view.el).find('.chat-area').length) { view.renderChatArea(); } if (!view.el.querySelectorAll('.chat-area').length) {
var text = 'This message will play a sound because it mentions dummy'; view.renderChatArea();
var message = $msg({ }
let text = 'This message will play a sound because it mentions dummy';
let message = $msg({
from: 'lounge@localhost/otheruser', from: 'lounge@localhost/otheruser',
id: '1', id: '1',
to: 'dummy@localhost', to: 'dummy@localhost',
type: 'groupchat' type: 'groupchat'
}).c('body').t(text); }).c('body').t(text);
view.model.onMessage(message.nodeTree); view.model.onMessage(message.nodeTree);
await test_utils.waitUntil(() => _converse.playSoundNotification.calls.count());
expect(_converse.playSoundNotification).toHaveBeenCalled(); expect(_converse.playSoundNotification).toHaveBeenCalled();
text = "This message won't play a sound"; text = "This message won't play a sound";
...@@ -199,7 +203,6 @@ ...@@ -199,7 +203,6 @@
expect(_converse.playSoundNotification, 1); expect(_converse.playSoundNotification, 1);
_converse.play_sounds = false; _converse.play_sounds = false;
done(); done();
});
})); }));
}); });
}); });
......
...@@ -10,28 +10,21 @@ ...@@ -10,28 +10,21 @@
const u = converse.env.utils; const u = converse.env.utils;
const checkHeaderToggling = function (group) { const checkHeaderToggling = async function (group) {
var $group = $(group);
var toggle = group.querySelector('a.group-toggle'); var toggle = group.querySelector('a.group-toggle');
expect(u.isVisible($group[0])).toBeTruthy(); expect(u.isVisible(group)).toBeTruthy();
expect($group.find('ul.collapsed').length).toBe(0); expect(group.querySelectorAll('ul.collapsed').length).toBe(0);
expect(u.hasClass('fa-caret-right', toggle.firstElementChild)).toBeFalsy(); expect(u.hasClass('fa-caret-right', toggle.firstElementChild)).toBeFalsy();
expect(u.hasClass('fa-caret-down', toggle.firstElementChild)).toBeTruthy(); expect(u.hasClass('fa-caret-down', toggle.firstElementChild)).toBeTruthy();
toggle.click(); toggle.click();
return test_utils.waitUntil(function () { await test_utils.waitUntil(() => group.querySelectorAll('ul.collapsed').length === 1);
return $group.find('ul.collapsed').length === 1;
}, 500).then(function () {
expect(u.hasClass('fa-caret-right', toggle.firstElementChild)).toBeTruthy(); expect(u.hasClass('fa-caret-right', toggle.firstElementChild)).toBeTruthy();
expect(u.hasClass('fa-caret-down', toggle.firstElementChild)).toBeFalsy(); expect(u.hasClass('fa-caret-down', toggle.firstElementChild)).toBeFalsy();
toggle.click(); toggle.click();
return test_utils.waitUntil(function () { await test_utils.waitUntil(() => group.querySelectorAll('li').length === $(group).find('li:visible').length);
return $group.find('li').length === $group.find('li:visible').length
}, 500);
}).then(function () {
expect(u.hasClass('fa-caret-right', toggle.firstElementChild)).toBeFalsy(); expect(u.hasClass('fa-caret-right', toggle.firstElementChild)).toBeFalsy();
expect(u.hasClass('fa-caret-down', toggle.firstElementChild)).toBeTruthy(); expect(u.hasClass('fa-caret-down', toggle.firstElementChild)).toBeTruthy();
});
}; };
...@@ -501,7 +494,7 @@ ...@@ -501,7 +494,7 @@
it("remembers whether it is closed or opened", it("remembers whether it is closed or opened",
mock.initConverseWithPromises( mock.initConverseWithPromises(
null, ['rosterGroupsFetched'], {}, null, ['rosterGroupsFetched'], {},
function (done, _converse) { async function (done, _converse) {
_converse.roster_groups = true; _converse.roster_groups = true;
test_utils.openControlBox(); test_utils.openControlBox();
...@@ -524,20 +517,14 @@ ...@@ -524,20 +517,14 @@
}); });
} }
}); });
var view = _converse.rosterview.get('colleagues'); const view = _converse.rosterview.get('colleagues');
var $toggle = $(view.el).find('a.group-toggle'); const toggle = view.el.querySelector('a.group-toggle');
expect(view.model.get('state')).toBe('opened'); expect(view.model.get('state')).toBe('opened');
$toggle[0].click(); toggle.click();
return test_utils.waitUntil(function () { await test_utils.waitUntil(() => view.model.get('state') === 'closed');
return view.model.get('state') === 'closed'; toggle.click();
}, 500).then(function () { await test_utils.waitUntil(() => view.model.get('state') === 'opened');
$toggle[0].click();
return test_utils.waitUntil(function () {
return view.model.get('state') === 'opened';
}, 500)
}).then(function () {
done(); done();
});
})); }));
}); });
......
...@@ -105,6 +105,7 @@ ...@@ -105,6 +105,7 @@
spyOn(view, 'onMessageSubmitted').and.callThrough(); spyOn(view, 'onMessageSubmitted').and.callThrough();
spyOn(_converse.connection, 'send'); spyOn(_converse.connection, 'send');
await test_utils.waitUntil(() => view.el.querySelector('.toggle-compose-spoiler'));
let spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler'); let spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
spoiler_toggle.click(); spoiler_toggle.click();
...@@ -178,6 +179,8 @@ ...@@ -178,6 +179,8 @@
await test_utils.openChatBoxFor(_converse, contact_jid); await test_utils.openChatBoxFor(_converse, contact_jid);
await test_utils.waitUntilDiscoConfirmed(_converse, contact_jid+'/phone', [], [Strophe.NS.SPOILER]); await test_utils.waitUntilDiscoConfirmed(_converse, contact_jid+'/phone', [], [Strophe.NS.SPOILER]);
const view = _converse.chatboxviews.get(contact_jid); const view = _converse.chatboxviews.get(contact_jid);
await test_utils.waitUntil(() => view.el.querySelector('.toggle-compose-spoiler'));
let spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler'); let spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
spoiler_toggle.click(); spoiler_toggle.click();
......
...@@ -69,15 +69,14 @@ converse.plugins.add('converse-bookmarks', { ...@@ -69,15 +69,14 @@ converse.plugins.add('converse-bookmarks', {
close_button.insertAdjacentHTML('afterend', bookmark_button); close_button.insertAdjacentHTML('afterend', bookmark_button);
}, },
renderHeading () { async renderHeading () {
this.__super__.renderHeading.apply(this, arguments); this.__super__.renderHeading.apply(this, arguments);
const { _converse } = this.__super__; const { _converse } = this.__super__;
if (_converse.allow_bookmarks) { if (_converse.allow_bookmarks) {
_converse.checkBookmarksSupport().then((supported) => { const supported = await _converse.checkBookmarksSupport();
if (supported) { if (supported) {
this.renderBookmarkToggle(); this.renderBookmarkToggle();
} }
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
}, },
...@@ -518,32 +517,25 @@ converse.plugins.add('converse-bookmarks', { ...@@ -518,32 +517,25 @@ converse.plugins.add('converse-bookmarks', {
} }
}); });
_converse.checkBookmarksSupport = function () { _converse.checkBookmarksSupport = async function () {
return new Promise((resolve, reject) => { const args = await Promise.all([
Promise.all([
_converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid), _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid),
_converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid) _converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid)
]).then((args) => { ]);
resolve(args[0] && (args[1].length || _converse.allow_public_bookmarks)); return args[0] && (args[1].length || _converse.allow_public_bookmarks);
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
const initBookmarks = function () { const initBookmarks = async function () {
if (!_converse.allow_bookmarks) { if (!_converse.allow_bookmarks) {
return; return;
} }
_converse.checkBookmarksSupport().then((supported) => { const supported = await _converse.checkBookmarksSupport();
if (supported) { if (supported) {
_converse.bookmarks = new _converse.Bookmarks(); _converse.bookmarks = new _converse.Bookmarks();
_converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks}); _converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks});
_converse.bookmarks.fetchBookmarks() await _converse.bookmarks.fetchBookmarks();
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL))
.then(() => _converse.emit('bookmarksInitialized'));
} else {
_converse.emit('bookmarksInitialized');
} }
}); _converse.emit('bookmarksInitialized');
} }
u.onMultipleEvents([ u.onMultipleEvents([
......
...@@ -10,6 +10,7 @@ import "converse-modal"; ...@@ -10,6 +10,7 @@ import "converse-modal";
import * as twemoji from "twemoji"; import * as twemoji from "twemoji";
import bootstrap from "bootstrap"; import bootstrap from "bootstrap";
import converse from "@converse/headless/converse-core"; import converse from "@converse/headless/converse-core";
import tpl_alert from "templates/alert.html";
import tpl_chatbox from "templates/chatbox.html"; import tpl_chatbox from "templates/chatbox.html";
import tpl_chatbox_head from "templates/chatbox_head.html"; import tpl_chatbox_head from "templates/chatbox_head.html";
import tpl_chatbox_message_form from "templates/chatbox_message_form.html"; import tpl_chatbox_message_form from "templates/chatbox_message_form.html";
...@@ -229,13 +230,23 @@ converse.plugins.add('converse-chatview', { ...@@ -229,13 +230,23 @@ converse.plugins.add('converse-chatview', {
} }
}, },
refreshContact (ev) { async refreshContact (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
const refresh_icon = this.el.querySelector('.fa-refresh'); const refresh_icon = this.el.querySelector('.fa-refresh');
u.addClass('fa-spin', refresh_icon); u.addClass('fa-spin', refresh_icon);
_converse.api.vcard.update(this.model.contact.vcard, true) try {
.then(() => u.removeClass('fa-spin', refresh_icon)) await _converse.api.vcard.update(this.model.contact.vcard, true);
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); } catch (e) {
_converse.log(e, Strophe.LogLevel.FATAL);
this.el.querySelector('.modal-body').insertAdjacentHTML(
'afterBegin',
tpl_alert({
'type': 'alert-danger',
'message': __('Sorry, something went wrong while trying to refresh')
})
);
}
u.removeClass('fa-spin', refresh_icon);
}, },
removeContact (ev) { removeContact (ev) {
...@@ -387,17 +398,16 @@ converse.plugins.add('converse-chatview', { ...@@ -387,17 +398,16 @@ converse.plugins.add('converse-chatview', {
this.model.sendFiles(evt.target.files); this.model.sendFiles(evt.target.files);
}, },
addFileUploadButton (options) { async addFileUploadButton (options) {
_converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain).then((result) => { const result = await _converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain);
if (result.length) { if (result.length) {
this.el.querySelector('.chat-toolbar').insertAdjacentHTML( this.el.querySelector('.chat-toolbar').insertAdjacentHTML(
'beforeend', 'beforeend',
tpl_toolbar_fileupload({'tooltip_upload_file': __('Choose a file to send')})); tpl_toolbar_fileupload({'tooltip_upload_file': __('Choose a file to send')}));
} }
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
addSpoilerButton (options) { async addSpoilerButton (options) {
/* Asynchronously adds a button for writing spoiler /* Asynchronously adds a button for writing spoiler
* messages, based on whether the contact's client supports * messages, based on whether the contact's client supports
* it. * it.
...@@ -410,9 +420,9 @@ converse.plugins.add('converse-chatview', { ...@@ -410,9 +420,9 @@ converse.plugins.add('converse-chatview', {
if (_.isEmpty(resources)) { if (_.isEmpty(resources)) {
return; return;
} }
Promise.all(_.map(_.keys(resources), (resource) => const results = await Promise.all(_.map(_.keys(resources),
_converse.api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${resource}`) resource => _converse.api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${resource}`)
)).then((results) => { ));
if (_.filter(results, 'length').length) { if (_.filter(results, 'length').length) {
const html = tpl_spoiler_button(this.model.toJSON()); const html = tpl_spoiler_button(this.model.toJSON());
if (_converse.visible_toolbar_buttons.emoji) { if (_converse.visible_toolbar_buttons.emoji) {
...@@ -421,7 +431,6 @@ converse.plugins.add('converse-chatview', { ...@@ -421,7 +431,6 @@ converse.plugins.add('converse-chatview', {
this.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html); this.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
} }
} }
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
insertHeading () { insertHeading () {
......
...@@ -229,7 +229,7 @@ converse.plugins.add('converse-minimize', { ...@@ -229,7 +229,7 @@ converse.plugins.add('converse-minimize', {
); );
}, },
trimChats (newchat) { async trimChats (newchat) {
/* This method is called when a newly created chat box will /* This method is called when a newly created chat box will
* be shown. * be shown.
* *
...@@ -250,7 +250,7 @@ converse.plugins.add('converse-minimize', { ...@@ -250,7 +250,7 @@ converse.plugins.add('converse-minimize', {
// fullscreen. In this case we don't trim. // fullscreen. In this case we don't trim.
return; return;
} }
_converse.api.waitUntil('minimizedChatsInitialized').then(() => { await _converse.api.waitUntil('minimizedChatsInitialized');
const minimized_el = _.get(_converse.minimized_chats, 'el'), const minimized_el = _.get(_converse.minimized_chats, 'el'),
new_id = newchat ? newchat.model.get('id') : null; new_id = newchat ? newchat.model.get('id') : null;
...@@ -278,7 +278,6 @@ converse.plugins.add('converse-minimize', { ...@@ -278,7 +278,6 @@ converse.plugins.add('converse-minimize', {
} }
} }
} }
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
getOldestMaximizedChat (exclude_ids) { getOldestMaximizedChat (exclude_ids) {
......
...@@ -258,7 +258,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -258,7 +258,7 @@ converse.plugins.add('converse-muc-views', {
} else { } else {
parent_el.insertAdjacentHTML('beforeend', tpl_spinner()); parent_el.insertAdjacentHTML('beforeend', tpl_spinner());
_converse.api.disco.info(ev.target.getAttribute('data-room-jid'), null) _converse.api.disco.info(ev.target.getAttribute('data-room-jid'), null)
.then((stanza) => insertRoomInfo(parent_el, stanza)) .then(stanza => insertRoomInfo(parent_el, stanza))
.catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR)); .catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
} }
} }
...@@ -1159,7 +1159,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -1159,7 +1159,7 @@ converse.plugins.add('converse-muc-views', {
*/ */
this.showSpinner(); this.showSpinner();
this.model.fetchRoomConfiguration() this.model.fetchRoomConfiguration()
.then(this.renderConfigurationForm.bind(this)) .then(iq => this.renderConfigurationForm(iq))
.catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR)); .catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
}, },
......
...@@ -106,17 +106,16 @@ converse.plugins.add("converse-oauth", { ...@@ -106,17 +106,16 @@ converse.plugins.add("converse-oauth", {
})); }));
}, },
fetchOAuthProfileDataAndLogin () { async fetchOAuthProfileDataAndLogin () {
this.oauth_service.api('me').then((profile) => { const profile = await this.oauth_service.api('me');
const response = this.oauth_service.getAuthResponse(); const response = this.oauth_service.getAuthResponse();
_converse.api.user.login({ _converse.api.user.login({
'jid': `${profile.name}@${this.provider.get('host')}`, 'jid': `${profile.name}@${this.provider.get('host')}`,
'password': response.access_token 'password': response.access_token
}); });
});
}, },
oauthLogin (ev) { async oauthLogin (ev) {
ev.preventDefault(); ev.preventDefault();
const id = ev.target.getAttribute('data-id'); const id = ev.target.getAttribute('data-id');
this.provider = _converse.oauth_providers.get(id); this.provider = _converse.oauth_providers.get(id);
...@@ -128,10 +127,8 @@ converse.plugins.add("converse-oauth", { ...@@ -128,10 +127,8 @@ converse.plugins.add("converse-oauth", {
'redirect_uri': '/redirect.html' 'redirect_uri': '/redirect.html'
}); });
this.oauth_service.login().then( await this.oauth_service.login();
() => this.fetchOAuthProfileDataAndLogin(), this.fetchOAuthProfileDataAndLogin();
(error) => _converse.log(error.error_message, Strophe.LogLevel.ERROR)
);
} }
}); });
} }
......
...@@ -11,7 +11,6 @@ import "converse-modal"; ...@@ -11,7 +11,6 @@ import "converse-modal";
import _FormData from "formdata-polyfill"; import _FormData from "formdata-polyfill";
import bootstrap from "bootstrap"; import bootstrap from "bootstrap";
import converse from "@converse/headless/converse-core"; import converse from "@converse/headless/converse-core";
import tpl_alert from "templates/alert.html";
import tpl_chat_status_modal from "templates/chat_status_modal.html"; import tpl_chat_status_modal from "templates/chat_status_modal.html";
import tpl_profile_modal from "templates/profile_modal.html"; import tpl_profile_modal from "templates/profile_modal.html";
import tpl_profile_view from "templates/profile_view.html"; import tpl_profile_view from "templates/profile_view.html";
......
...@@ -680,15 +680,14 @@ converse.plugins.add('converse-rosterview', { ...@@ -680,15 +680,14 @@ converse.plugins.add('converse-rosterview', {
this.filterOutContacts(this.getFilterMatches(q, type)); this.filterOutContacts(this.getFilterMatches(q, type));
}, },
toggle (ev) { async toggle (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
const icon_el = ev.target.querySelector('.fa'); const icon_el = ev.target.querySelector('.fa');
if (_.includes(icon_el.classList, "fa-caret-down")) { if (_.includes(icon_el.classList, "fa-caret-down")) {
this.model.save({state: _converse.CLOSED}); this.model.save({state: _converse.CLOSED});
this.collapse().then(() => { await this.collapse();
icon_el.classList.remove("fa-caret-down"); icon_el.classList.remove("fa-caret-down");
icon_el.classList.add("fa-caret-right"); icon_el.classList.add("fa-caret-right");
});
} else { } else {
icon_el.classList.remove("fa-caret-right"); icon_el.classList.remove("fa-caret-right");
icon_el.classList.add("fa-caret-down"); icon_el.classList.add("fa-caret-down");
......
...@@ -144,8 +144,17 @@ converse.plugins.add('converse-chatboxes', { ...@@ -144,8 +144,17 @@ converse.plugins.add('converse-chatboxes', {
return _converse.api.sendIQ(iq); return _converse.api.sendIQ(iq);
}, },
getRequestSlotURL () { async getRequestSlotURL () {
this.sendSlotRequestStanza().then((stanza) => { let stanza;
try {
stanza = await this.sendSlotRequestStanza();
} catch (e) {
_converse.log(e, Strophe.LogLevel.ERROR);
return this.save({
'type': 'error',
'message': __("Sorry, could not determine upload URL.")
});
}
const slot = stanza.querySelector('slot'); const slot = stanza.querySelector('slot');
if (slot) { if (slot) {
this.save({ this.save({
...@@ -158,13 +167,6 @@ converse.plugins.add('converse-chatboxes', { ...@@ -158,13 +167,6 @@ converse.plugins.add('converse-chatboxes', {
'message': __("Sorry, could not determine file upload URL.") 'message': __("Sorry, could not determine file upload URL.")
}); });
} }
}).catch((e) => {
_converse.log(e, Strophe.LogLevel.ERROR);
return this.save({
'type': 'error',
'message': __("Sorry, could not determine upload URL.")
});
});
}, },
uploadFile () { uploadFile () {
......
...@@ -162,13 +162,14 @@ converse.plugins.add('converse-disco', { ...@@ -162,13 +162,14 @@ converse.plugins.add('converse-disco', {
}); });
}, },
queryForItems () { async queryForItems () {
if (_.isEmpty(this.identities.where({'category': 'server'}))) { if (_.isEmpty(this.identities.where({'category': 'server'}))) {
// Don't fetch features and items if this is not a // Don't fetch features and items if this is not a
// server or a conference component. // server or a conference component.
return; return;
} }
_converse.api.disco.items(this.get('jid')).then(stanza => this.onDiscoItems(stanza)); const stanza = await _converse.api.disco.items(this.get('jid'));
this.onDiscoItems(stanza);
}, },
onInfo (stanza) { onInfo (stanza) {
...@@ -268,7 +269,7 @@ converse.plugins.add('converse-disco', { ...@@ -268,7 +269,7 @@ converse.plugins.add('converse-disco', {
_converse.emit('streamFeaturesAdded'); _converse.emit('streamFeaturesAdded');
} }
function initializeDisco () { async function initializeDisco () {
addClientFeatures(); addClientFeatures();
_converse.connection.addHandler(onDiscoInfoRequest, Strophe.NS.DISCO_INFO, 'iq', 'get', null, null); _converse.connection.addHandler(onDiscoInfoRequest, Strophe.NS.DISCO_INFO, 'iq', 'get', null, null);
...@@ -277,14 +278,13 @@ converse.plugins.add('converse-disco', { ...@@ -277,14 +278,13 @@ converse.plugins.add('converse-disco', {
b64_sha1(`converse.disco-entities-${_converse.bare_jid}`) b64_sha1(`converse.disco-entities-${_converse.bare_jid}`)
); );
_converse.disco_entities.fetchEntities().then((collection) => { const collection = await _converse.disco_entities.fetchEntities();
if (collection.length === 0 || !collection.get(_converse.domain)) { if (collection.length === 0 || !collection.get(_converse.domain)) {
// If we don't have an entity for our own XMPP server, // If we don't have an entity for our own XMPP server,
// create one. // create one.
_converse.disco_entities.create({'jid': _converse.domain}); _converse.disco_entities.create({'jid': _converse.domain});
} }
_converse.emit('discoInitialized'); _converse.emit('discoInitialized');
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
_converse.api.listen.on('sessionInitialized', initStreamFeatures); _converse.api.listen.on('sessionInitialized', initStreamFeatures);
...@@ -513,9 +513,8 @@ converse.plugins.add('converse-disco', { ...@@ -513,9 +513,8 @@ converse.plugins.add('converse-disco', {
* @param {boolean} [create] Whether the entity should be created if it doesn't exist. * @param {boolean} [create] Whether the entity should be created if it doesn't exist.
* @example _converse.api.disco.entities.get(jid); * @example _converse.api.disco.entities.get(jid);
*/ */
'get' (jid, create=false) { async 'get' (jid, create=false) {
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => {
if (_.isNil(jid)) { if (_.isNil(jid)) {
return _converse.disco_entities; return _converse.disco_entities;
} }
...@@ -524,7 +523,6 @@ converse.plugins.add('converse-disco', { ...@@ -524,7 +523,6 @@ converse.plugins.add('converse-disco', {
return entity; return entity;
} }
return _converse.disco_entities.create({'jid': jid}); return _converse.disco_entities.create({'jid': jid});
});
} }
}, },
...@@ -559,20 +557,19 @@ converse.plugins.add('converse-disco', { ...@@ -559,20 +557,19 @@ converse.plugins.add('converse-disco', {
* ); * );
* }); * });
*/ */
'supports' (feature, jid) { async 'supports' (feature, jid) {
if (_.isNil(jid)) { if (_.isNil(jid)) {
throw new TypeError('api.disco.supports: You need to provide an entity JID'); throw new TypeError('api.disco.supports: You need to provide an entity JID');
} }
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => _converse.api.disco.entities.get(jid, true)) let entity = await _converse.api.disco.entities.get(jid, true);
.then(entity => entity.waitUntilFeaturesDiscovered) entity = await entity.waitUntilFeaturesDiscovered;
.then(entity => {
const promises = _.concat( const promises = _.concat(
entity.items.map(item => item.hasFeature(feature)), entity.items.map(item => item.hasFeature(feature)),
entity.hasFeature(feature) entity.hasFeature(feature)
); );
return Promise.all(promises); const result = await Promise.all(promises);
}).then(result => f.filter(f.isObject, result)); return f.filter(f.isObject, result);
}, },
/** /**
...@@ -585,21 +582,18 @@ converse.plugins.add('converse-disco', { ...@@ -585,21 +582,18 @@ converse.plugins.add('converse-disco', {
* @example * @example
* await _converse.api.disco.refreshFeatures('room@conference.example.org'); * await _converse.api.disco.refreshFeatures('room@conference.example.org');
*/ */
'refreshFeatures' (jid) { async 'refreshFeatures' (jid) {
if (_.isNil(jid)) { if (_.isNil(jid)) {
throw new TypeError('api.disco.refreshFeatures: You need to provide an entity JID'); throw new TypeError('api.disco.refreshFeatures: You need to provide an entity JID');
} }
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => _converse.api.disco.entities.get(jid, true)) const entity = await _converse.api.disco.entities.get(jid, true);
.then(entity => {
entity.features.reset(); entity.features.reset();
entity.fields.reset(); entity.fields.reset();
entity.identities.reset(); entity.identities.reset();
entity.waitUntilFeaturesDiscovered = utils.getResolveablePromise() entity.waitUntilFeaturesDiscovered = utils.getResolveablePromise()
entity.queryInfo(); entity.queryInfo();
return entity.waitUntilFeaturesDiscovered; return entity.waitUntilFeaturesDiscovered;
})
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
/** /**
...@@ -611,15 +605,14 @@ converse.plugins.add('converse-disco', { ...@@ -611,15 +605,14 @@ converse.plugins.add('converse-disco', {
* @example * @example
* const features = await _converse.api.disco.getFeatures('room@conference.example.org'); * const features = await _converse.api.disco.getFeatures('room@conference.example.org');
*/ */
'getFeatures' (jid) { async 'getFeatures' (jid) {
if (_.isNil(jid)) { if (_.isNil(jid)) {
throw new TypeError('api.disco.getFeatures: You need to provide an entity JID'); throw new TypeError('api.disco.getFeatures: You need to provide an entity JID');
} }
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => _converse.api.disco.entities.get(jid, true)) let entity = await _converse.api.disco.entities.get(jid, true);
.then(entity => entity.waitUntilFeaturesDiscovered) entity = await entity.waitUntilFeaturesDiscovered;
.then(entity => entity.features) return entity.features;
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
/** /**
...@@ -633,15 +626,14 @@ converse.plugins.add('converse-disco', { ...@@ -633,15 +626,14 @@ converse.plugins.add('converse-disco', {
* @example * @example
* const fields = await _converse.api.disco.getFields('room@conference.example.org'); * const fields = await _converse.api.disco.getFields('room@conference.example.org');
*/ */
'getFields' (jid) { async 'getFields' (jid) {
if (_.isNil(jid)) { if (_.isNil(jid)) {
throw new TypeError('api.disco.getFields: You need to provide an entity JID'); throw new TypeError('api.disco.getFields: You need to provide an entity JID');
} }
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => _converse.api.disco.entities.get(jid, true)) let entity = await _converse.api.disco.entities.get(jid, true);
.then(entity => entity.waitUntilFeaturesDiscovered) entity = await entity.waitUntilFeaturesDiscovered;
.then(entity => entity.fields) return entity.fields;
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
/** /**
...@@ -675,8 +667,9 @@ converse.plugins.add('converse-disco', { ...@@ -675,8 +667,9 @@ converse.plugins.add('converse-disco', {
* } * }
* ).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); * ).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
*/ */
'getIdentity' (category, type, jid) { async 'getIdentity' (category, type, jid) {
return _converse.api.disco.entities.get(jid, true).then(e => e.getIdentity(category, type)); const e = await _converse.api.disco.entities.get(jid, true);
return e.getIdentity(category, type);
} }
} }
}); });
......
...@@ -109,20 +109,18 @@ converse.plugins.add('converse-muc', { ...@@ -109,20 +109,18 @@ converse.plugins.add('converse-muc', {
_converse.api.promises.add(['roomsAutoJoined']); _converse.api.promises.add(['roomsAutoJoined']);
function openRoom (jid) { async function openRoom (jid) {
if (!u.isValidMUCJID(jid)) { if (!u.isValidMUCJID(jid)) {
return _converse.log( return _converse.log(
`Invalid JID "${jid}" provided in URL fragment`, `Invalid JID "${jid}" provided in URL fragment`,
Strophe.LogLevel.WARN Strophe.LogLevel.WARN
); );
} }
const promises = [_converse.api.waitUntil('roomsAutoJoined')] await _converse.api.waitUntil('roomsAutoJoined');
if (_converse.allow_bookmarks) { if (_converse.allow_bookmarks) {
promises.push( _converse.api.waitUntil('bookmarksInitialized')); await _converse.api.waitUntil('bookmarksInitialized');
} }
Promise.all(promises).then(() => {
_converse.api.rooms.open(jid); _converse.api.rooms.open(jid);
});
} }
_converse.router.route('converse/room?jid=:jid', openRoom); _converse.router.route('converse/room?jid=:jid', openRoom);
...@@ -762,7 +760,7 @@ converse.plugins.add('converse-muc', { ...@@ -762,7 +760,7 @@ converse.plugins.add('converse-muc', {
} }
}, },
checkForReservedNick () { async checkForReservedNick () {
/* Use service-discovery to ask the XMPP server whether /* Use service-discovery to ask the XMPP server whether
* this user has a reserved nickname for this groupchat. * this user has a reserved nickname for this groupchat.
* If so, we'll use that, otherwise we render the nickname form. * If so, we'll use that, otherwise we render the nickname form.
...@@ -771,7 +769,7 @@ converse.plugins.add('converse-muc', { ...@@ -771,7 +769,7 @@ converse.plugins.add('converse-muc', {
* (Function) callback: Callback upon succesful IQ response * (Function) callback: Callback upon succesful IQ response
* (Function) errback: Callback upon error IQ response * (Function) errback: Callback upon error IQ response
*/ */
return _converse.api.sendIQ( const iq = await _converse.api.sendIQ(
$iq({ $iq({
'to': this.get('jid'), 'to': this.get('jid'),
'from': _converse.connection.jid, 'from': _converse.connection.jid,
...@@ -780,7 +778,7 @@ converse.plugins.add('converse-muc', { ...@@ -780,7 +778,7 @@ converse.plugins.add('converse-muc', {
'xmlns': Strophe.NS.DISCO_INFO, 'xmlns': Strophe.NS.DISCO_INFO,
'node': 'x-roomuser-item' 'node': 'x-roomuser-item'
}) })
).then(iq => { );
const identity_el = iq.querySelector('query[node="x-roomuser-item"] identity'), const identity_el = iq.querySelector('query[node="x-roomuser-item"] identity'),
nick = identity_el ? identity_el.getAttribute('name') : null; nick = identity_el ? identity_el.getAttribute('name') : null;
this.save({ this.save({
...@@ -788,7 +786,6 @@ converse.plugins.add('converse-muc', { ...@@ -788,7 +786,6 @@ converse.plugins.add('converse-muc', {
'nick': nick 'nick': nick
}, {'silent': true}); }, {'silent': true});
return iq; return iq;
});
}, },
async registerNickname () { async registerNickname () {
...@@ -939,7 +936,7 @@ converse.plugins.add('converse-muc', { ...@@ -939,7 +936,7 @@ converse.plugins.add('converse-muc', {
} }
}, },
onMessage (stanza) { async onMessage (stanza) {
/* Handler for all MUC messages sent to this groupchat. /* Handler for all MUC messages sent to this groupchat.
* *
* Parameters: * Parameters:
...@@ -968,9 +965,8 @@ converse.plugins.add('converse-muc', { ...@@ -968,9 +965,8 @@ converse.plugins.add('converse-muc', {
const subject = _.propertyOf(subject_el)('textContent') || ''; const subject = _.propertyOf(subject_el)('textContent') || '';
u.safeSave(this, {'subject': {'author': sender, 'text': subject}}); u.safeSave(this, {'subject': {'author': sender, 'text': subject}});
} }
this.createMessage(stanza, original_stanza) const msg = await this.createMessage(stanza, original_stanza);
.then(msg => this.incrementUnreadMsgCounter(msg)) this.incrementUnreadMsgCounter(msg);
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
if (sender !== this.get('nick')) { if (sender !== this.get('nick')) {
// We only emit an event if it's not our own message // We only emit an event if it's not our own message
...@@ -1141,9 +1137,8 @@ converse.plugins.add('converse-muc', { ...@@ -1141,9 +1137,8 @@ converse.plugins.add('converse-muc', {
} }
}, },
fetchMembers () { async fetchMembers () {
this.chatroom.getJidsWithAffiliations(['member', 'owner', 'admin']) const new_members = await this.chatroom.getJidsWithAffiliations(['member', 'owner', 'admin']);
.then(new_members => {
const new_jids = new_members.map(m => m.jid).filter(m => !_.isUndefined(m)), const new_jids = new_members.map(m => m.jid).filter(m => !_.isUndefined(m)),
new_nicks = new_members.map(m => !m.jid && m.nick || undefined).filter(m => !_.isUndefined(m)), new_nicks = new_members.map(m => !m.jid && m.nick || undefined).filter(m => !_.isUndefined(m)),
removed_members = this.filter(m => { removed_members = this.filter(m => {
...@@ -1171,7 +1166,6 @@ converse.plugins.add('converse-muc', { ...@@ -1171,7 +1166,6 @@ converse.plugins.add('converse-muc', {
this.create(attrs); this.create(attrs);
} }
}); });
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
}, },
findOccupant (data) { findOccupant (data) {
......
...@@ -333,14 +333,6 @@ u.replaceCurrentWord = function (input, new_value) { ...@@ -333,14 +333,6 @@ u.replaceCurrentWord = function (input, new_value) {
input.selectionEnd = cursor - current_word.length + new_value.length + 1; input.selectionEnd = cursor - current_word.length + new_value.length + 1;
}; };
u.isVisible = function (el) {
if (u.hasClass('hidden', el)) {
return false;
}
// XXX: Taken from jQuery's "visible" implementation
return el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0;
};
u.triggerEvent = function (el, name, type="Event", bubbles=true, cancelable=true) { u.triggerEvent = function (el, name, type="Event", bubbles=true, cancelable=true) {
const evt = document.createEvent(type); const evt = document.createEvent(type);
evt.initEvent(name, bubbles, cancelable); evt.initEvent(name, bubbles, cancelable);
......
<div class="alert {{{o.type}}}" role="alert">{{{o.message}}}</div> <div class="alert {{{o.type}}}" role="alert"><p>{{{o.message}}}</p></div>
...@@ -500,6 +500,15 @@ function afterAnimationEnds (el, callback) { ...@@ -500,6 +500,15 @@ function afterAnimationEnds (el, callback) {
} }
} }
u.isVisible = function (el) {
if (u.hasClass('hidden', el)) {
return false;
}
// XXX: Taken from jQuery's "visible" implementation
return el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0;
};
u.fadeIn = function (el, callback) { u.fadeIn = function (el, callback) {
if (_.isNil(el)) { if (_.isNil(el)) {
logger.warn("Undefined or null element passed into fadeIn"); logger.warn("Undefined or null element passed into fadeIn");
......
...@@ -179,7 +179,6 @@ require.config(config); ...@@ -179,7 +179,6 @@ require.config(config);
var specs = [ var specs = [
"jasmine", "jasmine",
//"spec/transcripts", //"spec/transcripts",
//"spec/otr",
"spec/spoilers", "spec/spoilers",
"spec/profiling", "spec/profiling",
"spec/utils", "spec/utils",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment