Commit 030c26a8 authored by JC Brand's avatar JC Brand

Use `api` shortcut instead of `_converse.api`

parent d057177f
...@@ -65,14 +65,14 @@ converse.plugins.add('converse-bookmark-views', { ...@@ -65,14 +65,14 @@ converse.plugins.add('converse-bookmark-views', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
// Configuration values for this plugin // Configuration values for this plugin
// ==================================== // ====================================
// Refer to docs/source/configuration.rst for explanations of these // Refer to docs/source/configuration.rst for explanations of these
// configuration settings. // configuration settings.
_converse.api.settings.update({ api.settings.update({
hide_open_bookmarks: true, hide_open_bookmarks: true,
muc_respect_autojoin: true
}); });
...@@ -96,7 +96,7 @@ converse.plugins.add('converse-bookmark-views', { ...@@ -96,7 +96,7 @@ converse.plugins.add('converse-bookmark-views', {
*/ */
ev.preventDefault(); ev.preventDefault();
const jid = ev.target.getAttribute('data-room-jid'); const jid = ev.target.getAttribute('data-room-jid');
_converse.api.rooms.open(jid, {'bring_to_foreground': true}); api.rooms.open(jid, {'bring_to_foreground': true});
_converse.chatboxviews.get(jid).renderBookmarkForm(); _converse.chatboxviews.get(jid).renderBookmarkForm();
}, },
}); });
...@@ -203,7 +203,7 @@ converse.plugins.add('converse-bookmark-views', { ...@@ -203,7 +203,7 @@ converse.plugins.add('converse-bookmark-views', {
}, },
toHTML () { toHTML () {
const is_hidden = b => !!(_converse.api.settings.get('hide_open_bookmarks') && _converse.chatboxes.get(b.get('jid'))); const is_hidden = b => !!(api.settings.get('hide_open_bookmarks') && _converse.chatboxes.get(b.get('jid')));
return tpl_bookmarks_list({ return tpl_bookmarks_list({
'_converse': _converse, '_converse': _converse,
'bookmarks': this.model, 'bookmarks': this.model,
...@@ -231,7 +231,7 @@ converse.plugins.add('converse-bookmark-views', { ...@@ -231,7 +231,7 @@ converse.plugins.add('converse-bookmark-views', {
const data = { const data = {
'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid 'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid
} }
_converse.api.rooms.open(jid, data, true); api.rooms.open(jid, data, true);
}, },
removeBookmark: _converse.removeBookmarkViaEvent, removeBookmark: _converse.removeBookmarkViaEvent,
...@@ -255,7 +255,7 @@ converse.plugins.add('converse-bookmark-views', { ...@@ -255,7 +255,7 @@ converse.plugins.add('converse-bookmark-views', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
const initBookmarkViews = async function () { const initBookmarkViews = async function () {
await _converse.api.waitUntil('roomsPanelRendered'); await api.waitUntil('roomsPanelRendered');
_converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks}); _converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks});
/** /**
* Triggered once the _converse.Bookmarks collection and _converse.BookmarksView view * Triggered once the _converse.Bookmarks collection and _converse.BookmarksView view
...@@ -263,11 +263,11 @@ converse.plugins.add('converse-bookmark-views', { ...@@ -263,11 +263,11 @@ converse.plugins.add('converse-bookmark-views', {
* @event _converse#bookmarkViewsInitialized * @event _converse#bookmarkViewsInitialized
* @example _converse.api.listen.on('bookmarkViewsInitialized', () => { ... }); * @example _converse.api.listen.on('bookmarkViewsInitialized', () => { ... });
*/ */
_converse.api.trigger('bookmarkViewsInitialized'); api.trigger('bookmarkViewsInitialized');
} }
_converse.api.listen.on('bookmarksInitialized', initBookmarkViews); api.listen.on('bookmarksInitialized', initBookmarkViews);
_converse.api.listen.on('chatRoomViewInitialized', view => view.setBookmarkState()); api.listen.on('chatRoomViewInitialized', view => view.setBookmarkState());
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
} }
}); });
...@@ -48,14 +48,15 @@ converse.plugins.add('converse-chatboxviews', { ...@@ -48,14 +48,15 @@ converse.plugins.add('converse-chatboxviews', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.promises.add(['chatBoxViewsInitialized']); api.promises.add(['chatBoxViewsInitialized']);
// Configuration values for this plugin // Configuration values for this plugin
// ==================================== // ====================================
// Refer to docs/source/configuration.rst for explanations of these // Refer to docs/source/configuration.rst for explanations of these
// configuration settings. // configuration settings.
_converse.api.settings.update({ api.settings.update({
'animate': true, 'animate': true,
'theme': 'default' 'theme': 'default'
}); });
...@@ -74,7 +75,7 @@ converse.plugins.add('converse-chatboxviews', { ...@@ -74,7 +75,7 @@ converse.plugins.add('converse-chatboxviews', {
if (el === null) { if (el === null) {
el = document.createElement('div'); el = document.createElement('div');
el.setAttribute('id', 'conversejs'); el.setAttribute('id', 'conversejs');
u.addClass(`theme-${_converse.api.settings.get('theme')}`, el); u.addClass(`theme-${api.settings.get('theme')}`, el);
const body = _converse.root.querySelector('body'); const body = _converse.root.querySelector('body');
if (body) { if (body) {
body.appendChild(el); body.appendChild(el);
...@@ -97,9 +98,9 @@ converse.plugins.add('converse-chatboxviews', { ...@@ -97,9 +98,9 @@ converse.plugins.add('converse-chatboxviews', {
bg.innerHTML = tpl_background_logo(); bg.innerHTML = tpl_background_logo();
} }
const body = document.querySelector('body'); const body = document.querySelector('body');
body.classList.add(`converse-${_converse.api.settings.get("view_mode")}`); body.classList.add(`converse-${api.settings.get("view_mode")}`);
this.el.classList.add(`converse-${_converse.api.settings.get("view_mode")}`); this.el.classList.add(`converse-${api.settings.get("view_mode")}`);
if (_converse.api.settings.get("singleton")) { if (api.settings.get("singleton")) {
this.el.classList.add(`converse-singleton`); this.el.classList.add(`converse-singleton`);
} }
this.render(); this.render();
...@@ -133,7 +134,7 @@ converse.plugins.add('converse-chatboxviews', { ...@@ -133,7 +134,7 @@ converse.plugins.add('converse-chatboxviews', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxesInitialized', () => { api.listen.on('chatBoxesInitialized', () => {
_converse.chatboxviews = new _converse.ChatBoxViews({ _converse.chatboxviews = new _converse.ChatBoxViews({
'model': _converse.chatboxes 'model': _converse.chatboxes
}); });
...@@ -142,17 +143,17 @@ converse.plugins.add('converse-chatboxviews', { ...@@ -142,17 +143,17 @@ converse.plugins.add('converse-chatboxviews', {
* @event _converse#chatBoxViewsInitialized * @event _converse#chatBoxViewsInitialized
* @example _converse.api.listen.on('chatBoxViewsInitialized', () => { ... }); * @example _converse.api.listen.on('chatBoxViewsInitialized', () => { ... });
*/ */
_converse.api.trigger('chatBoxViewsInitialized'); api.trigger('chatBoxViewsInitialized');
}); });
_converse.api.listen.on('clearSession', () => _converse.chatboxviews.closeAllChatBoxes()); api.listen.on('clearSession', () => _converse.chatboxviews.closeAllChatBoxes());
function calculateViewportHeightUnit () { function calculateViewportHeightUnit () {
const vh = window.innerHeight * 0.01; const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`); document.documentElement.style.setProperty('--vh', `${vh}px`);
} }
_converse.api.listen.on('chatBoxViewsInitialized', () => calculateViewportHeightUnit()); api.listen.on('chatBoxViewsInitialized', () => calculateViewportHeightUnit());
window.addEventListener('resize', () => calculateViewportHeightUnit()); window.addEventListener('resize', () => calculateViewportHeightUnit());
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
} }
......
...@@ -56,9 +56,10 @@ converse.plugins.add('converse-chatview', { ...@@ -56,9 +56,10 @@ converse.plugins.add('converse-chatview', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
const { __ } = _converse; const { __ } = _converse;
_converse.api.settings.update({ api.settings.update({
'auto_focus': true, 'auto_focus': true,
'message_limit': 0, 'message_limit': 0,
'show_send_button': false, 'show_send_button': false,
...@@ -91,7 +92,7 @@ converse.plugins.add('converse-chatview', { ...@@ -91,7 +92,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBox } * @type { _converse.ChatBox }
* @example _converse.api.listen.on('userDetailsModalInitialized', chatbox => { ... }); * @example _converse.api.listen.on('userDetailsModalInitialized', chatbox => { ... });
*/ */
_converse.api.trigger('userDetailsModalInitialized', this.model); api.trigger('userDetailsModalInitialized', this.model);
}, },
toHTML () { toHTML () {
...@@ -126,7 +127,7 @@ converse.plugins.add('converse-chatview', { ...@@ -126,7 +127,7 @@ converse.plugins.add('converse-chatview', {
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);
try { try {
await _converse.api.vcard.update(this.model.contact.vcard, true); await api.vcard.update(this.model.contact.vcard, true);
} catch (e) { } catch (e) {
log.fatal(e); log.fatal(e);
this.alert(__('Sorry, something went wrong while trying to refresh'), 'danger'); this.alert(__('Sorry, something went wrong while trying to refresh'), 'danger');
...@@ -149,7 +150,7 @@ converse.plugins.add('converse-chatview', { ...@@ -149,7 +150,7 @@ converse.plugins.add('converse-chatview', {
() => this.model.contact.destroy(), () => this.model.contact.destroy(),
(err) => { (err) => {
log.error(err); log.error(err);
_converse.api.alert('error', __('Error'), [ api.alert('error', __('Error'), [
__('Sorry, there was an error while trying to remove %1$s as a contact.', __('Sorry, there was an error while trying to remove %1$s as a contact.',
this.model.contact.getDisplayName()) this.model.contact.getDisplayName())
]); ]);
...@@ -229,7 +230,7 @@ converse.plugins.add('converse-chatview', { ...@@ -229,7 +230,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.HeadlinesBoxView } * @type { _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('chatBoxViewInitialized', view => { ... }); * @example _converse.api.listen.on('chatBoxViewInitialized', view => { ... });
*/ */
_converse.api.trigger('chatBoxViewInitialized', this); api.trigger('chatBoxViewInitialized', this);
}, },
initDebounced () { initDebounced () {
...@@ -269,7 +270,7 @@ converse.plugins.add('converse-chatview', { ...@@ -269,7 +270,7 @@ converse.plugins.add('converse-chatview', {
}, },
renderToolbar () { renderToolbar () {
if (!_converse.api.settings.get('show_toolbar')) { if (!api.settings.get('show_toolbar')) {
return this; return this;
} }
const options = Object.assign( const options = Object.assign(
...@@ -285,7 +286,7 @@ converse.plugins.add('converse-chatview', { ...@@ -285,7 +286,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView } * @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('renderToolbar', view => { ... }); * @example _converse.api.listen.on('renderToolbar', view => { ... });
*/ */
_converse.api.trigger('renderToolbar', this); api.trigger('renderToolbar', this);
return this; return this;
}, },
...@@ -294,13 +295,13 @@ converse.plugins.add('converse-chatview', { ...@@ -294,13 +295,13 @@ converse.plugins.add('converse-chatview', {
form_container.innerHTML = tpl_chatbox_message_form( form_container.innerHTML = tpl_chatbox_message_form(
Object.assign(this.model.toJSON(), { Object.assign(this.model.toJSON(), {
'__': __, '__': __,
'message_limit': _converse.api.settings.get('message_limit'), 'message_limit': api.settings.get('message_limit'),
'hint_value': this.el.querySelector('.spoiler-hint')?.value, 'hint_value': this.el.querySelector('.spoiler-hint')?.value,
'label_message': this.model.get('composing_spoiler') ? __('Hidden message') : __('Message'), 'label_message': this.model.get('composing_spoiler') ? __('Hidden message') : __('Message'),
'label_spoiler_hint': __('Optional hint'), 'label_spoiler_hint': __('Optional hint'),
'message_value': this.el.querySelector('.chat-textarea')?.value, 'message_value': this.el.querySelector('.chat-textarea')?.value,
'show_send_button': _converse.api.settings.get('show_send_button'), 'show_send_button': api.settings.get('show_send_button'),
'show_toolbar': _converse.api.settings.get('show_toolbar'), 'show_toolbar': api.settings.get('show_toolbar'),
'unread_msgs': __('You have unread messages') 'unread_msgs': __('You have unread messages')
})); }));
this.el.addEventListener('focusin', ev => this.emitFocused(ev)); this.el.addEventListener('focusin', ev => this.emitFocused(ev));
...@@ -346,7 +347,7 @@ converse.plugins.add('converse-chatview', { ...@@ -346,7 +347,7 @@ converse.plugins.add('converse-chatview', {
}, },
async addFileUploadButton () { async addFileUploadButton () {
if (await _converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain)) { if (await api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain)) {
if (this.el.querySelector('.chat-toolbar .upload-file')) { if (this.el.querySelector('.chat-toolbar .upload-file')) {
return; return;
} }
...@@ -372,7 +373,7 @@ converse.plugins.add('converse-chatview', { ...@@ -372,7 +373,7 @@ converse.plugins.add('converse-chatview', {
} }
const results = await Promise.all( const results = await Promise.all(
this.model.presence.resources.map( this.model.presence.resources.map(
r => _converse.api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${r.get('name')}`) r => api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${r.get('name')}`)
) )
); );
const all_resources_support_spolers = results.reduce((acc, val) => (acc && val), true); const all_resources_support_spolers = results.reduce((acc, val) => (acc && val), true);
...@@ -429,9 +430,9 @@ converse.plugins.add('converse-chatview', { ...@@ -429,9 +430,9 @@ converse.plugins.add('converse-chatview', {
'i18n_title': __('See more information about this person'), 'i18n_title': __('See more information about this person'),
'icon_class': 'fa-id-card', 'icon_class': 'fa-id-card',
'name': 'details', 'name': 'details',
'standalone': _converse.api.settings.get("view_mode") === 'overlayed', 'standalone': api.settings.get("view_mode") === 'overlayed',
}]; }];
if (!_converse.api.settings.get("singleton")) { if (!api.settings.get("singleton")) {
buttons.push({ buttons.push({
'a_class': 'close-chatbox-button', 'a_class': 'close-chatbox-button',
'handler': ev => this.close(ev), 'handler': ev => this.close(ev),
...@@ -439,7 +440,7 @@ converse.plugins.add('converse-chatview', { ...@@ -439,7 +440,7 @@ converse.plugins.add('converse-chatview', {
'i18n_title': __('Close and end this conversation'), 'i18n_title': __('Close and end this conversation'),
'icon_class': 'fa-times', 'icon_class': 'fa-times',
'name': 'close', 'name': 'close',
'standalone': _converse.api.settings.get("view_mode") === 'overlayed', 'standalone': api.settings.get("view_mode") === 'overlayed',
}); });
} }
return buttons; return buttons;
...@@ -456,9 +457,9 @@ converse.plugins.add('converse-chatview', { ...@@ -456,9 +457,9 @@ converse.plugins.add('converse-chatview', {
'label_clear': __('Clear all messages'), 'label_clear': __('Clear all messages'),
'label_message_limit': __('Message characters remaining'), 'label_message_limit': __('Message characters remaining'),
'label_toggle_spoiler': label_toggle_spoiler, 'label_toggle_spoiler': label_toggle_spoiler,
'message_limit': _converse.api.settings.get('message_limit'), 'message_limit': api.settings.get('message_limit'),
'show_call_button': _converse.api.settings.get('visible_toolbar_buttons').call, 'show_call_button': api.settings.get('visible_toolbar_buttons').call,
'show_spoiler_button': _converse.api.settings.get('visible_toolbar_buttons').spoiler, 'show_spoiler_button': api.settings.get('visible_toolbar_buttons').spoiler,
'tooltip_start_call': __('Start a call') 'tooltip_start_call': __('Start a call')
} }
}, },
...@@ -476,7 +477,7 @@ converse.plugins.add('converse-chatview', { ...@@ -476,7 +477,7 @@ converse.plugins.add('converse-chatview', {
* @type {_converse.ChatBoxView | _converse.ChatRoomView} * @type {_converse.ChatBoxView | _converse.ChatRoomView}
* @example _converse.api.listen.on('afterMessagesFetched', view => { ... }); * @example _converse.api.listen.on('afterMessagesFetched', view => { ... });
*/ */
_converse.api.trigger('afterMessagesFetched', this); api.trigger('afterMessagesFetched', this);
}, },
insertIntoDOM () { insertIntoDOM () {
...@@ -487,7 +488,7 @@ converse.plugins.add('converse-chatview', { ...@@ -487,7 +488,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.HeadlinesBoxView } * @type { _converse.ChatBoxView | _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('chatBoxInsertedIntoDOM', view => { ... }); * @example _converse.api.listen.on('chatBoxInsertedIntoDOM', view => { ... });
*/ */
_converse.api.trigger('chatBoxInsertedIntoDOM', this); api.trigger('chatBoxInsertedIntoDOM', this);
return this; return this;
}, },
...@@ -631,7 +632,7 @@ converse.plugins.add('converse-chatview', { ...@@ -631,7 +632,7 @@ converse.plugins.add('converse-chatview', {
* @property { string } message - The message text * @property { string } message - The message text
* @example _converse.api.listen.on('contactStatusMessageChanged', obj => { ... }); * @example _converse.api.listen.on('contactStatusMessageChanged', obj => { ... });
*/ */
_converse.api.trigger('contactStatusMessageChanged', { api.trigger('contactStatusMessageChanged', {
'contact': item.attributes, 'contact': item.attributes,
'message': item.get('status') 'message': item.get('status')
}); });
...@@ -792,7 +793,7 @@ converse.plugins.add('converse-chatview', { ...@@ -792,7 +793,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model * @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model
* @example _converse.api.listen.on('messageAdded', data => { ... }); * @example _converse.api.listen.on('messageAdded', data => { ... });
*/ */
_converse.api.trigger('messageAdded', { api.trigger('messageAdded', {
'message': message, 'message': message,
'chatbox': this.model 'chatbox': this.model
}); });
...@@ -824,7 +825,7 @@ converse.plugins.add('converse-chatview', { ...@@ -824,7 +825,7 @@ converse.plugins.add('converse-chatview', {
ev.preventDefault(); ev.preventDefault();
const textarea = this.el.querySelector('.chat-textarea'); const textarea = this.el.querySelector('.chat-textarea');
const message_text = textarea.value.trim(); const message_text = textarea.value.trim();
if (_converse.api.settings.get('message_limit') && message_text.length > _converse.api.settings.get('message_limit') || if (api.settings.get('message_limit') && message_text.length > api.settings.get('message_limit') ||
!message_text.replace(/\s/g, '').length) { !message_text.replace(/\s/g, '').length) {
return; return;
} }
...@@ -833,7 +834,7 @@ converse.plugins.add('converse-chatview', { ...@@ -833,7 +834,7 @@ converse.plugins.add('converse-chatview', {
['Sorry, the connection has been lost, and your message could not be sent'], ['Sorry, the connection has been lost, and your message could not be sent'],
'error' 'error'
); );
_converse.api.connection.reconnect(); api.connection.reconnect();
return; return;
} }
let spoiler_hint, hint_el = {}; let spoiler_hint, hint_el = {};
...@@ -860,9 +861,9 @@ converse.plugins.add('converse-chatview', { ...@@ -860,9 +861,9 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.Message } * @type { _converse.Message }
* @example _converse.api.listen.on('messageSend', message => { ... }); * @example _converse.api.listen.on('messageSend', message => { ... });
*/ */
_converse.api.trigger('messageSend', message); api.trigger('messageSend', message);
} }
if (_converse.api.settings.get("view_mode") === 'overlayed') { if (api.settings.get("view_mode") === 'overlayed') {
// XXX: Chrome flexbug workaround. The .chat-content area // XXX: Chrome flexbug workaround. The .chat-content area
// doesn't resize when the textarea is resized to its original size. // doesn't resize when the textarea is resized to its original size.
this.msgs_container.parentElement.style.display = 'none'; this.msgs_container.parentElement.style.display = 'none';
...@@ -870,7 +871,7 @@ converse.plugins.add('converse-chatview', { ...@@ -870,7 +871,7 @@ converse.plugins.add('converse-chatview', {
textarea.removeAttribute('disabled'); textarea.removeAttribute('disabled');
u.removeClass('disabled', textarea); u.removeClass('disabled', textarea);
if (_converse.api.settings.get("view_mode") === 'overlayed') { if (api.settings.get("view_mode") === 'overlayed') {
// XXX: Chrome flexbug workaround. // XXX: Chrome flexbug workaround.
this.msgs_container.parentElement.style.display = ''; this.msgs_container.parentElement.style.display = '';
} }
...@@ -881,9 +882,9 @@ converse.plugins.add('converse-chatview', { ...@@ -881,9 +882,9 @@ converse.plugins.add('converse-chatview', {
}, },
updateCharCounter (chars) { updateCharCounter (chars) {
if (_converse.api.settings.get('message_limit')) { if (api.settings.get('message_limit')) {
const message_limit = this.el.querySelector('.message-limit'); const message_limit = this.el.querySelector('.message-limit');
const counter = _converse.api.settings.get('message_limit') - chars.length; const counter = api.settings.get('message_limit') - chars.length;
message_limit.textContent = counter; message_limit.textContent = counter;
if (counter < 1) { if (counter < 1) {
u.addClass('error', message_limit); u.addClass('error', message_limit);
...@@ -992,10 +993,10 @@ converse.plugins.add('converse-chatview', { ...@@ -992,10 +993,10 @@ converse.plugins.add('converse-chatview', {
"be removed everywhere."); "be removed everywhere.");
const messages = [__('Are you sure you want to retract this message?')]; const messages = [__('Are you sure you want to retract this message?')];
if (_converse.api.settings.get('show_retraction_warning')) { if (api.settings.get('show_retraction_warning')) {
messages[1] = retraction_warning; messages[1] = retraction_warning;
} }
const result = await _converse.api.confirm(__('Confirm'), messages); const result = await api.confirm(__('Confirm'), messages);
if (result) { if (result) {
this.model.retractOwnMessage(message); this.model.retractOwnMessage(message);
} }
...@@ -1138,7 +1139,7 @@ converse.plugins.add('converse-chatview', { ...@@ -1138,7 +1139,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } _converse.connection - The XMPP Connection object * @property { _converse.ChatBox | _converse.ChatRoom } _converse.connection - The XMPP Connection object
* @example _converse.api.listen.on('callButtonClicked', (connection, model) => { ... }); * @example _converse.api.listen.on('callButtonClicked', (connection, model) => { ... });
*/ */
_converse.api.trigger('callButtonClicked', { api.trigger('callButtonClicked', {
connection: _converse.connection, connection: _converse.connection,
model: this.model model: this.model
}); });
...@@ -1207,7 +1208,7 @@ converse.plugins.add('converse-chatview', { ...@@ -1207,7 +1208,7 @@ converse.plugins.add('converse-chatview', {
if (_converse.router.history.getFragment() === "converse/chat?jid="+this.model.get('jid')) { if (_converse.router.history.getFragment() === "converse/chat?jid="+this.model.get('jid')) {
_converse.router.navigate(''); _converse.router.navigate('');
} }
if (_converse.api.connection.connected()) { if (api.connection.connected()) {
// Immediately sending the chat state, because the // Immediately sending the chat state, because the
// model is going to be destroyed afterwards. // model is going to be destroyed afterwards.
this.model.setChatState(_converse.INACTIVE); this.model.setChatState(_converse.INACTIVE);
...@@ -1221,7 +1222,7 @@ converse.plugins.add('converse-chatview', { ...@@ -1221,7 +1222,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView } * @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxClosed', view => { ... }); * @example _converse.api.listen.on('chatBoxClosed', view => { ... });
*/ */
_converse.api.trigger('chatBoxClosed', this); api.trigger('chatBoxClosed', this);
return this; return this;
}, },
...@@ -1236,7 +1237,7 @@ converse.plugins.add('converse-chatview', { ...@@ -1236,7 +1237,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView } * @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxBlurred', (view, event) => { ... }); * @example _converse.api.listen.on('chatBoxBlurred', (view, event) => { ... });
*/ */
_converse.api.trigger('chatBoxBlurred', this, ev); api.trigger('chatBoxBlurred', this, ev);
}, },
emitFocused (ev) { emitFocused (ev) {
...@@ -1250,7 +1251,7 @@ converse.plugins.add('converse-chatview', { ...@@ -1250,7 +1251,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView } * @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxFocused', (view, event) => { ... }); * @example _converse.api.listen.on('chatBoxFocused', (view, event) => { ... });
*/ */
_converse.api.trigger('chatBoxFocused', this, ev); api.trigger('chatBoxFocused', this, ev);
}, },
focus () { focus () {
...@@ -1262,7 +1263,7 @@ converse.plugins.add('converse-chatview', { ...@@ -1262,7 +1263,7 @@ converse.plugins.add('converse-chatview', {
}, },
maybeFocus () { maybeFocus () {
_converse.api.settings.get('auto_focus') && this.focus(); api.settings.get('auto_focus') && this.focus();
}, },
hide () { hide () {
...@@ -1289,9 +1290,9 @@ converse.plugins.add('converse-chatview', { ...@@ -1289,9 +1290,9 @@ converse.plugins.add('converse-chatview', {
* @type {object} * @type {object}
* @property { _converse.ChatBoxView | _converse.ChatRoomView } view * @property { _converse.ChatBoxView | _converse.ChatRoomView } view
*/ */
_converse.api.trigger('beforeShowingChatView', this); api.trigger('beforeShowingChatView', this);
if (_converse.api.settings.get('animate')) { if (api.settings.get('animate')) {
u.fadeIn(this.el, () => this.afterShown()); u.fadeIn(this.el, () => this.afterShown());
} else { } else {
u.showElement(this.el); u.showElement(this.el);
...@@ -1363,7 +1364,7 @@ converse.plugins.add('converse-chatview', { ...@@ -1363,7 +1364,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model * @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model
* @example _converse.api.listen.on('chatBoxScrolledDown', obj => { ... }); * @example _converse.api.listen.on('chatBoxScrolledDown', obj => { ... });
*/ */
_converse.api.trigger('chatBoxScrolledDown', {'chatbox': this.model}); // TODO: clean up api.trigger('chatBoxScrolledDown', {'chatbox': this.model}); // TODO: clean up
}, },
onWindowStateChanged (state) { onWindowStateChanged (state) {
...@@ -1381,7 +1382,7 @@ converse.plugins.add('converse-chatview', { ...@@ -1381,7 +1382,7 @@ converse.plugins.add('converse-chatview', {
} }
}); });
_converse.api.listen.on('chatBoxViewsInitialized', () => { api.listen.on('chatBoxViewsInitialized', () => {
const views = _converse.chatboxviews; const views = _converse.chatboxviews;
_converse.chatboxes.on('add', async item => { _converse.chatboxes.on('add', async item => {
if (!views.get(item.get('id')) && item.get('type') === _converse.PRIVATE_CHAT_TYPE) { if (!views.get(item.get('id')) && item.get('type') === _converse.PRIVATE_CHAT_TYPE) {
...@@ -1402,13 +1403,13 @@ converse.plugins.add('converse-chatview', { ...@@ -1402,13 +1403,13 @@ converse.plugins.add('converse-chatview', {
}); });
} }
} }
_converse.api.listen.on('windowStateChanged', onWindowStateChanged); api.listen.on('windowStateChanged', onWindowStateChanged);
_converse.api.listen.on('connected', () => _converse.api.disco.own.features.add(Strophe.NS.SPOILER)); api.listen.on('connected', () => api.disco.own.features.add(Strophe.NS.SPOILER));
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The "chatview" namespace groups methods pertaining to views * The "chatview" namespace groups methods pertaining to views
* for one-on-one chats. * for one-on-one chats.
......
...@@ -98,10 +98,11 @@ converse.plugins.add('converse-controlbox', { ...@@ -98,10 +98,11 @@ converse.plugins.add('converse-controlbox', {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this, const { _converse } = this;
{ __ } = _converse; const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({ api.settings.update({
allow_logout: true, allow_logout: true,
default_domain: undefined, default_domain: undefined,
locked_domain: undefined, locked_domain: undefined,
...@@ -109,7 +110,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -109,7 +110,7 @@ converse.plugins.add('converse-controlbox', {
sticky_controlbox: false sticky_controlbox: false
}); });
_converse.api.promises.add('controlBoxInitialized'); api.promises.add('controlBoxInitialized');
_converse.ControlBox = _converse.ChatBox.extend({ _converse.ControlBox = _converse.ChatBox.extend({
...@@ -119,7 +120,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -119,7 +120,7 @@ converse.plugins.add('converse-controlbox', {
'bookmarked': false, 'bookmarked': false,
'box_id': 'controlbox', 'box_id': 'controlbox',
'chat_state': undefined, 'chat_state': undefined,
'closed': !_converse.api.settings.get('show_controlbox_by_default'), 'closed': !api.settings.get('show_controlbox_by_default'),
'num_unread': 0, 'num_unread': 0,
'time_opened': this.get('time_opened') || (new Date()).getTime(), 'time_opened': this.get('time_opened') || (new Date()).getTime(),
'type': _converse.CONTROLBOX_TYPE, 'type': _converse.CONTROLBOX_TYPE,
...@@ -137,7 +138,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -137,7 +138,7 @@ converse.plugins.add('converse-controlbox', {
validate (attrs) { validate (attrs) {
if (attrs.type === _converse.CONTROLBOX_TYPE) { if (attrs.type === _converse.CONTROLBOX_TYPE) {
if (_converse.api.settings.get("view_mode") === 'embedded' && _converse.api.settings.get("singleton")) { if (api.settings.get("view_mode") === 'embedded' && api.settings.get("singleton")) {
return 'Controlbox not relevant in embedded view mode'; return 'Controlbox not relevant in embedded view mode';
} }
return; return;
...@@ -191,13 +192,13 @@ converse.plugins.add('converse-controlbox', { ...@@ -191,13 +192,13 @@ converse.plugins.add('converse-controlbox', {
* @type { _converse.ControlBoxView } * @type { _converse.ControlBoxView }
* @example _converse.api.listen.on('controlBoxInitialized', view => { ... }); * @example _converse.api.listen.on('controlBoxInitialized', view => { ... });
*/ */
_converse.api.trigger('controlBoxInitialized', this); api.trigger('controlBoxInitialized', this);
}, },
render () { render () {
if (this.model.get('connected')) { if (this.model.get('connected')) {
if (this.model.get('closed') === undefined) { if (this.model.get('closed') === undefined) {
this.model.set('closed', !_converse.api.settings.get('show_controlbox_by_default')); this.model.set('closed', !api.settings.get('show_controlbox_by_default'));
} }
} }
this.el.innerHTML = tpl_controlbox(Object.assign(this.model.toJSON())); this.el.innerHTML = tpl_controlbox(Object.assign(this.model.toJSON()));
...@@ -225,7 +226,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -225,7 +226,7 @@ converse.plugins.add('converse-controlbox', {
createBrandHeadingHTML () { createBrandHeadingHTML () {
return tpl_brand_heading({ return tpl_brand_heading({
'sticky_controlbox': _converse.api.settings.get('sticky_controlbox') 'sticky_controlbox': api.settings.get('sticky_controlbox')
}); });
}, },
...@@ -285,10 +286,10 @@ converse.plugins.add('converse-controlbox', { ...@@ -285,10 +286,10 @@ converse.plugins.add('converse-controlbox', {
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
if (ev?.name === 'closeAllChatBoxes' && if (ev?.name === 'closeAllChatBoxes' &&
(_converse.disconnection_cause !== _converse.LOGOUT || (_converse.disconnection_cause !== _converse.LOGOUT ||
_converse.api.settings.get('show_controlbox_by_default'))) { api.settings.get('show_controlbox_by_default'))) {
return; return;
} }
if (_converse.api.settings.get('sticky_controlbox')) { if (api.settings.get('sticky_controlbox')) {
return; return;
} }
const connection = _converse?.connection || {}; const connection = _converse?.connection || {};
...@@ -302,7 +303,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -302,7 +303,7 @@ converse.plugins.add('converse-controlbox', {
} else { } else {
this.model.trigger('hide'); this.model.trigger('hide');
} }
_converse.api.trigger('controlBoxClosed', this); api.trigger('controlBoxClosed', this);
return this; return this;
}, },
...@@ -315,13 +316,13 @@ converse.plugins.add('converse-controlbox', { ...@@ -315,13 +316,13 @@ converse.plugins.add('converse-controlbox', {
}, },
hide (callback) { hide (callback) {
if (_converse.api.settings.get('sticky_controlbox')) { if (api.settings.get('sticky_controlbox')) {
return; return;
} }
u.addClass('hidden', this.el); u.addClass('hidden', this.el);
_converse.api.trigger('chatBoxClosed', this); api.trigger('chatBoxClosed', this);
if (!_converse.api.connection.connected()) { if (!api.connection.connected()) {
_converse.controlboxtoggle.render(); _converse.controlboxtoggle.render();
} }
_converse.controlboxtoggle.show(callback); _converse.controlboxtoggle.show(callback);
...@@ -336,7 +337,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -336,7 +337,7 @@ converse.plugins.add('converse-controlbox', {
* @event _converse#controlBoxOpened * @event _converse#controlBoxOpened
* @type {_converse.ControlBox} * @type {_converse.ControlBox}
*/ */
_converse.api.trigger('controlBoxOpened', this); api.trigger('controlBoxOpened', this);
}, },
show () { show () {
...@@ -387,12 +388,12 @@ converse.plugins.add('converse-controlbox', { ...@@ -387,12 +388,12 @@ converse.plugins.add('converse-controlbox', {
'LOGIN': _converse.LOGIN, 'LOGIN': _converse.LOGIN,
'PREBIND': _converse.PREBIND, 'PREBIND': _converse.PREBIND,
'auto_login': _converse.auto_login, 'auto_login': _converse.auto_login,
'authentication': _converse.api.settings.get("authentication"), 'authentication': api.settings.get("authentication"),
'connection_status': connection_status, 'connection_status': connection_status,
'conn_feedback_class': feedback_class, 'conn_feedback_class': feedback_class,
'conn_feedback_subject': pretty_status, 'conn_feedback_subject': pretty_status,
'conn_feedback_message': _converse.connfeedback.get('message'), 'conn_feedback_message': _converse.connfeedback.get('message'),
'placeholder_username': (_converse.api.settings.get('locked_domain') || _converse.api.settings.get('default_domain')) && 'placeholder_username': (api.settings.get('locked_domain') || api.settings.get('default_domain')) &&
__('Username') || __('user@domain'), __('Username') || __('user@domain'),
'show_trust_checkbox': _converse.trusted !== 'on' && _converse.trusted !== 'off' 'show_trust_checkbox': _converse.trusted !== 'on' && _converse.trusted !== 'off'
}) })
...@@ -402,8 +403,8 @@ converse.plugins.add('converse-controlbox', { ...@@ -402,8 +403,8 @@ converse.plugins.add('converse-controlbox', {
initPopovers () { initPopovers () {
Array.from(this.el.querySelectorAll('[data-title]')).forEach(el => { Array.from(this.el.querySelectorAll('[data-title]')).forEach(el => {
new bootstrap.Popover(el, { new bootstrap.Popover(el, {
'trigger': _converse.api.settings.get("view_mode") === 'mobile' && 'click' || 'hover', 'trigger': api.settings.get("view_mode") === 'mobile' && 'click' || 'hover',
'dismissible': _converse.api.settings.get("view_mode") === 'mobile' && true || false, 'dismissible': api.settings.get("view_mode") === 'mobile' && true || false,
'container': this.el.parentElement.parentElement.parentElement 'container': this.el.parentElement.parentElement.parentElement
}) })
}); });
...@@ -413,8 +414,8 @@ converse.plugins.add('converse-controlbox', { ...@@ -413,8 +414,8 @@ converse.plugins.add('converse-controlbox', {
const form = this.el.querySelector('form'); const form = this.el.querySelector('form');
const jid_element = form.querySelector('input[name=jid]'); const jid_element = form.querySelector('input[name=jid]');
if (jid_element.value && if (jid_element.value &&
!_converse.api.settings.get('locked_domain') && !api.settings.get('locked_domain') &&
!_converse.api.settings.get('default_domain') && !api.settings.get('default_domain') &&
!u.isValidJID(jid_element.value)) { !u.isValidJID(jid_element.value)) {
jid_element.setCustomValidity(__('Please enter a valid XMPP address')); jid_element.setCustomValidity(__('Please enter a valid XMPP address'));
return false; return false;
...@@ -427,7 +428,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -427,7 +428,7 @@ converse.plugins.add('converse-controlbox', {
/* Authenticate the user based on a form submission event. /* Authenticate the user based on a form submission event.
*/ */
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
if (_converse.api.settings.get("authentication") === _converse.ANONYMOUS) { if (api.settings.get("authentication") === _converse.ANONYMOUS) {
return this.connect(_converse.jid, null); return this.connect(_converse.jid, null);
} }
if (!this.validate()) { return; } if (!this.validate()) { return; }
...@@ -447,14 +448,14 @@ converse.plugins.add('converse-controlbox', { ...@@ -447,14 +448,14 @@ converse.plugins.add('converse-controlbox', {
} }
let jid = form_data.get('jid'); let jid = form_data.get('jid');
if (_converse.api.settings.get('locked_domain')) { if (api.settings.get('locked_domain')) {
const last_part = '@' + _converse.api.settings.get('locked_domain'); const last_part = '@' + api.settings.get('locked_domain');
if (jid.endsWith(last_part)) { if (jid.endsWith(last_part)) {
jid = jid.substr(0, jid.length - last_part.length); jid = jid.substr(0, jid.length - last_part.length);
} }
jid = Strophe.escapeNode(jid) + last_part; jid = Strophe.escapeNode(jid) + last_part;
} else if (_converse.api.settings.get('default_domain') && !jid.includes('@')) { } else if (api.settings.get('default_domain') && !jid.includes('@')) {
jid = jid + '@' + _converse.api.settings.get('default_domain'); jid = jid + '@' + api.settings.get('default_domain');
} }
this.connect(jid, form_data.get('password')); this.connect(jid, form_data.get('password'));
}, },
...@@ -464,7 +465,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -464,7 +465,7 @@ converse.plugins.add('converse-controlbox', {
_converse.router.navigate('', {'replace': true}); _converse.router.navigate('', {'replace': true});
} }
_converse.connection && _converse.connection.reset(); _converse.connection && _converse.connection.reset();
_converse.api.user.login(jid, password); api.user.login(jid, password);
} }
}); });
...@@ -480,7 +481,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -480,7 +481,7 @@ converse.plugins.add('converse-controlbox', {
* @type { _converse.ControlBoxPane } * @type { _converse.ControlBoxPane }
* @example _converse.api.listen.on('controlBoxPaneInitialized', view => { ... }); * @example _converse.api.listen.on('controlBoxPaneInitialized', view => { ... });
*/ */
_converse.api.trigger('controlBoxPaneInitialized', this); api.trigger('controlBoxPaneInitialized', this);
} }
}); });
...@@ -498,7 +499,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -498,7 +499,7 @@ converse.plugins.add('converse-controlbox', {
initialize () { initialize () {
_converse.chatboxviews.insertRowColumn(this.render().el); _converse.chatboxviews.insertRowColumn(this.render().el);
_converse.api.waitUntil('initialized') api.waitUntil('initialized')
.then(this.render.bind(this)) .then(this.render.bind(this))
.catch(e => log.fatal(e)); .catch(e => log.fatal(e));
}, },
...@@ -509,7 +510,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -509,7 +510,7 @@ converse.plugins.add('converse-controlbox', {
// artifacts (i.e. on page load the toggle is shown only to then // artifacts (i.e. on page load the toggle is shown only to then
// seconds later be hidden in favor of the controlbox). // seconds later be hidden in favor of the controlbox).
this.el.innerHTML = tpl_controlbox_toggle({ this.el.innerHTML = tpl_controlbox_toggle({
'label_toggle': _converse.api.connection.connected() ? __('Chat Contacts') : __('Toggle chat') 'label_toggle': api.connection.connected() ? __('Chat Contacts') : __('Toggle chat')
}) })
return this; return this;
}, },
...@@ -532,7 +533,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -532,7 +533,7 @@ converse.plugins.add('converse-controlbox', {
if (!controlbox) { if (!controlbox) {
controlbox = addControlBox(); controlbox = addControlBox();
} }
if (_converse.api.connection.connected()) { if (api.connection.connected()) {
controlbox.save({'closed': false}); controlbox.save({'closed': false});
} else { } else {
controlbox.trigger('show'); controlbox.trigger('show');
...@@ -543,7 +544,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -543,7 +544,7 @@ converse.plugins.add('converse-controlbox', {
e.preventDefault(); e.preventDefault();
if (u.isVisible(_converse.root.querySelector("#controlbox"))) { if (u.isVisible(_converse.root.querySelector("#controlbox"))) {
const controlbox = _converse.chatboxes.get('controlbox'); const controlbox = _converse.chatboxes.get('controlbox');
if (_converse.api.connection.connected) { if (api.connection.connected) {
controlbox.save({closed: true}); controlbox.save({closed: true});
} else { } else {
controlbox.trigger('hide'); controlbox.trigger('hide');
...@@ -557,7 +558,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -557,7 +558,7 @@ converse.plugins.add('converse-controlbox', {
/******************** Event Handlers ********************/ /******************** Event Handlers ********************/
_converse.api.listen.on('chatBoxViewsInitialized', () => { api.listen.on('chatBoxViewsInitialized', () => {
_converse.chatboxes.on('add', item => { _converse.chatboxes.on('add', item => {
if (item.get('type') === _converse.CONTROLBOX_TYPE) { if (item.get('type') === _converse.CONTROLBOX_TYPE) {
const views = _converse.chatboxviews; const views = _converse.chatboxviews;
...@@ -572,7 +573,7 @@ converse.plugins.add('converse-controlbox', { ...@@ -572,7 +573,7 @@ converse.plugins.add('converse-controlbox', {
}); });
}); });
_converse.api.listen.on('clearSession', () => { api.listen.on('clearSession', () => {
const chatboxviews = _converse?.chatboxviews; const chatboxviews = _converse?.chatboxviews;
const view = chatboxviews && chatboxviews.get('controlbox'); const view = chatboxviews && chatboxviews.get('controlbox');
if (view) { if (view) {
...@@ -585,11 +586,11 @@ converse.plugins.add('converse-controlbox', { ...@@ -585,11 +586,11 @@ converse.plugins.add('converse-controlbox', {
}); });
_converse.api.waitUntil('chatBoxViewsInitialized') api.waitUntil('chatBoxViewsInitialized')
.then(addControlBox) .then(addControlBox)
.catch(e => log.fatal(e)); .catch(e => log.fatal(e));
_converse.api.listen.on('chatBoxesFetched', () => { api.listen.on('chatBoxesFetched', () => {
const controlbox = _converse.chatboxes.get('controlbox') || addControlBox(); const controlbox = _converse.chatboxes.get('controlbox') || addControlBox();
controlbox.save({'connected': true}); controlbox.save({'connected': true});
}); });
...@@ -603,12 +604,12 @@ converse.plugins.add('converse-controlbox', { ...@@ -603,12 +604,12 @@ converse.plugins.add('converse-controlbox', {
view.model.set({'connected': false}); view.model.set({'connected': false});
return view; return view;
}; };
_converse.api.listen.on('disconnected', () => disconnect().renderLoginPanel()); api.listen.on('disconnected', () => disconnect().renderLoginPanel());
_converse.api.listen.on('will-reconnect', disconnect); api.listen.on('will-reconnect', disconnect);
/************************ API ************************/ /************************ API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The "controlbox" namespace groups methods pertaining to the * The "controlbox" namespace groups methods pertaining to the
* controlbox view * controlbox view
...@@ -623,9 +624,9 @@ converse.plugins.add('converse-controlbox', { ...@@ -623,9 +624,9 @@ converse.plugins.add('converse-controlbox', {
* @returns { Promise<_converse.ControlBox> } * @returns { Promise<_converse.ControlBox> }
*/ */
async open () { async open () {
await _converse.api.waitUntil('chatBoxesFetched'); await api.waitUntil('chatBoxesFetched');
const model = await _converse.api.chatboxes.get('controlbox') || const model = await api.chatboxes.get('controlbox') ||
_converse.api.chatboxes.create('controlbox', {}, _converse.Controlbox); api.chatboxes.create('controlbox', {}, _converse.Controlbox);
model.trigger('show'); model.trigger('show');
return model; return model;
}, },
......
...@@ -134,8 +134,9 @@ converse.plugins.add('converse-dragresize', { ...@@ -134,8 +134,9 @@ converse.plugins.add('converse-dragresize', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({ api.settings.update({
'allow_dragresize': true, 'allow_dragresize': true,
}); });
...@@ -252,7 +253,7 @@ converse.plugins.add('converse-dragresize', { ...@@ -252,7 +253,7 @@ converse.plugins.add('converse-dragresize', {
}, },
onStartVerticalResize (ev, trigger=true) { onStartVerticalResize (ev, trigger=true) {
if (!_converse.api.settings.get('allow_dragresize')) { if (!api.settings.get('allow_dragresize')) {
return true; return true;
} }
// Record element attributes for mouseMove(). // Record element attributes for mouseMove().
...@@ -270,12 +271,12 @@ converse.plugins.add('converse-dragresize', { ...@@ -270,12 +271,12 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startVerticalResize * @event _converse#startVerticalResize
* @example _converse.api.listen.on('startVerticalResize', (view) => { ... }); * @example _converse.api.listen.on('startVerticalResize', (view) => { ... });
*/ */
_converse.api.trigger('startVerticalResize', this); api.trigger('startVerticalResize', this);
} }
}, },
onStartHorizontalResize (ev, trigger=true) { onStartHorizontalResize (ev, trigger=true) {
if (!_converse.api.settings.get('allow_dragresize')) { if (!api.settings.get('allow_dragresize')) {
return true; return true;
} }
const flyout = this.el.querySelector('.box-flyout'), const flyout = this.el.querySelector('.box-flyout'),
...@@ -292,7 +293,7 @@ converse.plugins.add('converse-dragresize', { ...@@ -292,7 +293,7 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startHorizontalResize * @event _converse#startHorizontalResize
* @example _converse.api.listen.on('startHorizontalResize', (view) => { ... }); * @example _converse.api.listen.on('startHorizontalResize', (view) => { ... });
*/ */
_converse.api.trigger('startHorizontalResize', this); api.trigger('startHorizontalResize', this);
} }
}, },
...@@ -306,7 +307,7 @@ converse.plugins.add('converse-dragresize', { ...@@ -306,7 +307,7 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startDiagonalResize * @event _converse#startDiagonalResize
* @example _converse.api.listen.on('startDiagonalResize', (view) => { ... }); * @example _converse.api.listen.on('startDiagonalResize', (view) => { ... });
*/ */
_converse.api.trigger('startDiagonalResize', this); api.trigger('startDiagonalResize', this);
}, },
}; };
Object.assign(_converse.ChatBoxView.prototype, dragResizable); Object.assign(_converse.ChatBoxView.prototype, dragResizable);
...@@ -332,7 +333,7 @@ converse.plugins.add('converse-dragresize', { ...@@ -332,7 +333,7 @@ converse.plugins.add('converse-dragresize', {
function onMouseMove (ev) { function onMouseMove (ev) {
if (!_converse.resizing || !_converse.api.settings.get('allow_dragresize')) { if (!_converse.resizing || !api.settings.get('allow_dragresize')) {
return true; return true;
} }
ev.preventDefault(); ev.preventDefault();
...@@ -341,7 +342,7 @@ converse.plugins.add('converse-dragresize', { ...@@ -341,7 +342,7 @@ converse.plugins.add('converse-dragresize', {
function onMouseUp (ev) { function onMouseUp (ev) {
if (!_converse.resizing || !_converse.api.settings.get('allow_dragresize')) { if (!_converse.resizing || !api.settings.get('allow_dragresize')) {
return true; return true;
} }
ev.preventDefault(); ev.preventDefault();
...@@ -353,7 +354,7 @@ converse.plugins.add('converse-dragresize', { ...@@ -353,7 +354,7 @@ converse.plugins.add('converse-dragresize', {
_converse.resizing.chatbox.width, _converse.resizing.chatbox.width,
_converse.resizing.chatbox.model.get('default_width') _converse.resizing.chatbox.model.get('default_width')
); );
if (_converse.api.connection.connected()) { if (api.connection.connected()) {
_converse.resizing.chatbox.model.save({'height': height}); _converse.resizing.chatbox.model.save({'height': height});
_converse.resizing.chatbox.model.save({'width': width}); _converse.resizing.chatbox.model.save({'width': width});
} else { } else {
...@@ -374,9 +375,9 @@ converse.plugins.add('converse-dragresize', { ...@@ -374,9 +375,9 @@ converse.plugins.add('converse-dragresize', {
document.removeEventListener('mouseup', onMouseUp); document.removeEventListener('mouseup', onMouseUp);
} }
_converse.api.listen.on('registeredGlobalEventHandlers', registerGlobalEventHandlers); api.listen.on('registeredGlobalEventHandlers', registerGlobalEventHandlers);
_converse.api.listen.on('unregisteredGlobalEventHandlers', unregisterGlobalEventHandlers); api.listen.on('unregisteredGlobalEventHandlers', unregisterGlobalEventHandlers);
_converse.api.listen.on('beforeShowingChatView', view => view.initDragResize().setDimensions()); api.listen.on('beforeShowingChatView', view => view.initDragResize().setDimensions());
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
} }
}); });
...@@ -68,9 +68,10 @@ converse.plugins.add('converse-emoji-views', { ...@@ -68,9 +68,10 @@ converse.plugins.add('converse-emoji-views', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
const { __ } = _converse; const { __ } = _converse;
_converse.api.settings.update({ api.settings.update({
'use_system_emojis': true, 'use_system_emojis': true,
'visible_toolbar_buttons': { 'visible_toolbar_buttons': {
'emoji': true 'emoji': true
...@@ -91,7 +92,7 @@ converse.plugins.add('converse-emoji-views', { ...@@ -91,7 +92,7 @@ converse.plugins.add('converse-emoji-views', {
}, },
async createEmojiPicker () { async createEmojiPicker () {
await _converse.api.emojis.initialize() await api.emojis.initialize()
const id = `converse.emoji-${_converse.bare_jid}-${this.model.get('jid')}`; const id = `converse.emoji-${_converse.bare_jid}-${this.model.get('jid')}`;
const emojipicker = new _converse.EmojiPicker({'id': id}); const emojipicker = new _converse.EmojiPicker({'id': id});
...@@ -151,7 +152,7 @@ converse.plugins.add('converse-emoji-views', { ...@@ -151,7 +152,7 @@ converse.plugins.add('converse-emoji-views', {
Object.assign( Object.assign(
this.model.toJSON(), { this.model.toJSON(), {
'_converse': _converse, '_converse': _converse,
'emoji_categories': _converse.api.settings.get('emoji_categories'), 'emoji_categories': api.settings.get('emoji_categories'),
'emojis_by_category': _converse.emojis.json, 'emojis_by_category': _converse.emojis.json,
'onSkintonePicked': ev => this.chooseSkinTone(ev), 'onSkintonePicked': ev => this.chooseSkinTone(ev),
'onEmojiPicked': ev => this.insertEmoji(ev), 'onEmojiPicked': ev => this.insertEmoji(ev),
...@@ -415,18 +416,18 @@ converse.plugins.add('converse-emoji-views', { ...@@ -415,18 +416,18 @@ converse.plugins.add('converse-emoji-views', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxClosed', view => view.emoji_picker_view && view.emoji_picker_view.remove()); api.listen.on('chatBoxClosed', view => view.emoji_picker_view && view.emoji_picker_view.remove());
_converse.api.listen.on('renderToolbar', view => { api.listen.on('renderToolbar', view => {
if (_converse.api.settings.get('visible_toolbar_buttons').emoji) { if (api.settings.get('visible_toolbar_buttons').emoji) {
const html = tpl_emoji_button({'tooltip_insert_smiley': __('Insert emojis')}); const html = tpl_emoji_button({'tooltip_insert_smiley': __('Insert emojis')});
view.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html); view.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
} }
}); });
_converse.api.listen.on('headlinesBoxInitialized', () => _converse.api.emojis.initialize()); api.listen.on('headlinesBoxInitialized', () => api.emojis.initialize());
_converse.api.listen.on('chatRoomInitialized', () => _converse.api.emojis.initialize()); api.listen.on('chatRoomInitialized', () => api.emojis.initialize());
_converse.api.listen.on('chatBoxInitialized', () => _converse.api.emojis.initialize()); api.listen.on('chatBoxInitialized', () => api.emojis.initialize());
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
} }
......
...@@ -48,6 +48,7 @@ converse.plugins.add('converse-headlines-view', { ...@@ -48,6 +48,7 @@ converse.plugins.add('converse-headlines-view', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
const viewWithHeadlinesPanel = { const viewWithHeadlinesPanel = {
...@@ -62,7 +63,7 @@ converse.plugins.add('converse-headlines-view', { ...@@ -62,7 +63,7 @@ converse.plugins.add('converse-headlines-view', {
* @event _converse#headlinesPanelRendered * @event _converse#headlinesPanelRendered
* @example _converse.api.listen.on('headlinesPanelRendered', () => { ... }); * @example _converse.api.listen.on('headlinesPanelRendered', () => { ... });
*/ */
_converse.api.trigger('headlinesPanelRendered'); api.trigger('headlinesPanelRendered');
return this.headlinepanel; return this.headlinepanel;
} }
} }
...@@ -150,7 +151,7 @@ converse.plugins.add('converse-headlines-view', { ...@@ -150,7 +151,7 @@ converse.plugins.add('converse-headlines-view', {
* @type { _converse.HeadlinesBoxView } * @type { _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('headlinesBoxViewInitialized', view => { ... }); * @example _converse.api.listen.on('headlinesBoxViewInitialized', view => { ... });
*/ */
_converse.api.trigger('headlinesBoxViewInitialized', this); api.trigger('headlinesBoxViewInitialized', this);
}, },
render () { render () {
...@@ -177,7 +178,7 @@ converse.plugins.add('converse-headlines-view', { ...@@ -177,7 +178,7 @@ converse.plugins.add('converse-headlines-view', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxViewsInitialized', () => { api.listen.on('chatBoxViewsInitialized', () => {
const views = _converse.chatboxviews; const views = _converse.chatboxviews;
_converse.chatboxes.on('add', item => { _converse.chatboxes.on('add', item => {
if (!views.get(item.get('id')) && item.get('type') === _converse.HEADLINES_TYPE) { if (!views.get(item.get('id')) && item.get('type') === _converse.HEADLINES_TYPE) {
......
...@@ -32,6 +32,7 @@ converse.plugins.add('converse-message-view', { ...@@ -32,6 +32,7 @@ converse.plugins.add('converse-message-view', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
const { __ } = _converse; const { __ } = _converse;
...@@ -65,7 +66,7 @@ converse.plugins.add('converse-message-view', { ...@@ -65,7 +66,7 @@ converse.plugins.add('converse-message-view', {
} }
_converse.api.settings.update({ api.settings.update({
'show_images_inline': true, 'show_images_inline': true,
'time_format': 'HH:mm', 'time_format': 'HH:mm',
}); });
...@@ -153,7 +154,7 @@ converse.plugins.add('converse-message-view', { ...@@ -153,7 +154,7 @@ converse.plugins.add('converse-message-view', {
}, },
fadeOut () { fadeOut () {
if (_converse.api.settings.get('animate')) { if (api.settings.get('animate')) {
setTimeout(() => this.remove(), 600); setTimeout(() => this.remove(), 600);
u.addClass('fade-out', this.el); u.addClass('fade-out', this.el);
} else { } else {
...@@ -204,10 +205,10 @@ converse.plugins.add('converse-message-view', { ...@@ -204,10 +205,10 @@ converse.plugins.add('converse-message-view', {
* @param { string } text - The message text * @param { string } text - The message text
* @example _converse.api.listen.on('beforeMessageBodyTransformed', (view, text) => { ... }); * @example _converse.api.listen.on('beforeMessageBodyTransformed', (view, text) => { ... });
*/ */
await _converse.api.trigger('beforeMessageBodyTransformed', this, text, {'Synchronous': true}); await api.trigger('beforeMessageBodyTransformed', this, text, {'Synchronous': true});
text = this.model.isMeCommand() ? text.substring(4) : text; text = this.model.isMeCommand() ? text.substring(4) : text;
text = xss.filterXSS(text, {'whiteList': {}, 'onTag': onTagFoundDuringXSSFilter}); text = xss.filterXSS(text, {'whiteList': {}, 'onTag': onTagFoundDuringXSSFilter});
text = u.geoUriToHttp(text, _converse.api.settings.get("geouri_replacement")); text = u.geoUriToHttp(text, api.settings.get("geouri_replacement"));
text = u.addMentionsMarkup(text, this.model.get('references'), this.model.collection.chatbox); text = u.addMentionsMarkup(text, this.model.get('references'), this.model.collection.chatbox);
text = u.addHyperlinks(text); text = u.addHyperlinks(text);
text = u.renderNewLines(text); text = u.renderNewLines(text);
...@@ -220,12 +221,12 @@ converse.plugins.add('converse-message-view', { ...@@ -220,12 +221,12 @@ converse.plugins.add('converse-message-view', {
* @param { string } text - The message text * @param { string } text - The message text
* @example _converse.api.listen.on('afterMessageBodyTransformed', (view, text) => { ... }); * @example _converse.api.listen.on('afterMessageBodyTransformed', (view, text) => { ... });
*/ */
await _converse.api.trigger('afterMessageBodyTransformed', this, text, {'Synchronous': true}); await api.trigger('afterMessageBodyTransformed', this, text, {'Synchronous': true});
return text; return text;
}, },
async renderChatMessage () { async renderChatMessage () {
await _converse.api.waitUntil('emojisInitialized'); await api.waitUntil('emojisInitialized');
const time = dayjs(this.model.get('time')); const time = dayjs(this.model.get('time'));
const role = this.model.vcard ? this.model.vcard.get('role') : null; const role = this.model.vcard ? this.model.vcard.get('role') : null;
const roles = role ? role.split(',') : []; const roles = role ? role.split(',') : [];
...@@ -243,7 +244,7 @@ converse.plugins.add('converse-message-view', { ...@@ -243,7 +244,7 @@ converse.plugins.add('converse-message-view', {
'is_me_message': this.model.isMeCommand(), 'is_me_message': this.model.isMeCommand(),
'label_show': __('Show more'), 'label_show': __('Show more'),
'occupant': this.model.occupant, 'occupant': this.model.occupant,
'pretty_time': time.format(_converse.api.settings.get('time_format')), 'pretty_time': time.format(api.settings.get('time_format')),
'retraction_text': is_retracted ? this.getRetractionText() : null, 'retraction_text': is_retracted ? this.getRetractionText() : null,
'roles': roles, 'roles': roles,
'time': time.toISOString(), 'time': time.toISOString(),
...@@ -259,7 +260,7 @@ converse.plugins.add('converse-message-view', { ...@@ -259,7 +260,7 @@ converse.plugins.add('converse-message-view', {
const msg_content = msg.querySelector('.chat-msg__text'); const msg_content = msg.querySelector('.chat-msg__text');
if (text && text !== url) { if (text && text !== url) {
msg_content.innerHTML = await this.transformBodyText(text); msg_content.innerHTML = await this.transformBodyText(text);
if (_converse.api.settings.get('show_images_inline')) { if (api.settings.get('show_images_inline')) {
u.renderImageURLs(_converse, msg_content).then(() => this.triggerRendered()); u.renderImageURLs(_converse, msg_content).then(() => this.triggerRendered());
} }
} }
......
...@@ -165,8 +165,9 @@ converse.plugins.add('converse-minimize', { ...@@ -165,8 +165,9 @@ converse.plugins.add('converse-minimize', {
*/ */
const { _converse } = this; const { _converse } = this;
const { __ } = _converse; const { __ } = _converse;
const { api } = _converse;
_converse.api.settings.update({'no_trimming': false}); api.settings.update({'no_trimming': false});
const minimizableChatBox = { const minimizableChatBox = {
maximize () { maximize () {
...@@ -210,7 +211,7 @@ converse.plugins.add('converse-minimize', { ...@@ -210,7 +211,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.ChatBoxView } * @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('chatBoxMaximized', view => { ... }); * @example _converse.api.listen.on('chatBoxMaximized', view => { ... });
*/ */
_converse.api.trigger('chatBoxMaximized', this); api.trigger('chatBoxMaximized', this);
return this; return this;
}, },
...@@ -239,7 +240,7 @@ converse.plugins.add('converse-minimize', { ...@@ -239,7 +240,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.ChatBoxView } * @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('chatBoxMinimized', view => { ... }); * @example _converse.api.listen.on('chatBoxMinimized', view => { ... });
*/ */
_converse.api.trigger('chatBoxMinimized', this); api.trigger('chatBoxMinimized', this);
return this; return this;
}, },
...@@ -314,7 +315,7 @@ converse.plugins.add('converse-minimize', { ...@@ -314,7 +315,7 @@ converse.plugins.add('converse-minimize', {
* @param { _converse.ChatBoxView|_converse.ChatRoomView|_converse.ControlBoxView|_converse.HeadlinesBoxView } [newchat] * @param { _converse.ChatBoxView|_converse.ChatRoomView|_converse.ControlBoxView|_converse.HeadlinesBoxView } [newchat]
*/ */
async trimChats (newchat) { async trimChats (newchat) {
if (_converse.api.settings.get('no_trimming') || !_converse.api.connection.connected() || _converse.api.settings.get("view_mode") !== 'overlayed') { if (api.settings.get('no_trimming') || !api.connection.connected() || api.settings.get("view_mode") !== 'overlayed') {
return; return;
} }
const shown_chats = this.getShownChats(); const shown_chats = this.getShownChats();
...@@ -328,7 +329,7 @@ converse.plugins.add('converse-minimize', { ...@@ -328,7 +329,7 @@ converse.plugins.add('converse-minimize', {
// fullscreen. In this case we don't trim. // fullscreen. In this case we don't trim.
return; return;
} }
await _converse.api.waitUntil('minimizedChatsInitialized'); await api.waitUntil('minimizedChatsInitialized');
const minimized_el = _converse.minimized_chats?.el; const minimized_el = _converse.minimized_chats?.el;
if (minimized_el) { if (minimized_el) {
while ((this.getMinimizedWidth() + this.getBoxesWidth(newchat)) > body_width) { while ((this.getMinimizedWidth() + this.getBoxesWidth(newchat)) > body_width) {
...@@ -369,7 +370,7 @@ converse.plugins.add('converse-minimize', { ...@@ -369,7 +370,7 @@ converse.plugins.add('converse-minimize', {
Object.assign(_converse.ChatBoxViews.prototype, chatTrimmer); Object.assign(_converse.ChatBoxViews.prototype, chatTrimmer);
_converse.api.promises.add('minimizedChatsInitialized'); api.promises.add('minimizedChatsInitialized');
_converse.MinimizedChatBoxView = View.extend({ _converse.MinimizedChatBoxView = View.extend({
tagName: 'div', tagName: 'div',
...@@ -390,7 +391,7 @@ converse.plugins.add('converse-minimize', { ...@@ -390,7 +391,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.MinimizedChatBoxView } * @type { _converse.MinimizedChatBoxView }
* @example _converse.api.listen.on('minimizedChatViewInitialized', view => { ... }); * @example _converse.api.listen.on('minimizedChatViewInitialized', view => { ... });
*/ */
_converse.api.trigger('minimizedChatViewInitialized', this); api.trigger('minimizedChatViewInitialized', this);
}, },
render () { render () {
...@@ -413,7 +414,7 @@ converse.plugins.add('converse-minimize', { ...@@ -413,7 +414,7 @@ converse.plugins.add('converse-minimize', {
view.close(); view.close();
} else { } else {
this.model.destroy(); this.model.destroy();
_converse.api.trigger('chatBoxClosed', this); api.trigger('chatBoxClosed', this);
} }
return this; return this;
}, },
...@@ -562,17 +563,17 @@ converse.plugins.add('converse-minimize', { ...@@ -562,17 +563,17 @@ converse.plugins.add('converse-minimize', {
* @event _converse#minimizedChatsInitialized * @event _converse#minimizedChatsInitialized
* @example _converse.api.listen.on('minimizedChatsInitialized', () => { ... }); * @example _converse.api.listen.on('minimizedChatsInitialized', () => { ... });
*/ */
_converse.api.trigger('minimizedChatsInitialized'); api.trigger('minimizedChatsInitialized');
} }
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxViewsInitialized', () => initMinimizedChats()); api.listen.on('chatBoxViewsInitialized', () => initMinimizedChats());
_converse.api.listen.on('chatBoxInsertedIntoDOM', view => _converse.chatboxviews.trimChats(view)); api.listen.on('chatBoxInsertedIntoDOM', view => _converse.chatboxviews.trimChats(view));
_converse.api.listen.on('controlBoxOpened', view => _converse.chatboxviews.trimChats(view)); api.listen.on('controlBoxOpened', view => _converse.chatboxviews.trimChats(view));
const debouncedTrimChats = debounce(() => _converse.chatboxviews.trimChats(), 250); const debouncedTrimChats = debounce(() => _converse.chatboxviews.trimChats(), 250);
_converse.api.listen.on('registeredGlobalEventHandlers', () => window.addEventListener("resize", debouncedTrimChats)); api.listen.on('registeredGlobalEventHandlers', () => window.addEventListener("resize", debouncedTrimChats));
_converse.api.listen.on('unregisteredGlobalEventHandlers', () => window.removeEventListener("resize", debouncedTrimChats)); api.listen.on('unregisteredGlobalEventHandlers', () => window.removeEventListener("resize", debouncedTrimChats));
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
} }
}); });
...@@ -90,14 +90,15 @@ converse.plugins.add('converse-muc-views', { ...@@ -90,14 +90,15 @@ converse.plugins.add('converse-muc-views', {
initialize () { initialize () {
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.promises.add(['roomsPanelRendered']); api.promises.add(['roomsPanelRendered']);
// Configuration values for this plugin // Configuration values for this plugin
// ==================================== // ====================================
// Refer to docs/source/configuration.rst for explanations of these // Refer to docs/source/configuration.rst for explanations of these
// configuration settings. // configuration settings.
_converse.api.settings.update({ api.settings.update({
'auto_list_rooms': false, 'auto_list_rooms': false,
'cache_muc_messages': true, 'cache_muc_messages': true,
'locked_muc_nickname': false, 'locked_muc_nickname': false,
...@@ -142,7 +143,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -142,7 +143,7 @@ converse.plugins.add('converse-muc-views', {
* @event _converse#roomsPanelRendered * @event _converse#roomsPanelRendered
* @example _converse.api.listen.on('roomsPanelRendered', () => { ... }); * @example _converse.api.listen.on('roomsPanelRendered', () => { ... });
*/ */
_converse.api.trigger('roomsPanelRendered'); api.trigger('roomsPanelRendered');
return this.roomspanel; return this.roomspanel;
}, },
...@@ -216,7 +217,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -216,7 +217,7 @@ converse.plugins.add('converse-muc-views', {
parent_el.querySelector('a.room-info').classList.remove('selected'); parent_el.querySelector('a.room-info').classList.remove('selected');
} 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) api.disco.info(ev.target.getAttribute('data-room-jid'), null)
.then(stanza => insertRoomInfo(parent_el, stanza)) .then(stanza => insertRoomInfo(parent_el, stanza))
.catch(e => log.error(e)); .catch(e => log.error(e));
} }
...@@ -449,7 +450,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -449,7 +450,7 @@ converse.plugins.add('converse-muc-views', {
const jid = ev.target.getAttribute('data-room-jid'); const jid = ev.target.getAttribute('data-room-jid');
const name = ev.target.getAttribute('data-room-name'); const name = ev.target.getAttribute('data-room-name');
this.modal.hide(); this.modal.hide();
_converse.api.rooms.open(jid, {'name': name}); api.rooms.open(jid, {'name': name});
}, },
toggleRoomInfo (ev) { toggleRoomInfo (ev) {
...@@ -516,7 +517,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -516,7 +517,7 @@ converse.plugins.add('converse-muc-views', {
'from': _converse.connection.jid, 'from': _converse.connection.jid,
'type': "get" 'type': "get"
}).c("query", {xmlns: Strophe.NS.DISCO_ITEMS}); }).c("query", {xmlns: Strophe.NS.DISCO_ITEMS});
_converse.api.sendIQ(iq) api.sendIQ(iq)
.then(iq => this.onRoomsFound(iq)) .then(iq => this.onRoomsFound(iq))
.catch(() => this.informNoRoomsFound()) .catch(() => this.informNoRoomsFound())
}, },
...@@ -606,7 +607,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -606,7 +607,7 @@ converse.plugins.add('converse-muc-views', {
jid = data.jid jid = data.jid
this.model.setDomain(jid); this.model.setDomain(jid);
} }
_converse.api.rooms.open(jid, Object.assign(data, {jid})); api.rooms.open(jid, Object.assign(data, {jid}));
this.modal.hide(); this.modal.hide();
ev.target.reset(); ev.target.reset();
}, },
...@@ -735,7 +736,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -735,7 +736,7 @@ converse.plugins.add('converse-muc-views', {
* @type { _converse.ChatRoomView } * @type { _converse.ChatRoomView }
* @example _converse.api.listen.on('chatRoomViewInitialized', view => { ... }); * @example _converse.api.listen.on('chatRoomViewInitialized', view => { ... });
*/ */
_converse.api.trigger('chatRoomViewInitialized', this); api.trigger('chatRoomViewInitialized', this);
}, },
render () { render () {
...@@ -990,7 +991,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -990,7 +991,7 @@ converse.plugins.add('converse-muc-views', {
if (_converse.show_retraction_warning) { if (_converse.show_retraction_warning) {
messages[1] = retraction_warning; messages[1] = retraction_warning;
} }
const result = await _converse.api.confirm(__('Confirm'), messages); const result = await api.confirm(__('Confirm'), messages);
if (result) { if (result) {
this.retractOwnMessage(message); this.retractOwnMessage(message);
} }
...@@ -1000,7 +1001,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -1000,7 +1001,7 @@ converse.plugins.add('converse-muc-views', {
if (_converse.show_retraction_warning) { if (_converse.show_retraction_warning) {
messages = [messages[0], retraction_warning, messages[1]] messages = [messages[0], retraction_warning, messages[1]]
} }
if (await _converse.api.confirm(__('Confirm'), messages)) { if (await api.confirm(__('Confirm'), messages)) {
this.retractOtherMessage(message); this.retractOtherMessage(message);
} }
} else { } else {
...@@ -1011,7 +1012,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -1011,7 +1012,7 @@ converse.plugins.add('converse-muc-views', {
if (_converse.show_retraction_warning) { if (_converse.show_retraction_warning) {
messages = [messages[0], retraction_warning, messages[1]] messages = [messages[0], retraction_warning, messages[1]]
} }
const reason = await _converse.api.prompt( const reason = await api.prompt(
__('Message Retraction'), __('Message Retraction'),
messages, messages,
__('Optional reason') __('Optional reason')
...@@ -1022,7 +1023,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -1022,7 +1023,7 @@ converse.plugins.add('converse-muc-views', {
} }
} else { } else {
const err_msg = __(`Sorry, you're not allowed to retract this message`); const err_msg = __(`Sorry, you're not allowed to retract this message`);
_converse.api.alert('error', __('Error'), err_msg); api.alert('error', __('Error'), err_msg);
} }
}, },
...@@ -1057,13 +1058,13 @@ converse.plugins.add('converse-muc-views', { ...@@ -1057,13 +1058,13 @@ converse.plugins.add('converse-muc-views', {
const result = await this.model.retractOtherMessage(message, reason); const result = await this.model.retractOtherMessage(message, reason);
if (result === null) { if (result === null) {
const err_msg = __(`A timeout occurred while trying to retract the message`); const err_msg = __(`A timeout occurred while trying to retract the message`);
_converse.api.alert('error', __('Error'), err_msg); api.alert('error', __('Error'), err_msg);
_converse.log(err_msg, Strophe.LogLevel.WARN); log(err_msg, Strophe.LogLevel.WARN);
} else if (u.isErrorStanza(result)) { } else if (u.isErrorStanza(result)) {
const err_msg = __(`Sorry, you're not allowed to retract this message.`); const err_msg = __(`Sorry, you're not allowed to retract this message.`);
_converse.api.alert('error', __('Error'), err_msg); api.alert('error', __('Error'), err_msg);
_converse.log(err_msg, Strophe.LogLevel.WARN); log(err_msg, Strophe.LogLevel.WARN);
_converse.log(result, Strophe.LogLevel.WARN); log(result, Strophe.LogLevel.WARN);
} }
}, },
...@@ -1225,17 +1226,17 @@ converse.plugins.add('converse-muc-views', { ...@@ -1225,17 +1226,17 @@ converse.plugins.add('converse-muc-views', {
}); });
} }
if (!_converse.api.settings.get("singleton")) { if (!api.settings.get("singleton")) {
buttons.push({ buttons.push({
'i18n_text': __('Leave'), 'i18n_text': __('Leave'),
'i18n_title': __('Leave and close this groupchat'), 'i18n_title': __('Leave and close this groupchat'),
'handler': async ev => { 'handler': async ev => {
const messages = [__('Are you sure you want to leave this groupchat?')]; const messages = [__('Are you sure you want to leave this groupchat?')];
const result = await _converse.api.confirm(__('Confirm'), messages); const result = await api.confirm(__('Confirm'), messages);
result && this.close(ev); result && this.close(ev);
}, },
'a_class': 'close-chatbox-button', 'a_class': 'close-chatbox-button',
'standalone': _converse.api.settings.get("view_mode") === 'overlayed', 'standalone': api.settings.get("view_mode") === 'overlayed',
'icon_class': 'fa-sign-out-alt', 'icon_class': 'fa-sign-out-alt',
'name': 'signout' 'name': 'signout'
}); });
...@@ -1547,7 +1548,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -1547,7 +1548,7 @@ converse.plugins.add('converse-muc-views', {
async destroy (reason, new_jid) { async destroy (reason, new_jid) {
const message = [__('Are you sure you want to destroy this groupchat?')]; const message = [__('Are you sure you want to destroy this groupchat?')];
if (await _converse.api.confirm(__('Confirm'), message)) { if (await api.confirm(__('Confirm'), message)) {
return this.model.sendDestroyIQ(reason, new_jid).then(() => this.close()) return this.model.sendDestroyIQ(reason, new_jid).then(() => this.close())
} }
}, },
...@@ -1646,7 +1647,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -1646,7 +1647,7 @@ converse.plugins.add('converse-muc-views', {
this.showErrorMessage(__('Your nickname is "%1$s"', this.model.get('nick'))) this.showErrorMessage(__('Your nickname is "%1$s"', this.model.get('nick')))
} else { } else {
const jid = Strophe.getBareJidFromJid(this.model.get('jid')); const jid = Strophe.getBareJidFromJid(this.model.get('jid'));
_converse.api.send($pres({ api.send($pres({
from: _converse.connection.jid, from: _converse.connection.jid,
to: `${jid}/${args}`, to: `${jid}/${args}`,
id: u.getUniqueId() id: u.getUniqueId()
...@@ -1825,7 +1826,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -1825,7 +1826,7 @@ converse.plugins.add('converse-muc-views', {
if (switch_el) { if (switch_el) {
switch_el.addEventListener('click', async ev => { switch_el.addEventListener('click', async ev => {
ev.preventDefault(); ev.preventDefault();
const room = await _converse.api.rooms.get(moved_jid, null, true); const room = await api.rooms.get(moved_jid, null, true);
room.maybeShow(true); room.maybeShow(true);
this.model.destroy(); this.model.destroy();
}); });
...@@ -2359,8 +2360,8 @@ converse.plugins.add('converse-muc-views', { ...@@ -2359,8 +2360,8 @@ converse.plugins.add('converse-muc-views', {
}); });
} }
} }
_converse.api.waitUntil('discoInitialized').then(() => { api.waitUntil('discoInitialized').then(() => {
_converse.api.listen.on('serviceDiscovered', featureAdded); api.listen.on('serviceDiscovered', featureAdded);
// Features could have been added before the controlbox was // Features could have been added before the controlbox was
// initialized. We're only interested in MUC // initialized. We're only interested in MUC
_converse.disco_entities.each(entity => featureAdded(entity.features.findWhere({'var': Strophe.NS.MUC }))); _converse.disco_entities.each(entity => featureAdded(entity.features.findWhere({'var': Strophe.NS.MUC })));
...@@ -2381,11 +2382,11 @@ converse.plugins.add('converse-muc-views', { ...@@ -2381,11 +2382,11 @@ converse.plugins.add('converse-muc-views', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxViewsInitialized', () => { api.listen.on('chatBoxViewsInitialized', () => {
function openChatRoomFromURIClicked (ev) { function openChatRoomFromURIClicked (ev) {
ev.preventDefault(); ev.preventDefault();
_converse.api.rooms.open(ev.target.href); api.rooms.open(ev.target.href);
} }
_converse.chatboxviews.delegate('click', 'a.open-chatroom', openChatRoomFromURIClicked); _converse.chatboxviews.delegate('click', 'a.open-chatroom', openChatRoomFromURIClicked);
...@@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc-views', {
_converse.chatboxes.on('add', addView); _converse.chatboxes.on('add', addView);
}); });
_converse.api.listen.on('clearSession', () => { api.listen.on('clearSession', () => {
const view = _converse.chatboxviews.get('controlbox'); const view = _converse.chatboxviews.get('controlbox');
if (view && view.roomspanel) { if (view && view.roomspanel) {
view.roomspanel.model.destroy(); view.roomspanel.model.destroy();
...@@ -2411,7 +2412,7 @@ converse.plugins.add('converse-muc-views', { ...@@ -2411,7 +2412,7 @@ converse.plugins.add('converse-muc-views', {
} }
}); });
_converse.api.listen.on('controlBoxInitialized', (view) => { api.listen.on('controlBoxInitialized', (view) => {
if (!_converse.allow_muc) { if (!_converse.allow_muc) {
return; return;
} }
...@@ -2454,10 +2455,10 @@ converse.plugins.add('converse-muc-views', { ...@@ -2454,10 +2455,10 @@ converse.plugins.add('converse-muc-views', {
*/ */
get (jids) { get (jids) {
if (Array.isArray(jids)) { if (Array.isArray(jids)) {
const views = _converse.api.chatviews.get(jids); const views = api.chatviews.get(jids);
return views.filter(v => v.model.get('type') === _converse.CHATROOMS_TYPE) return views.filter(v => v.model.get('type') === _converse.CHATROOMS_TYPE)
} else { } else {
const view = _converse.api.chatviews.get(jids); const view = api.chatviews.get(jids);
if (view.model.get('type') === _converse.CHATROOMS_TYPE) { if (view.model.get('type') === _converse.CHATROOMS_TYPE) {
return view; return view;
} else { } else {
......
...@@ -20,17 +20,18 @@ converse.plugins.add('converse-notification', { ...@@ -20,17 +20,18 @@ converse.plugins.add('converse-notification', {
*/ */
const { _converse } = this; const { _converse } = this;
const { __ } = _converse; const { __ } = _converse;
const { api } = _converse;
_converse.supports_html5_notification = "Notification" in window; _converse.supports_html5_notification = "Notification" in window;
_converse.api.settings.update({ api.settings.update({
notify_all_room_messages: false, notify_all_room_messages: false,
show_desktop_notifications: true, show_desktop_notifications: true,
show_chat_state_notifications: false, show_chat_state_notifications: false,
chatstate_notification_blacklist: [], chatstate_notification_blacklist: [],
// ^ a list of JIDs to ignore concerning chat state notifications // ^ a list of JIDs to ignore concerning chat state notifications
play_sounds: true, play_sounds: true,
sounds_path: _converse.api.settings.get("assets_path")+'/sounds/', sounds_path: api.settings.get("assets_path")+'/sounds/',
notification_icon: 'logo/conversejs-filled.svg', notification_icon: 'logo/conversejs-filled.svg',
notification_delay: 5000 notification_delay: 5000
}); });
...@@ -135,7 +136,7 @@ converse.plugins.add('converse-notification', { ...@@ -135,7 +136,7 @@ converse.plugins.add('converse-notification', {
const full_from_jid = message.getAttribute('from'), const full_from_jid = message.getAttribute('from'),
from_jid = Strophe.getBareJidFromJid(full_from_jid); from_jid = Strophe.getBareJidFromJid(full_from_jid);
if (message.getAttribute('type') === 'headline') { if (message.getAttribute('type') === 'headline') {
if (!from_jid.includes('@') || _converse.api.settings.get("allow_non_roster_messaging")) { if (!from_jid.includes('@') || api.settings.get("allow_non_roster_messaging")) {
title = __("Notification from %1$s", from_jid); title = __("Notification from %1$s", from_jid);
} else { } else {
return; return;
...@@ -154,7 +155,7 @@ converse.plugins.add('converse-notification', { ...@@ -154,7 +155,7 @@ converse.plugins.add('converse-notification', {
if (roster_item !== undefined) { if (roster_item !== undefined) {
title = __("%1$s says", roster_item.getDisplayName()); title = __("%1$s says", roster_item.getDisplayName());
} else { } else {
if (_converse.api.settings.get("allow_non_roster_messaging")) { if (api.settings.get("allow_non_roster_messaging")) {
title = __("%1$s says", from_jid); title = __("%1$s says", from_jid);
} else { } else {
return; return;
...@@ -262,7 +263,7 @@ converse.plugins.add('converse-notification', { ...@@ -262,7 +263,7 @@ converse.plugins.add('converse-notification', {
* @type { XMLElement } * @type { XMLElement }
* @example _converse.api.listen.on('messageNotification', stanza => { ... }); * @example _converse.api.listen.on('messageNotification', stanza => { ... });
*/ */
_converse.api.trigger('messageNotification', message); api.trigger('messageNotification', message);
_converse.playSoundNotification(); _converse.playSoundNotification();
_converse.showMessageNotification(message); _converse.showMessageNotification(message);
}; };
...@@ -286,15 +287,15 @@ converse.plugins.add('converse-notification', { ...@@ -286,15 +287,15 @@ converse.plugins.add('converse-notification', {
} }
}; };
_converse.api.listen.on('pluginsInitialized', function () { api.listen.on('pluginsInitialized', function () {
// We only register event handlers after all plugins are // We only register event handlers after all plugins are
// registered, because other plugins might override some of our // registered, because other plugins might override some of our
// handlers. // handlers.
_converse.api.listen.on('contactRequest', _converse.handleContactRequestNotification); api.listen.on('contactRequest', _converse.handleContactRequestNotification);
_converse.api.listen.on('contactPresenceChanged', _converse.handleChatStateNotification); api.listen.on('contactPresenceChanged', _converse.handleChatStateNotification);
_converse.api.listen.on('message', _converse.handleMessageNotification); api.listen.on('message', _converse.handleMessageNotification);
_converse.api.listen.on('feedback', _converse.handleFeedback); api.listen.on('feedback', _converse.handleFeedback);
_converse.api.listen.on('connected', _converse.requestPermission); api.listen.on('connected', _converse.requestPermission);
}); });
} }
}); });
...@@ -55,8 +55,9 @@ converse.plugins.add("converse-oauth", { ...@@ -55,8 +55,9 @@ converse.plugins.add("converse-oauth", {
render () { render () {
const { _converse } = this.__super__; const { _converse } = this.__super__;
const { api } = _converse;
const result = this.__super__.render.apply(this, arguments); const result = this.__super__.render.apply(this, arguments);
if (_converse.oauth_providers && !_converse.api.settings.get("auto_login")) { if (_converse.oauth_providers && !api.settings.get("auto_login")) {
this.insertOAuthProviders(); this.insertOAuthProviders();
} }
return result; return result;
...@@ -68,10 +69,11 @@ converse.plugins.add("converse-oauth", { ...@@ -68,10 +69,11 @@ converse.plugins.add("converse-oauth", {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this, const { _converse } = this;
{ __ } = _converse; const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({ api.settings.update({
'oauth_providers': {}, 'oauth_providers': {},
}); });
...@@ -79,7 +81,7 @@ converse.plugins.add("converse-oauth", { ...@@ -79,7 +81,7 @@ converse.plugins.add("converse-oauth", {
'sync': function sync () {}, 'sync': function sync () {},
initialize () { initialize () {
_converse.api.settings.get('oauth_providers').forEach(provider => { api.settings.get('oauth_providers').forEach(provider => {
const item = new Model(Object.assign(provider, { const item = new Model(Object.assign(provider, {
'login_text': __('Log in with %1$s', provider.name) 'login_text': __('Log in with %1$s', provider.name)
})); }));
...@@ -102,7 +104,7 @@ converse.plugins.add("converse-oauth", { ...@@ -102,7 +104,7 @@ converse.plugins.add("converse-oauth", {
async fetchOAuthProfileDataAndLogin () { async fetchOAuthProfileDataAndLogin () {
const profile = await this.oauth_service.api('me'); const profile = await this.oauth_service.api('me');
const response = this.oauth_service.getAuthResponse(); const response = this.oauth_service.getAuthResponse();
_converse.api.user.login( api.user.login(
`${profile.name}@${this.provider.get('host')}`, `${profile.name}@${this.provider.get('host')}`,
response.access_token response.access_token
); );
......
...@@ -242,12 +242,13 @@ converse.plugins.add('converse-omemo', { ...@@ -242,12 +242,13 @@ converse.plugins.add('converse-omemo', {
*/ */
const { _converse } = this; const { _converse } = this;
const { __ } = _converse; const { __ } = _converse;
const { api } = _converse;
_converse.api.settings.update({ api.settings.update({
'omemo_default': false, 'omemo_default': false,
}); });
_converse.api.promises.add(['OMEMOInitialized']); api.promises.add(['OMEMOInitialized']);
_converse.NUM_PREKEYS = 100; // Set here so that tests can override _converse.NUM_PREKEYS = 100; // Set here so that tests can override
...@@ -306,7 +307,7 @@ converse.plugins.add('converse-omemo', { ...@@ -306,7 +307,7 @@ converse.plugins.add('converse-omemo', {
}, },
reportDecryptionError (e) { reportDecryptionError (e) {
if (_converse.api.settings.get("loglevel") === 'debug') { if (api.settings.get("loglevel") === 'debug') {
const { __ } = _converse; const { __ } = _converse;
this.createMessage({ this.createMessage({
'message': __("Sorry, could not decrypt a received OMEMO message due to an error.") + ` ${e.name} ${e.message}`, 'message': __("Sorry, could not decrypt a received OMEMO message due to an error.") + ` ${e.name} ${e.message}`,
...@@ -414,10 +415,10 @@ converse.plugins.add('converse-omemo', { ...@@ -414,10 +415,10 @@ converse.plugins.add('converse-omemo', {
err_msgs.push(__("Unable to send an encrypted message due to an unexpected error.")); err_msgs.push(__("Unable to send an encrypted message due to an unexpected error."));
err_msgs.push(e.iq.outerHTML); err_msgs.push(e.iq.outerHTML);
} }
_converse.api.alert('error', __('Error'), err_msgs); api.alert('error', __('Error'), err_msgs);
log.error(e); log.error(e);
} else if (e.user_facing) { } else if (e.user_facing) {
_converse.api.alert('error', __('Error'), [e.message]); api.alert('error', __('Error'), [e.message]);
log.error(e); log.error(e);
} else { } else {
throw e; throw e;
...@@ -471,7 +472,7 @@ converse.plugins.add('converse-omemo', { ...@@ -471,7 +472,7 @@ converse.plugins.add('converse-omemo', {
this.model.contact.getDisplayName() this.model.contact.getDisplayName()
)]; )];
} }
return _converse.api.alert('error', __('Error'), messages); return api.alert('error', __('Error'), messages);
} }
ev.preventDefault(); ev.preventDefault();
this.model.save({'omemo_active': !this.model.get('omemo_active')}); this.model.save({'omemo_active': !this.model.get('omemo_active')});
...@@ -500,7 +501,7 @@ converse.plugins.add('converse-omemo', { ...@@ -500,7 +501,7 @@ converse.plugins.add('converse-omemo', {
} }
async function getDevicesForContact (jid) { async function getDevicesForContact (jid) {
await _converse.api.waitUntil('OMEMOInitialized'); await api.waitUntil('OMEMOInitialized');
const devicelist = _converse.devicelists.get(jid) || _converse.devicelists.create({'jid': jid}); const devicelist = _converse.devicelists.get(jid) || _converse.devicelists.create({'jid': jid});
await devicelist.fetchDevices(); await devicelist.fetchDevices();
return devicelist.devices; return devicelist.devices;
...@@ -828,7 +829,7 @@ converse.plugins.add('converse-omemo', { ...@@ -828,7 +829,7 @@ converse.plugins.add('converse-omemo', {
Object.values(this.get('prekeys')).forEach((prekey, id) => item.c('preKeyPublic', {'preKeyId': id}).t(prekey.pubKey).up()); Object.values(this.get('prekeys')).forEach((prekey, id) => item.c('preKeyPublic', {'preKeyId': id}).t(prekey.pubKey).up());
const options = {'pubsub#access_model': 'open'}; const options = {'pubsub#access_model': 'open'};
return _converse.api.pubsub.publish(null, node, item, options, false); return api.pubsub.publish(null, node, item, options, false);
}, },
async generateMissingPreKeys () { async generateMissingPreKeys () {
...@@ -933,7 +934,7 @@ converse.plugins.add('converse-omemo', { ...@@ -933,7 +934,7 @@ converse.plugins.add('converse-omemo', {
let iq; let iq;
try { try {
iq = await _converse.api.sendIQ(stanza) iq = await api.sendIQ(stanza)
} catch (iq) { } catch (iq) {
throw new IQError("Could not fetch bundle", iq); throw new IQError("Could not fetch bundle", iq);
} }
...@@ -1037,7 +1038,7 @@ converse.plugins.add('converse-omemo', { ...@@ -1037,7 +1038,7 @@ converse.plugins.add('converse-omemo', {
let iq; let iq;
try { try {
iq = await _converse.api.sendIQ(stanza); iq = await api.sendIQ(stanza);
} catch (e) { } catch (e) {
log.error(e); log.error(e);
return []; return [];
...@@ -1054,7 +1055,7 @@ converse.plugins.add('converse-omemo', { ...@@ -1054,7 +1055,7 @@ converse.plugins.add('converse-omemo', {
const item = $build('item').c('list', {'xmlns': Strophe.NS.OMEMO}) const item = $build('item').c('list', {'xmlns': Strophe.NS.OMEMO})
this.devices.filter(d => d.get('active')).forEach(d => item.c('device', {'id': d.get('id')}).up()); this.devices.filter(d => d.get('active')).forEach(d => item.c('device', {'id': d.get('id')}).up());
const options = {'pubsub#access_model': 'open'}; const options = {'pubsub#access_model': 'open'};
return _converse.api.pubsub.publish(null, Strophe.NS.OMEMO_DEVICELIST, item, options, false); return api.pubsub.publish(null, Strophe.NS.OMEMO_DEVICELIST, item, options, false);
}, },
removeOwnDevices (device_ids) { removeOwnDevices (device_ids) {
...@@ -1193,7 +1194,7 @@ converse.plugins.add('converse-omemo', { ...@@ -1193,7 +1194,7 @@ converse.plugins.add('converse-omemo', {
* @event _converse#OMEMOInitialized * @event _converse#OMEMOInitialized
* @example _converse.api.listen.on('OMEMOInitialized', () => { ... }); * @example _converse.api.listen.on('OMEMOInitialized', () => { ... });
*/ */
_converse.api.trigger('OMEMOInitialized'); api.trigger('OMEMOInitialized');
} }
async function onOccupantAdded (chatroom, occupant) { async function onOccupantAdded (chatroom, occupant) {
...@@ -1216,20 +1217,20 @@ converse.plugins.add('converse-omemo', { ...@@ -1216,20 +1217,20 @@ converse.plugins.add('converse-omemo', {
async function checkOMEMOSupported (chatbox) { async function checkOMEMOSupported (chatbox) {
let supported; let supported;
if (chatbox.get('type') === _converse.CHATROOMS_TYPE) { if (chatbox.get('type') === _converse.CHATROOMS_TYPE) {
await _converse.api.waitUntil('OMEMOInitialized'); await api.waitUntil('OMEMOInitialized');
supported = chatbox.features.get('nonanonymous') && chatbox.features.get('membersonly'); supported = chatbox.features.get('nonanonymous') && chatbox.features.get('membersonly');
} else if (chatbox.get('type') === _converse.PRIVATE_CHAT_TYPE) { } else if (chatbox.get('type') === _converse.PRIVATE_CHAT_TYPE) {
supported = await _converse.contactHasOMEMOSupport(chatbox.get('jid')); supported = await _converse.contactHasOMEMOSupport(chatbox.get('jid'));
} }
chatbox.set('omemo_supported', supported); chatbox.set('omemo_supported', supported);
if (supported && _converse.api.settings.get('omemo_default')) { if (supported && api.settings.get('omemo_default')) {
chatbox.set('omemo_active', true); chatbox.set('omemo_active', true);
} }
} }
/******************** Event Handlers ********************/ /******************** Event Handlers ********************/
_converse.api.waitUntil('chatBoxesInitialized').then(() => api.waitUntil('chatBoxesInitialized').then(() =>
_converse.chatboxes.on('add', chatbox => { _converse.chatboxes.on('add', chatbox => {
checkOMEMOSupported(chatbox); checkOMEMOSupported(chatbox);
if (chatbox.get('type') === _converse.CHATROOMS_TYPE) { if (chatbox.get('type') === _converse.CHATROOMS_TYPE) {
...@@ -1239,24 +1240,24 @@ converse.plugins.add('converse-omemo', { ...@@ -1239,24 +1240,24 @@ converse.plugins.add('converse-omemo', {
}) })
); );
_converse.api.listen.on('connected', registerPEPPushHandler); api.listen.on('connected', registerPEPPushHandler);
_converse.api.listen.on('renderToolbar', view => view.renderOMEMOToolbarButton()); api.listen.on('renderToolbar', view => view.renderOMEMOToolbarButton());
_converse.api.listen.on('statusInitialized', initOMEMO); api.listen.on('statusInitialized', initOMEMO);
_converse.api.listen.on('addClientFeatures', api.listen.on('addClientFeatures',
() => _converse.api.disco.own.features.add(`${Strophe.NS.OMEMO_DEVICELIST}+notify`)); () => api.disco.own.features.add(`${Strophe.NS.OMEMO_DEVICELIST}+notify`));
_converse.api.listen.on('userDetailsModalInitialized', (contact) => { api.listen.on('userDetailsModalInitialized', (contact) => {
const jid = contact.get('jid'); const jid = contact.get('jid');
_converse.generateFingerprints(jid).catch(e => log.error(e)); _converse.generateFingerprints(jid).catch(e => log.error(e));
}); });
_converse.api.listen.on('profileModalInitialized', () => { api.listen.on('profileModalInitialized', () => {
_converse.generateFingerprints(_converse.bare_jid).catch(e => log.error(e)); _converse.generateFingerprints(_converse.bare_jid).catch(e => log.error(e));
}); });
_converse.api.listen.on('afterTearDown', () => (delete _converse.omemo_store)); api.listen.on('afterTearDown', () => (delete _converse.omemo_store));
_converse.api.listen.on('clearSession', () => { api.listen.on('clearSession', () => {
if (_converse.shouldClearCache() && _converse.devicelists) { if (_converse.shouldClearCache() && _converse.devicelists) {
_converse.devicelists.clearStore(); _converse.devicelists.clearStore();
delete _converse.devicelists; delete _converse.devicelists;
......
...@@ -27,10 +27,11 @@ converse.plugins.add('converse-profile', { ...@@ -27,10 +27,11 @@ converse.plugins.add('converse-profile', {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this, const { _converse } = this;
{ __ } = _converse; const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({ api.settings.update({
'show_client_info': true 'show_client_info': true
}); });
...@@ -52,7 +53,7 @@ converse.plugins.add('converse-profile', { ...@@ -52,7 +53,7 @@ converse.plugins.add('converse-profile', {
* @type { _converse.XMPPStatus } * @type { _converse.XMPPStatus }
* @example _converse.api.listen.on('profileModalInitialized', status => { ... }); * @example _converse.api.listen.on('profileModalInitialized', status => { ... });
*/ */
_converse.api.trigger('profileModalInitialized', this.model); api.trigger('profileModalInitialized', this.model);
}, },
toHTML () { toHTML () {
...@@ -84,11 +85,11 @@ converse.plugins.add('converse-profile', { ...@@ -84,11 +85,11 @@ converse.plugins.add('converse-profile', {
}, },
setVCard (data) { setVCard (data) {
_converse.api.vcard.set(_converse.bare_jid, data) api.vcard.set(_converse.bare_jid, data)
.then(() => _converse.api.vcard.update(this.model.vcard, true)) .then(() => api.vcard.update(this.model.vcard, true))
.catch((err) => { .catch((err) => {
log.fatal(err); log.fatal(err);
_converse.api.show('error', __('Error'), [ api.show('error', __('Error'), [
__("Sorry, an error happened while trying to save your profile data."), __("Sorry, an error happened while trying to save your profile data."),
__("You can check your browser's developer console for any error output.") __("You can check your browser's developer console for any error output.")
]); ]);
...@@ -251,7 +252,7 @@ converse.plugins.add('converse-profile', { ...@@ -251,7 +252,7 @@ converse.plugins.add('converse-profile', {
ev.preventDefault(); ev.preventDefault();
const result = confirm(__("Are you sure you want to log out?")); const result = confirm(__("Are you sure you want to log out?"));
if (result === true) { if (result === true) {
_converse.api.user.logout(); api.user.logout();
} }
}, },
...@@ -274,8 +275,8 @@ converse.plugins.add('converse-profile', { ...@@ -274,8 +275,8 @@ converse.plugins.add('converse-profile', {
/******************** Event Handlers ********************/ /******************** Event Handlers ********************/
_converse.api.listen.on('controlBoxPaneInitialized', async view => { api.listen.on('controlBoxPaneInitialized', async view => {
await _converse.api.waitUntil('VCardsInitialized'); await api.waitUntil('VCardsInitialized');
_converse.xmppstatusview = new _converse.XMPPStatusView({'model': _converse.xmppstatus}); _converse.xmppstatusview = new _converse.XMPPStatusView({'model': _converse.xmppstatus});
view.el.insertAdjacentElement('afterBegin', _converse.xmppstatusview.render().el); view.el.insertAdjacentElement('afterBegin', _converse.xmppstatusview.render().el);
}); });
......
...@@ -22,8 +22,9 @@ converse.plugins.add('converse-push', { ...@@ -22,8 +22,9 @@ converse.plugins.add('converse-push', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({ api.settings.update({
'push_app_servers': [], 'push_app_servers': [],
'enable_muc_push': false 'enable_muc_push': false
}); });
...@@ -32,7 +33,7 @@ converse.plugins.add('converse-push', { ...@@ -32,7 +33,7 @@ converse.plugins.add('converse-push', {
if (!push_app_server.jid) { if (!push_app_server.jid) {
return; return;
} }
if (!(await _converse.api.disco.supports(Strophe.NS.PUSH, domain || _converse.bare_jid))) { if (!(await api.disco.supports(Strophe.NS.PUSH, domain || _converse.bare_jid))) {
log.warn(`Not disabling push app server "${push_app_server.jid}", no disco support from your server.`); log.warn(`Not disabling push app server "${push_app_server.jid}", no disco support from your server.`);
return; return;
} }
...@@ -47,7 +48,7 @@ converse.plugins.add('converse-push', { ...@@ -47,7 +48,7 @@ converse.plugins.add('converse-push', {
if (push_app_server.node) { if (push_app_server.node) {
stanza.attrs({'node': push_app_server.node}); stanza.attrs({'node': push_app_server.node});
} }
_converse.api.sendIQ(stanza) api.sendIQ(stanza)
.catch(e => { .catch(e => {
log.error(`Could not disable push app server for ${push_app_server.jid}`); log.error(`Could not disable push app server for ${push_app_server.jid}`);
log.error(e); log.error(e);
...@@ -58,15 +59,15 @@ converse.plugins.add('converse-push', { ...@@ -58,15 +59,15 @@ converse.plugins.add('converse-push', {
if (!push_app_server.jid || !push_app_server.node) { if (!push_app_server.jid || !push_app_server.node) {
return; return;
} }
const identity = await _converse.api.disco.getIdentity('pubsub', 'push', push_app_server.jid); const identity = await api.disco.getIdentity('pubsub', 'push', push_app_server.jid);
if (!identity) { if (!identity) {
return log.warn( return log.warn(
`Not enabling push the service "${push_app_server.jid}", it doesn't have the right disco identtiy.` `Not enabling push the service "${push_app_server.jid}", it doesn't have the right disco identtiy.`
); );
} }
const result = await Promise.all([ const result = await Promise.all([
_converse.api.disco.supports(Strophe.NS.PUSH, push_app_server.jid), api.disco.supports(Strophe.NS.PUSH, push_app_server.jid),
_converse.api.disco.supports(Strophe.NS.PUSH, domain) api.disco.supports(Strophe.NS.PUSH, domain)
]); ]);
if (!result[0] && !result[1]) { if (!result[0] && !result[1]) {
log.warn(`Not enabling push app server "${push_app_server.jid}", no disco support from your server.`); log.warn(`Not enabling push app server "${push_app_server.jid}", no disco support from your server.`);
...@@ -88,7 +89,7 @@ converse.plugins.add('converse-push', { ...@@ -88,7 +89,7 @@ converse.plugins.add('converse-push', {
.c('field', {'var': 'secret'}) .c('field', {'var': 'secret'})
.c('value').t(push_app_server.secret); .c('value').t(push_app_server.secret);
} }
return _converse.api.sendIQ(stanza); return api.sendIQ(stanza);
} }
async function enablePush (domain) { async function enablePush (domain) {
...@@ -97,8 +98,8 @@ converse.plugins.add('converse-push', { ...@@ -97,8 +98,8 @@ converse.plugins.add('converse-push', {
if (push_enabled.includes(domain)) { if (push_enabled.includes(domain)) {
return; return;
} }
const enabled_services = reject(_converse.api.settings.get('push_app_servers'), 'disable'); const enabled_services = reject(api.settings.get('push_app_servers'), 'disable');
const disabled_services = filter(_converse.api.settings.get('push_app_servers'), 'disable'); const disabled_services = filter(api.settings.get('push_app_servers'), 'disable');
const enabled = enabled_services.map(s => enablePushAppServer(domain, s)); const enabled = enabled_services.map(s => enablePushAppServer(domain, s));
const disabled = disabled_services.map(s => disablePushAppServer(domain, s)); const disabled = disabled_services.map(s => disablePushAppServer(domain, s));
try { try {
...@@ -111,15 +112,15 @@ converse.plugins.add('converse-push', { ...@@ -111,15 +112,15 @@ converse.plugins.add('converse-push', {
} }
_converse.session.save('push_enabled', push_enabled); _converse.session.save('push_enabled', push_enabled);
} }
_converse.api.listen.on('statusInitialized', () => enablePush()); api.listen.on('statusInitialized', () => enablePush());
function onChatBoxAdded (model) { function onChatBoxAdded (model) {
if (model.get('type') == _converse.CHATROOMS_TYPE) { if (model.get('type') == _converse.CHATROOMS_TYPE) {
enablePush(Strophe.getDomainFromJid(model.get('jid'))); enablePush(Strophe.getDomainFromJid(model.get('jid')));
} }
} }
if (_converse.api.settings.get('enable_muc_push')) { if (api.settings.get('enable_muc_push')) {
_converse.api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded)); api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded));
} }
} }
}); });
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
* @license Mozilla Public License (MPLv2) * @license Mozilla Public License (MPLv2)
*/ */
import "converse-controlbox"; import "converse-controlbox";
import { __ } from '@converse/headless/i18n';
import { View } from "skeletor.js/src/view"; import { View } from "skeletor.js/src/view";
import { pick } from "lodash"; import { pick } from "lodash";
import converse from "@converse/headless/converse-core"; import converse from "@converse/headless/converse-core";
...@@ -63,15 +64,15 @@ converse.plugins.add('converse-register', { ...@@ -63,15 +64,15 @@ converse.plugins.add('converse-register', {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this, const { _converse } = this;
{ __ } = _converse; const { api } = _converse;
_converse.CONNECTION_STATUS[Strophe.Status.REGIFAIL] = 'REGIFAIL'; _converse.CONNECTION_STATUS[Strophe.Status.REGIFAIL] = 'REGIFAIL';
_converse.CONNECTION_STATUS[Strophe.Status.REGISTERED] = 'REGISTERED'; _converse.CONNECTION_STATUS[Strophe.Status.REGISTERED] = 'REGISTERED';
_converse.CONNECTION_STATUS[Strophe.Status.CONFLICT] = 'CONFLICT'; _converse.CONNECTION_STATUS[Strophe.Status.CONFLICT] = 'CONFLICT';
_converse.CONNECTION_STATUS[Strophe.Status.NOTACCEPTABLE] = 'NOTACCEPTABLE'; _converse.CONNECTION_STATUS[Strophe.Status.NOTACCEPTABLE] = 'NOTACCEPTABLE';
_converse.api.settings.update({ api.settings.update({
'allow_registration': true, 'allow_registration': true,
'domain_placeholder': __(" e.g. conversejs.org"), // Placeholder text shown in the domain input on the registration form 'domain_placeholder': __(" e.g. conversejs.org"), // Placeholder text shown in the domain input on the registration form
'providers_link': 'https://compliance.conversations.im/', // Link to XMPP providers shown on registration page 'providers_link': 'https://compliance.conversations.im/', // Link to XMPP providers shown on registration page
...@@ -95,7 +96,7 @@ converse.plugins.add('converse-register', { ...@@ -95,7 +96,7 @@ converse.plugins.add('converse-register', {
}, },
renderRegistrationPanel () { renderRegistrationPanel () {
if (_converse.api.settings.get('allow_registration')) { if (api.settings.get('allow_registration')) {
this.registerpanel = new _converse.RegisterPanel({ this.registerpanel = new _converse.RegisterPanel({
'model': this.model 'model': this.model
}); });
...@@ -113,7 +114,7 @@ converse.plugins.add('converse-register', { ...@@ -113,7 +114,7 @@ converse.plugins.add('converse-register', {
function setActiveForm (value) { function setActiveForm (value) {
_converse.api.waitUntil('controlBoxInitialized').then(() => { api.waitUntil('controlBoxInitialized').then(() => {
const controlbox = _converse.chatboxes.get('controlbox') const controlbox = _converse.chatboxes.get('controlbox')
controlbox.set({'active-form': value}); controlbox.set({'active-form': value});
}).catch(e => log.fatal(e)); }).catch(e => log.fatal(e));
...@@ -138,22 +139,22 @@ converse.plugins.add('converse-register', { ...@@ -138,22 +139,22 @@ converse.plugins.add('converse-register', {
initialize () { initialize () {
this.reset(); this.reset();
_converse.api.listen.on('connectionInitialized', () => this.registerHooks()); api.listen.on('connectionInitialized', () => this.registerHooks());
}, },
render () { render () {
this.model.set('registration_form_rendered', false); this.model.set('registration_form_rendered', false);
this.el.innerHTML = tpl_register_panel({ this.el.innerHTML = tpl_register_panel({
'__': __, '__': __,
'default_domain': _converse.api.settings.get('registration_domain'), 'default_domain': api.settings.get('registration_domain'),
'label_register': __('Fetch registration form'), 'label_register': __('Fetch registration form'),
'help_providers': __('Tip: A list of public XMPP providers is available'), 'help_providers': __('Tip: A list of public XMPP providers is available'),
'help_providers_link': __('here'), 'help_providers_link': __('here'),
'href_providers': _converse.api.settings.get('providers_link'), 'href_providers': api.settings.get('providers_link'),
'domain_placeholder': _converse.api.settings.get('domain_placeholder') 'domain_placeholder': api.settings.get('domain_placeholder')
}); });
if (_converse.api.settings.get('registration_domain')) { if (api.settings.get('registration_domain')) {
this.fetchRegistrationForm(_converse.api.settings.get('registration_domain')); this.fetchRegistrationForm(api.settings.get('registration_domain'));
} }
return this; return this;
}, },
...@@ -324,7 +325,7 @@ converse.plugins.add('converse-register', { ...@@ -324,7 +325,7 @@ converse.plugins.add('converse-register', {
'beforeend', 'beforeend',
tpl_registration_request({ tpl_registration_request({
'__': _converse.__, '__': _converse.__,
'cancel': _converse.api.settings.get('registration_domain'), 'cancel': api.settings.get('registration_domain'),
}) })
); );
}, },
...@@ -447,11 +448,11 @@ converse.plugins.add('converse-register', { ...@@ -447,11 +448,11 @@ converse.plugins.add('converse-register', {
renderRegistrationForm (stanza) { renderRegistrationForm (stanza) {
const form = this.el.querySelector('form'); const form = this.el.querySelector('form');
form.innerHTML = tpl_registration_form({ form.innerHTML = tpl_registration_form({
'__': _converse.__, '__': __,
'domain': this.domain, 'domain': this.domain,
'title': this.title, 'title': this.title,
'instructions': this.instructions, 'instructions': this.instructions,
'registration_domain': _converse.api.settings.get('registration_domain') 'registration_domain': api.settings.get('registration_domain')
}); });
const buttons = form.querySelector('fieldset.buttons'); const buttons = form.querySelector('fieldset.buttons');
...@@ -522,9 +523,9 @@ converse.plugins.add('converse-register', { ...@@ -522,9 +523,9 @@ converse.plugins.add('converse-register', {
_converse.connection._proto._abortAllRequests(); _converse.connection._proto._abortAllRequests();
_converse.connection.reset(); _converse.connection.reset();
if (this.model.get('registration_form_rendered')) { if (this.model.get('registration_form_rendered')) {
if (_converse.api.settings.get('registration_domain') && this.model.get('registration_form_rendered')) { if (api.settings.get('registration_domain') && this.model.get('registration_form_rendered')) {
this.fetchRegistrationForm( this.fetchRegistrationForm(
_converse.api.settings.get('registration_domain') api.settings.get('registration_domain')
); );
} }
} else { } else {
...@@ -645,7 +646,7 @@ converse.plugins.add('converse-register', { ...@@ -645,7 +646,7 @@ converse.plugins.add('converse-register', {
}); });
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('controlBoxInitialized', view => { api.listen.on('controlBoxInitialized', view => {
view.model.on('change:active-form', view.showLoginOrRegisterForm, view); view.model.on('change:active-form', view.showLoginOrRegisterForm, view);
}); });
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
......
...@@ -38,9 +38,10 @@ converse.plugins.add('converse-roomslist', { ...@@ -38,9 +38,10 @@ converse.plugins.add('converse-roomslist', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
// Promises exposed by this plugin // Promises exposed by this plugin
_converse.api.promises.add('roomsListInitialized'); api.promises.add('roomsListInitialized');
_converse.RoomsList = Model.extend({ _converse.RoomsList = Model.extend({
...@@ -121,8 +122,8 @@ converse.plugins.add('converse-roomslist', { ...@@ -121,8 +122,8 @@ converse.plugins.add('converse-roomslist', {
const data = { const data = {
'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid 'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid
} }
await _converse.api.rooms.open(jid, data, true); await api.rooms.open(jid, data, true);
_converse.api.chatviews.get(jid).maybeFocus(); api.chatviews.get(jid).maybeFocus();
}, },
closeRoom (ev) { closeRoom (ev) {
...@@ -164,22 +165,22 @@ converse.plugins.add('converse-roomslist', { ...@@ -164,22 +165,22 @@ converse.plugins.add('converse-roomslist', {
* @event _converse#roomsListInitialized * @event _converse#roomsListInitialized
* @example _converse.api.listen.on('roomsListInitialized', status => { ... }); * @example _converse.api.listen.on('roomsListInitialized', status => { ... });
*/ */
_converse.api.trigger('roomsListInitialized'); api.trigger('roomsListInitialized');
}; };
_converse.api.listen.on('connected', async () => { api.listen.on('connected', async () => {
if (_converse.allow_bookmarks) { if (_converse.allow_bookmarks) {
await _converse.api.waitUntil('bookmarksInitialized'); await api.waitUntil('bookmarksInitialized');
} else { } else {
await Promise.all([ await Promise.all([
_converse.api.waitUntil('chatBoxesFetched'), api.waitUntil('chatBoxesFetched'),
_converse.api.waitUntil('roomsPanelRendered') api.waitUntil('roomsPanelRendered')
]); ]);
} }
initRoomsListView(); initRoomsListView();
}); });
_converse.api.listen.on('reconnected', initRoomsListView); api.listen.on('reconnected', initRoomsListView);
} }
}); });
...@@ -33,10 +33,11 @@ converse.plugins.add('converse-rosterview', { ...@@ -33,10 +33,11 @@ converse.plugins.add('converse-rosterview', {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this, const { _converse } = this;
{ __ } = _converse; const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({ api.settings.update({
'autocomplete_add_contact': true, 'autocomplete_add_contact': true,
'allow_chat_pending_contacts': true, 'allow_chat_pending_contacts': true,
'allow_contact_removal': true, 'allow_contact_removal': true,
...@@ -44,7 +45,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -44,7 +45,7 @@ converse.plugins.add('converse-rosterview', {
'roster_groups': true, 'roster_groups': true,
'xhr_user_search_url': null, 'xhr_user_search_url': null,
}); });
_converse.api.promises.add('rosterViewInitialized'); api.promises.add('rosterViewInitialized');
const STATUSES = { const STATUSES = {
'dnd': __('This contact is busy'), 'dnd': __('This contact is busy'),
...@@ -68,7 +69,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -68,7 +69,7 @@ converse.plugins.add('converse-rosterview', {
}, },
toHTML () { toHTML () {
const label_nickname = _converse.api.settings.get('xhr_user_search_url') ? __('Contact name') : __('Optional nickname'); const label_nickname = api.settings.get('xhr_user_search_url') ? __('Contact name') : __('Optional nickname');
return tpl_add_contact_modal(Object.assign(this.model.toJSON(), { return tpl_add_contact_modal(Object.assign(this.model.toJSON(), {
'_converse': _converse, '_converse': _converse,
'label_nickname': label_nickname, 'label_nickname': label_nickname,
...@@ -76,7 +77,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -76,7 +77,7 @@ converse.plugins.add('converse-rosterview', {
}, },
afterRender () { afterRender () {
if (_converse.api.settings.get('xhr_user_search_url') && isString(_converse.api.settings.get('xhr_user_search_url'))) { if (api.settings.get('xhr_user_search_url') && isString(api.settings.get('xhr_user_search_url'))) {
this.initXHRAutoComplete(); this.initXHRAutoComplete();
} else { } else {
this.initJIDAutoComplete(); this.initJIDAutoComplete();
...@@ -86,7 +87,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -86,7 +87,7 @@ converse.plugins.add('converse-rosterview', {
}, },
initJIDAutoComplete () { initJIDAutoComplete () {
if (!_converse.api.settings.get('autocomplete_add_contact')) { if (!api.settings.get('autocomplete_add_contact')) {
return; return;
} }
const el = this.el.querySelector('.suggestion-box__jid').parentElement; const el = this.el.querySelector('.suggestion-box__jid').parentElement;
...@@ -98,7 +99,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -98,7 +99,7 @@ converse.plugins.add('converse-rosterview', {
}, },
initXHRAutoComplete () { initXHRAutoComplete () {
if (!_converse.api.settings.get('autocomplete_add_contact')) { if (!api.settings.get('autocomplete_add_contact')) {
return this.initXHRFetch(); return this.initXHRFetch();
} }
const el = this.el.querySelector('.suggestion-box__name').parentElement; const el = this.el.querySelector('.suggestion-box__name').parentElement;
...@@ -119,7 +120,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -119,7 +120,7 @@ converse.plugins.add('converse-rosterview', {
}; };
const input_el = this.el.querySelector('input[name="name"]'); const input_el = this.el.querySelector('input[name="name"]');
input_el.addEventListener('input', debounce(() => { input_el.addEventListener('input', debounce(() => {
xhr.open("GET", `${_converse.api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true); xhr.open("GET", `${api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
xhr.send() xhr.send()
} , 300)); } , 300));
this.name_auto_complete.on('suggestion-box-selectcomplete', ev => { this.name_auto_complete.on('suggestion-box-selectcomplete', ev => {
...@@ -176,9 +177,9 @@ converse.plugins.add('converse-rosterview', { ...@@ -176,9 +177,9 @@ converse.plugins.add('converse-rosterview', {
const data = new FormData(ev.target), const data = new FormData(ev.target),
jid = (data.get('jid') || '').trim(); jid = (data.get('jid') || '').trim();
if (!jid && _converse.api.settings.get('xhr_user_search_url') && isString(_converse.api.settings.get('xhr_user_search_url'))) { if (!jid && api.settings.get('xhr_user_search_url') && isString(api.settings.get('xhr_user_search_url'))) {
const input_el = this.el.querySelector('input[name="name"]'); const input_el = this.el.querySelector('input[name="name"]');
this.xhr.open("GET", `${_converse.api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true); this.xhr.open("GET", `${api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
this.xhr.send() this.xhr.send()
return; return;
} }
...@@ -357,7 +358,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -357,7 +358,7 @@ converse.plugins.add('converse-rosterview', {
Object.assign(this.model.toJSON(), { Object.assign(this.model.toJSON(), {
display_name, display_name,
'desc_remove': __('Click to remove %1$s as a contact', display_name), 'desc_remove': __('Click to remove %1$s as a contact', display_name),
'allow_chat_pending_contacts': _converse.api.settings.get('allow_chat_pending_contacts') 'allow_chat_pending_contacts': api.settings.get('allow_chat_pending_contacts')
}) })
); );
} else if (requesting === true) { } else if (requesting === true) {
...@@ -368,7 +369,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -368,7 +369,7 @@ converse.plugins.add('converse-rosterview', {
display_name, display_name,
'desc_accept': __("Click to accept the contact request from %1$s", display_name), 'desc_accept': __("Click to accept the contact request from %1$s", display_name),
'desc_decline': __("Click to decline the contact request from %1$s", display_name), 'desc_decline': __("Click to decline the contact request from %1$s", display_name),
'allow_chat_pending_contacts': _converse.api.settings.get('allow_chat_pending_contacts') 'allow_chat_pending_contacts': api.settings.get('allow_chat_pending_contacts')
}) })
); );
} else if (subscription === 'both' || subscription === 'to' || _converse.rosterview.isSelf(jid)) { } else if (subscription === 'both' || subscription === 'to' || _converse.rosterview.isSelf(jid)) {
...@@ -419,7 +420,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -419,7 +420,7 @@ converse.plugins.add('converse-rosterview', {
'desc_status': STATUSES[show], 'desc_status': STATUSES[show],
'desc_chat': __('Click to chat with %1$s (JID: %2$s)', display_name, item.get('jid')), 'desc_chat': __('Click to chat with %1$s (JID: %2$s)', display_name, item.get('jid')),
'desc_remove': __('Click to remove %1$s as a contact', display_name), 'desc_remove': __('Click to remove %1$s as a contact', display_name),
'allow_contact_removal': _converse.api.settings.get('allow_contact_removal'), 'allow_contact_removal': api.settings.get('allow_contact_removal'),
'num_unread': item.get('num_unread') || 0, 'num_unread': item.get('num_unread') || 0,
classes: '' classes: ''
}) })
...@@ -438,7 +439,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -438,7 +439,7 @@ converse.plugins.add('converse-rosterview', {
*/ */
mayBeShown () { mayBeShown () {
const chatStatus = this.model.presence.get('show'); const chatStatus = this.model.presence.get('show');
if (_converse.api.settings.get('hide_offline_users') && chatStatus === 'offline') { if (api.settings.get('hide_offline_users') && chatStatus === 'offline') {
// If pending or requesting, show // If pending or requesting, show
if ((this.model.get('ask') === 'subscribe') || if ((this.model.get('ask') === 'subscribe') ||
(this.model.get('subscription') === 'from') || (this.model.get('subscription') === 'from') ||
...@@ -453,12 +454,12 @@ converse.plugins.add('converse-rosterview', { ...@@ -453,12 +454,12 @@ converse.plugins.add('converse-rosterview', {
openChat (ev) { openChat (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
const attrs = this.model.attributes; const attrs = this.model.attributes;
_converse.api.chats.open(attrs.jid, attrs, true); api.chats.open(attrs.jid, attrs, true);
}, },
async removeContact (ev) { async removeContact (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
if (!_converse.api.settings.get('allow_contact_removal')) { return; } if (!api.settings.get('allow_contact_removal')) { return; }
if (!confirm(__("Are you sure you want to remove this contact?"))) { return; } if (!confirm(__("Are you sure you want to remove this contact?"))) { return; }
try { try {
...@@ -471,7 +472,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -471,7 +472,7 @@ converse.plugins.add('converse-rosterview', {
} }
} catch (e) { } catch (e) {
log.error(e); log.error(e);
_converse.api.alert('error', __('Error'), api.alert('error', __('Error'),
[__('Sorry, there was an error while trying to remove %1$s as a contact.', this.model.getDisplayName())] [__('Sorry, there was an error while trying to remove %1$s as a contact.', this.model.getDisplayName())]
); );
} }
...@@ -744,9 +745,9 @@ converse.plugins.add('converse-rosterview', { ...@@ -744,9 +745,9 @@ converse.plugins.add('converse-rosterview', {
// just this group's) have been fetched from browser // just this group's) have been fetched from browser
// storage or the XMPP server and once they've been // storage or the XMPP server and once they've been
// assigned to their various groups. // assigned to their various groups.
_converse.api.listen.on('rosterGroupsFetched', this.sortAndPositionAllItems.bind(this)); api.listen.on('rosterGroupsFetched', this.sortAndPositionAllItems.bind(this));
_converse.api.listen.on('rosterContactsFetched', () => { api.listen.on('rosterContactsFetched', () => {
_converse.roster.each(contact => this.addRosterContact(contact, {'silent': true})); _converse.roster.each(contact => this.addRosterContact(contact, {'silent': true}));
this.update(); this.update();
this.updateFilter(); this.updateFilter();
...@@ -892,7 +893,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -892,7 +893,7 @@ converse.plugins.add('converse-rosterview', {
addExistingContact (contact, options) { addExistingContact (contact, options) {
let groups; let groups;
if (_converse.api.settings.get('roster_groups')) { if (api.settings.get('roster_groups')) {
groups = contact.get('groups'); groups = contact.get('groups');
groups = (groups.length === 0) ? [_converse.HEADER_UNGROUPED] : groups; groups = (groups.length === 0) ? [_converse.HEADER_UNGROUPED] : groups;
} else { } else {
...@@ -931,7 +932,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -931,7 +932,7 @@ converse.plugins.add('converse-rosterview', {
}); });
/* -------- Event Handlers ----------- */ /* -------- Event Handlers ----------- */
_converse.api.listen.on('chatBoxesInitialized', () => { api.listen.on('chatBoxesInitialized', () => {
function highlightRosterItem (chatbox) { function highlightRosterItem (chatbox) {
const contact = _converse.roster && _converse.roster.findWhere({'jid': chatbox.get('jid')}); const contact = _converse.roster && _converse.roster.findWhere({'jid': chatbox.get('jid')});
if (contact !== undefined) { if (contact !== undefined) {
...@@ -943,13 +944,13 @@ converse.plugins.add('converse-rosterview', { ...@@ -943,13 +944,13 @@ converse.plugins.add('converse-rosterview', {
}); });
_converse.api.listen.on('controlBoxInitialized', (view) => { api.listen.on('controlBoxInitialized', (view) => {
function insertRoster () { function insertRoster () {
if (!view.model.get('connected') || _converse.api.settings.get("authentication") === _converse.ANONYMOUS) { if (!view.model.get('connected') || api.settings.get("authentication") === _converse.ANONYMOUS) {
return; return;
} }
/* Place the rosterview inside the "Contacts" panel. */ /* Place the rosterview inside the "Contacts" panel. */
_converse.api.waitUntil('rosterViewInitialized') api.waitUntil('rosterViewInitialized')
.then(() => view.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el)) .then(() => view.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el))
.catch(e => log.fatal(e)); .catch(e => log.fatal(e));
} }
...@@ -962,7 +963,7 @@ converse.plugins.add('converse-rosterview', { ...@@ -962,7 +963,7 @@ converse.plugins.add('converse-rosterview', {
/* Create an instance of RosterView once the RosterGroups /* Create an instance of RosterView once the RosterGroups
* collection has been created (in @converse/headless/converse-core.js) * collection has been created (in @converse/headless/converse-core.js)
*/ */
if (_converse.api.settings.get("authentication") === _converse.ANONYMOUS) { if (api.settings.get("authentication") === _converse.ANONYMOUS) {
return; return;
} }
_converse.rosterview = new _converse.RosterView({ _converse.rosterview = new _converse.RosterView({
...@@ -974,12 +975,12 @@ converse.plugins.add('converse-rosterview', { ...@@ -974,12 +975,12 @@ converse.plugins.add('converse-rosterview', {
* @event _converse#rosterViewInitialized * @event _converse#rosterViewInitialized
* @example _converse.api.listen.on('rosterViewInitialized', () => { ... }); * @example _converse.api.listen.on('rosterViewInitialized', () => { ... });
*/ */
_converse.api.trigger('rosterViewInitialized'); api.trigger('rosterViewInitialized');
} }
_converse.api.listen.on('rosterInitialized', initRosterView); api.listen.on('rosterInitialized', initRosterView);
_converse.api.listen.on('rosterReadyAfterReconnection', initRosterView); api.listen.on('rosterReadyAfterReconnection', initRosterView);
_converse.api.listen.on('afterTearDown', () => { api.listen.on('afterTearDown', () => {
if (converse.rosterview) { if (converse.rosterview) {
converse.rosterview.model.off().reset(); converse.rosterview.model.off().reset();
converse.rosterview.each(groupview => groupview.removeAll().remove()); converse.rosterview.each(groupview => groupview.removeAll().remove());
......
...@@ -60,20 +60,21 @@ converse.plugins.add('converse-bookmarks', { ...@@ -60,20 +60,21 @@ converse.plugins.add('converse-bookmarks', {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this, const { _converse } = this;
{ __ } = _converse; const { api } = _converse;
const { __ } = _converse;
// Configuration values for this plugin // Configuration values for this plugin
// ==================================== // ====================================
// Refer to docs/source/configuration.rst for explanations of these // Refer to docs/source/configuration.rst for explanations of these
// configuration settings. // configuration settings.
_converse.api.settings.update({ api.settings.update({
allow_bookmarks: true, allow_bookmarks: true,
allow_public_bookmarks: false, allow_public_bookmarks: false,
muc_respect_autojoin: true muc_respect_autojoin: true
}); });
_converse.api.promises.add('bookmarksInitialized'); api.promises.add('bookmarksInitialized');
/** /**
* Check if the user has a bookmark with a saved nickanme * Check if the user has a bookmark with a saved nickanme
...@@ -82,7 +83,7 @@ converse.plugins.add('converse-bookmarks', { ...@@ -82,7 +83,7 @@ converse.plugins.add('converse-bookmarks', {
* @method _converse#getNicknameFromBookmark * @method _converse#getNicknameFromBookmark
*/ */
_converse.getNicknameFromBookmark = function (jid) { _converse.getNicknameFromBookmark = function (jid) {
if (!_converse.bookmarks || !_converse.api.settings.get('allow_bookmarks')) { if (!_converse.bookmarks || !api.settings.get('allow_bookmarks')) {
return null; return null;
} }
const bookmark = _converse.bookmarks.findWhere({'jid': jid}); const bookmark = _converse.bookmarks.findWhere({'jid': jid});
...@@ -116,8 +117,8 @@ converse.plugins.add('converse-bookmarks', { ...@@ -116,8 +117,8 @@ converse.plugins.add('converse-bookmarks', {
}, },
async openBookmarkedRoom (bookmark) { async openBookmarkedRoom (bookmark) {
if ( _converse.api.settings.get('muc_respect_autojoin') && bookmark.get('autojoin')) { if ( api.settings.get('muc_respect_autojoin') && bookmark.get('autojoin')) {
const groupchat = await _converse.api.rooms.create(bookmark.get('jid'), bookmark.get('nick')); const groupchat = await api.rooms.create(bookmark.get('jid'), bookmark.get('nick'));
groupchat.maybeShow(); groupchat.maybeShow();
} }
return bookmark; return bookmark;
...@@ -166,13 +167,13 @@ converse.plugins.add('converse-bookmarks', { ...@@ -166,13 +167,13 @@ converse.plugins.add('converse-bookmarks', {
.c('value').t('true').up().up() .c('value').t('true').up().up()
.c('field', {'var':'pubsub#access_model'}) .c('field', {'var':'pubsub#access_model'})
.c('value').t('whitelist'); .c('value').t('whitelist');
return _converse.api.sendIQ(stanza); return api.sendIQ(stanza);
}, },
onBookmarkError (iq, options) { onBookmarkError (iq, options) {
log.error("Error while trying to add bookmark"); log.error("Error while trying to add bookmark");
log.error(iq); log.error(iq);
_converse.api.alert( api.alert(
'error', __('Error'), [__("Sorry, something went wrong while trying to save your bookmark.")] 'error', __('Error'), [__("Sorry, something went wrong while trying to save your bookmark.")]
); );
this.findWhere({'jid': options.jid}).destroy(); this.findWhere({'jid': options.jid}).destroy();
...@@ -184,7 +185,7 @@ converse.plugins.add('converse-bookmarks', { ...@@ -184,7 +185,7 @@ converse.plugins.add('converse-bookmarks', {
'type': 'get', 'type': 'get',
}).c('pubsub', {'xmlns': Strophe.NS.PUBSUB}) }).c('pubsub', {'xmlns': Strophe.NS.PUBSUB})
.c('items', {'node': 'storage:bookmarks'}); .c('items', {'node': 'storage:bookmarks'});
_converse.api.sendIQ(stanza) api.sendIQ(stanza)
.then(iq => this.onBookmarksReceived(deferred, iq)) .then(iq => this.onBookmarksReceived(deferred, iq))
.catch(iq => this.onBookmarksReceivedError(deferred, iq) .catch(iq => this.onBookmarksReceivedError(deferred, iq)
); );
...@@ -231,7 +232,7 @@ converse.plugins.add('converse-bookmarks', { ...@@ -231,7 +232,7 @@ converse.plugins.add('converse-bookmarks', {
onBookmarksReceivedError (deferred, iq) { onBookmarksReceivedError (deferred, iq) {
if (iq === null) { if (iq === null) {
log.error('Error: timeout while fetching bookmarks'); log.error('Error: timeout while fetching bookmarks');
_converse.api.alert('error', __('Timeout Error'), api.alert('error', __('Timeout Error'),
[__("The server did not return your bookmarks within the allowed time. "+ [__("The server did not return your bookmarks within the allowed time. "+
"You can reload the page to request them again.")] "You can reload the page to request them again.")]
); );
...@@ -263,16 +264,16 @@ converse.plugins.add('converse-bookmarks', { ...@@ -263,16 +264,16 @@ converse.plugins.add('converse-bookmarks', {
}); });
_converse.checkBookmarksSupport = async function () { _converse.checkBookmarksSupport = async function () {
const identity = await _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid); const identity = await api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid);
if (_converse.allow_public_bookmarks) { if (_converse.allow_public_bookmarks) {
return !!identity; return !!identity;
} else { } else {
return _converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid); return api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid);
} }
} }
const initBookmarks = async function () { const initBookmarks = async function () {
if (!_converse.api.settings.get('allow_bookmarks')) { if (!api.settings.get('allow_bookmarks')) {
return; return;
} }
if (await _converse.checkBookmarksSupport()) { if (await _converse.checkBookmarksSupport()) {
...@@ -284,11 +285,11 @@ converse.plugins.add('converse-bookmarks', { ...@@ -284,11 +285,11 @@ converse.plugins.add('converse-bookmarks', {
* @event _converse#bookmarksInitialized * @event _converse#bookmarksInitialized
* @example _converse.api.listen.on('bookmarksInitialized', () => { ... }); * @example _converse.api.listen.on('bookmarksInitialized', () => { ... });
*/ */
_converse.api.trigger('bookmarksInitialized'); api.trigger('bookmarksInitialized');
} }
} }
_converse.api.listen.on('clearSession', () => { api.listen.on('clearSession', () => {
if (_converse.bookmarks !== undefined) { if (_converse.bookmarks !== undefined) {
_converse.bookmarks.clearStore({'silent': true}); _converse.bookmarks.clearStore({'silent': true});
window.sessionStorage.removeItem(_converse.bookmarks.fetched_flag); window.sessionStorage.removeItem(_converse.bookmarks.fetched_flag);
...@@ -296,19 +297,19 @@ converse.plugins.add('converse-bookmarks', { ...@@ -296,19 +297,19 @@ converse.plugins.add('converse-bookmarks', {
} }
}); });
_converse.api.listen.on('reconnected', initBookmarks); api.listen.on('reconnected', initBookmarks);
_converse.api.listen.on('connected', async () => { api.listen.on('connected', async () => {
// Add a handler for bookmarks pushed from other connected clients // Add a handler for bookmarks pushed from other connected clients
_converse.connection.addHandler(message => { _converse.connection.addHandler(message => {
if (sizzle('event[xmlns="'+Strophe.NS.PUBSUB+'#event"] items[node="storage:bookmarks"]', message).length) { if (sizzle('event[xmlns="'+Strophe.NS.PUBSUB+'#event"] items[node="storage:bookmarks"]', message).length) {
_converse.api.waitUntil('bookmarksInitialized') api.waitUntil('bookmarksInitialized')
.then(() => _converse.bookmarks.createBookmarksFromStanza(message)) .then(() => _converse.bookmarks.createBookmarksFromStanza(message))
.catch(e => log.fatal(e)); .catch(e => log.fatal(e));
} }
}, null, 'message', 'headline', null, _converse.bare_jid); }, null, 'message', 'headline', null, _converse.bare_jid);
await Promise.all([_converse.api.waitUntil('chatBoxesFetched')]); await Promise.all([api.waitUntil('chatBoxesFetched')]);
initBookmarks(); initBookmarks();
}); });
} }
......
...@@ -22,8 +22,9 @@ converse.plugins.add('converse-bosh', { ...@@ -22,8 +22,9 @@ converse.plugins.add('converse-bosh', {
initialize () { initialize () {
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({ api.settings.update({
bosh_service_url: undefined, bosh_service_url: undefined,
prebind_url: null prebind_url: null
}); });
...@@ -51,11 +52,11 @@ converse.plugins.add('converse-bosh', { ...@@ -51,11 +52,11 @@ converse.plugins.add('converse-bosh', {
_converse.startNewPreboundBOSHSession = function () { _converse.startNewPreboundBOSHSession = function () {
if (!_converse.api.settings.get('prebind_url')) { if (!api.settings.get('prebind_url')) {
throw new Error("startNewPreboundBOSHSession: If you use prebind then you MUST supply a prebind_url"); throw new Error("startNewPreboundBOSHSession: If you use prebind then you MUST supply a prebind_url");
} }
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open('GET', _converse.api.settings.get('prebind_url'), true); xhr.open('GET', api.settings.get('prebind_url'), true);
xhr.setRequestHeader('Accept', 'application/json, text/javascript'); xhr.setRequestHeader('Accept', 'application/json, text/javascript');
xhr.onload = async function () { xhr.onload = async function () {
if (xhr.status >= 200 && xhr.status < 400) { if (xhr.status >= 200 && xhr.status < 400) {
...@@ -79,7 +80,7 @@ converse.plugins.add('converse-bosh', { ...@@ -79,7 +80,7 @@ converse.plugins.add('converse-bosh', {
* @type { _converse } * @type { _converse }
* @example _converse.api.listen.on('noResumeableBOSHSession', _converse => { ... }); * @example _converse.api.listen.on('noResumeableBOSHSession', _converse => { ... });
*/ */
_converse.api.trigger('noResumeableBOSHSession', _converse); api.trigger('noResumeableBOSHSession', _converse);
}; };
xhr.send(); xhr.send();
} }
...@@ -101,7 +102,7 @@ converse.plugins.add('converse-bosh', { ...@@ -101,7 +102,7 @@ converse.plugins.add('converse-bosh', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('clearSession', () => { api.listen.on('clearSession', () => {
if (_converse.bosh_session === undefined) { if (_converse.bosh_session === undefined) {
// Remove manually, even if we don't have the corresponding // Remove manually, even if we don't have the corresponding
// model, to avoid trying to reconnect to a stale BOSH session // model, to avoid trying to reconnect to a stale BOSH session
...@@ -114,28 +115,28 @@ converse.plugins.add('converse-bosh', { ...@@ -114,28 +115,28 @@ converse.plugins.add('converse-bosh', {
} }
}); });
_converse.api.listen.on('setUserJID', () => { api.listen.on('setUserJID', () => {
if (_converse.bosh_session !== undefined) { if (_converse.bosh_session !== undefined) {
_converse.bosh_session.save({'jid': _converse.jid}); _converse.bosh_session.save({'jid': _converse.jid});
} }
}); });
_converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.BOSH)); api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.BOSH));
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* This namespace lets you access the BOSH tokens * This namespace lets you access the BOSH tokens
* *
* @namespace _converse.api.tokens * @namespace api.tokens
* @memberOf _converse.api * @memberOf api
*/ */
tokens: { tokens: {
/** /**
* @method _converse.api.tokens.get * @method api.tokens.get
* @param {string} [id] The type of token to return ('rid' or 'sid'). * @param {string} [id] The type of token to return ('rid' or 'sid').
* @returns 'string' A token, either the RID or SID token depending on what's asked for. * @returns 'string' A token, either the RID or SID token depending on what's asked for.
* @example _converse.api.tokens.get('rid'); * @example _converse.api.tokens.get('rid');
......
...@@ -35,13 +35,14 @@ converse.plugins.add('converse-chat', { ...@@ -35,13 +35,14 @@ converse.plugins.add('converse-chat', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
const { __ } = _converse; const { __ } = _converse;
// Configuration values for this plugin // Configuration values for this plugin
// ==================================== // ====================================
// Refer to docs/source/configuration.rst for explanations of these // Refer to docs/source/configuration.rst for explanations of these
// configuration settings. // configuration settings.
_converse.api.settings.update({ api.settings.update({
'allow_message_corrections': 'all', 'allow_message_corrections': 'all',
'allow_message_retraction': 'all', 'allow_message_retraction': 'all',
'auto_join_private_chats': [], 'auto_join_private_chats': [],
...@@ -58,7 +59,7 @@ converse.plugins.add('converse-chat', { ...@@ -58,7 +59,7 @@ converse.plugins.add('converse-chat', {
}, },
async setRosterContact (jid) { async setRosterContact (jid) {
const contact = await _converse.api.contacts.get(jid); const contact = await api.contacts.get(jid);
if (contact) { if (contact) {
this.contact = contact; this.contact = contact;
this.set('nickname', contact.get('nickname')); this.set('nickname', contact.get('nickname'));
...@@ -103,7 +104,7 @@ converse.plugins.add('converse-chat', { ...@@ -103,7 +104,7 @@ converse.plugins.add('converse-chat', {
* @type { _converse.Message} * @type { _converse.Message}
* @example _converse.api.listen.on('messageInitialized', model => { ... }); * @example _converse.api.listen.on('messageInitialized', model => { ... });
*/ */
await _converse.api.trigger('messageInitialized', this, {'Synchronous': true}); await api.trigger('messageInitialized', this, {'Synchronous': true});
this.initialized.resolve(); this.initialized.resolve();
}, },
...@@ -151,7 +152,7 @@ converse.plugins.add('converse-chat', { ...@@ -151,7 +152,7 @@ converse.plugins.add('converse-chat', {
*/ */
mayBeRetracted () { mayBeRetracted () {
const is_own_message = this.get('sender') === 'me'; const is_own_message = this.get('sender') === 'me';
return is_own_message && ['all', 'own'].includes(_converse.api.settings.get('allow_message_retraction')); return is_own_message && ['all', 'own'].includes(api.settings.get('allow_message_retraction'));
}, },
safeDestroy () { safeDestroy () {
...@@ -212,7 +213,7 @@ converse.plugins.add('converse-chat', { ...@@ -212,7 +213,7 @@ converse.plugins.add('converse-chat', {
'size': this.file.size, 'size': this.file.size,
'content-type': this.file.type 'content-type': this.file.type
}) })
return _converse.api.sendIQ(iq); return api.sendIQ(iq);
}, },
async getRequestSlotURL () { async getRequestSlotURL () {
...@@ -306,7 +307,7 @@ converse.plugins.add('converse-chat', { ...@@ -306,7 +307,7 @@ converse.plugins.add('converse-chat', {
return { return {
'bookmarked': false, 'bookmarked': false,
'chat_state': undefined, 'chat_state': undefined,
'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")), 'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
'message_type': 'chat', 'message_type': 'chat',
'nickname': undefined, 'nickname': undefined,
'num_unread': 0, 'num_unread': 0,
...@@ -347,7 +348,7 @@ converse.plugins.add('converse-chat', { ...@@ -347,7 +348,7 @@ converse.plugins.add('converse-chat', {
* @type { _converse.ChatBox} * @type { _converse.ChatBox}
* @example _converse.api.listen.on('chatBoxInitialized', model => { ... }); * @example _converse.api.listen.on('chatBoxInitialized', model => { ... });
*/ */
await _converse.api.trigger('chatBoxInitialized', this, {'Synchronous': true}); await api.trigger('chatBoxInitialized', this, {'Synchronous': true});
this.initialized.resolve(); this.initialized.resolve();
}, },
...@@ -361,7 +362,7 @@ converse.plugins.add('converse-chat', { ...@@ -361,7 +362,7 @@ converse.plugins.add('converse-chat', {
this.messages.browserStorage = _converse.createStore(this.getMessagesCacheKey()); this.messages.browserStorage = _converse.createStore(this.getMessagesCacheKey());
this.listenTo(this.messages, 'change:upload', message => { this.listenTo(this.messages, 'change:upload', message => {
if (message.get('upload') === _converse.SUCCESS) { if (message.get('upload') === _converse.SUCCESS) {
_converse.api.send(this.createMessageStanza(message)); api.send(this.createMessageStanza(message));
} }
}); });
}, },
...@@ -378,7 +379,7 @@ converse.plugins.add('converse-chat', { ...@@ -378,7 +379,7 @@ converse.plugins.add('converse-chat', {
* @type {_converse.ChatBox | _converse.ChatRoom} * @type {_converse.ChatBox | _converse.ChatRoom}
* @example _converse.api.listen.on('afterMessagesFetched', view => { ... }); * @example _converse.api.listen.on('afterMessagesFetched', view => { ... });
*/ */
_converse.api.trigger('afterMessagesFetched', this); api.trigger('afterMessagesFetched', this);
}, },
fetchMessages () { fetchMessages () {
...@@ -453,7 +454,7 @@ converse.plugins.add('converse-chat', { ...@@ -453,7 +454,7 @@ converse.plugins.add('converse-chat', {
} catch (e) { } catch (e) {
log.error(e); log.error(e);
} finally { } finally {
if (_converse.api.settings.get('clear_messages_on_reconnection')) { if (api.settings.get('clear_messages_on_reconnection')) {
await this.clearMessages(); await this.clearMessages();
} }
} }
...@@ -466,11 +467,11 @@ converse.plugins.add('converse-chat', { ...@@ -466,11 +467,11 @@ converse.plugins.add('converse-chat', {
* @type {_converse.ChatBox | _converse.ChatRoom} * @type {_converse.ChatBox | _converse.ChatRoom}
* @example _converse.api.listen.on('onChatReconnected', chatbox => { ... }); * @example _converse.api.listen.on('onChatReconnected', chatbox => { ... });
*/ */
_converse.api.trigger('chatReconnected', this); api.trigger('chatReconnected', this);
}, },
async onReconnection () { async onReconnection () {
if (_converse.api.settings.get('clear_messages_on_reconnection')) { if (api.settings.get('clear_messages_on_reconnection')) {
await this.clearMessages(); await this.clearMessages();
} }
this.announceReconnection(); this.announceReconnection();
...@@ -481,8 +482,8 @@ converse.plugins.add('converse-chat', { ...@@ -481,8 +482,8 @@ converse.plugins.add('converse-chat', {
return 'Ignored ChatBox without JID'; return 'Ignored ChatBox without JID';
} }
const room_jids = _converse.auto_join_rooms.map(s => isObject(s) ? s.jid : s); const room_jids = _converse.auto_join_rooms.map(s => isObject(s) ? s.jid : s);
const auto_join = _converse.api.settings.get('auto_join_private_chats').concat(room_jids); const auto_join = api.settings.get('auto_join_private_chats').concat(room_jids);
if (_converse.api.settings.get("singleton") && !auto_join.includes(attrs.jid) && !_converse.auto_join_on_invite) { if (api.settings.get("singleton") && !auto_join.includes(attrs.jid) && !_converse.auto_join_on_invite) {
const msg = `${attrs.jid} is not allowed because singleton is true and it's not being auto_joined`; const msg = `${attrs.jid} is not allowed because singleton is true and it's not being auto_joined`;
log.warn(msg); log.warn(msg);
return msg; return msg;
...@@ -793,7 +794,7 @@ converse.plugins.add('converse-chat', { ...@@ -793,7 +794,7 @@ converse.plugins.add('converse-chat', {
'to': to_jid, 'to': to_jid,
'type': 'chat', 'type': 'chat',
}).c(type, {'xmlns': Strophe.NS.MARKERS, 'id': id}); }).c(type, {'xmlns': Strophe.NS.MARKERS, 'id': id});
_converse.api.send(stanza); api.send(stanza);
}, },
handleChatMarker (stanza, from_jid) { handleChatMarker (stanza, from_jid) {
...@@ -836,7 +837,7 @@ converse.plugins.add('converse-chat', { ...@@ -836,7 +837,7 @@ converse.plugins.add('converse-chat', {
'type': 'chat', 'type': 'chat',
}).c('received', {'xmlns': Strophe.NS.RECEIPTS, 'id': id}).up() }).c('received', {'xmlns': Strophe.NS.RECEIPTS, 'id': id}).up()
.c('store', {'xmlns': Strophe.NS.HINTS}).up(); .c('store', {'xmlns': Strophe.NS.HINTS}).up();
_converse.api.send(receipt_stanza); api.send(receipt_stanza);
}, },
handleReceipt (stanza, original_stanza, from_jid) { handleReceipt (stanza, original_stanza, from_jid) {
...@@ -936,7 +937,7 @@ converse.plugins.add('converse-chat', { ...@@ -936,7 +937,7 @@ converse.plugins.add('converse-chat', {
/** /**
* Responsible for setting the editable attribute of messages. * Responsible for setting the editable attribute of messages.
* If _converse.api.settings.get('allow_message_corrections') is "last", then only the last * If api.settings.get('allow_message_corrections') is "last", then only the last
* message sent from me will be editable. If set to "all" all messages * message sent from me will be editable. If set to "all" all messages
* will be editable. Otherwise no messages will be editable. * will be editable. Otherwise no messages will be editable.
* @method _converse.ChatBox#setEditable * @method _converse.ChatBox#setEditable
...@@ -951,9 +952,9 @@ converse.plugins.add('converse-chat', { ...@@ -951,9 +952,9 @@ converse.plugins.add('converse-chat', {
if (u.isEmptyMessage(attrs) || attrs.sender !== 'me') { if (u.isEmptyMessage(attrs) || attrs.sender !== 'me') {
return; return;
} }
if (_converse.api.settings.get('allow_message_corrections') === 'all') { if (api.settings.get('allow_message_corrections') === 'all') {
attrs.editable = !(attrs.file || attrs.retracted || 'oob_url' in attrs); attrs.editable = !(attrs.file || attrs.retracted || 'oob_url' in attrs);
} else if ((_converse.api.settings.get('allow_message_corrections') === 'last') && (send_time > this.get('time_sent'))) { } else if ((api.settings.get('allow_message_corrections') === 'last') && (send_time > this.get('time_sent'))) {
this.set({'time_sent': send_time}); this.set({'time_sent': send_time});
const msg = this.messages.findWhere({'editable': true}); const msg = this.messages.findWhere({'editable': true});
if (msg) { if (msg) {
...@@ -981,7 +982,7 @@ converse.plugins.add('converse-chat', { ...@@ -981,7 +982,7 @@ converse.plugins.add('converse-chat', {
* @param { String } spoiler_hint - An optional hint, if the message being sent is a spoiler * @param { String } spoiler_hint - An optional hint, if the message being sent is a spoiler
* @returns { _converse.Message } * @returns { _converse.Message }
* @example * @example
* const chat = _converse.api.chats.get('buddy1@example.com'); * const chat = api.chats.get('buddy1@example.com');
* chat.sendMessage('hello world'); * chat.sendMessage('hello world');
*/ */
async sendMessage (text, spoiler_hint) { async sendMessage (text, spoiler_hint) {
...@@ -1004,7 +1005,7 @@ converse.plugins.add('converse-chat', { ...@@ -1004,7 +1005,7 @@ converse.plugins.add('converse-chat', {
this.setEditable(attrs, (new Date()).toISOString()); this.setEditable(attrs, (new Date()).toISOString());
message = await this.createMessage(attrs); message = await this.createMessage(attrs);
} }
_converse.api.send(this.createMessageStanza(message)); api.send(this.createMessageStanza(message));
return message; return message;
}, },
...@@ -1015,12 +1016,12 @@ converse.plugins.add('converse-chat', { ...@@ -1015,12 +1016,12 @@ converse.plugins.add('converse-chat', {
* @method _converse.ChatBox#sendChatState * @method _converse.ChatBox#sendChatState
*/ */
sendChatState () { sendChatState () {
if (_converse.api.settings.get('send_chat_state_notifications') && this.get('chat_state')) { if (api.settings.get('send_chat_state_notifications') && this.get('chat_state')) {
const allowed = _converse.api.settings.get('send_chat_state_notifications'); const allowed = api.settings.get('send_chat_state_notifications');
if (Array.isArray(allowed) && !allowed.includes(this.get('chat_state'))) { if (Array.isArray(allowed) && !allowed.includes(this.get('chat_state'))) {
return; return;
} }
_converse.api.send( api.send(
$msg({ $msg({
'id': u.getUniqueId(), 'id': u.getUniqueId(),
'to': this.get('jid'), 'to': this.get('jid'),
...@@ -1034,7 +1035,7 @@ converse.plugins.add('converse-chat', { ...@@ -1034,7 +1035,7 @@ converse.plugins.add('converse-chat', {
async sendFiles (files) { async sendFiles (files) {
const result = await _converse.api.disco.features.get(Strophe.NS.HTTPUPLOAD, _converse.domain); const result = await api.disco.features.get(Strophe.NS.HTTPUPLOAD, _converse.domain);
const item = result.pop(); const item = result.pop();
if (!item) { if (!item) {
this.createMessage({ this.createMessage({
...@@ -1141,7 +1142,7 @@ converse.plugins.add('converse-chat', { ...@@ -1141,7 +1142,7 @@ converse.plugins.add('converse-chat', {
function rejectMessage (stanza, text) { function rejectMessage (stanza, text) {
// Reject an incoming message by replying with an error message of type "cancel". // Reject an incoming message by replying with an error message of type "cancel".
_converse.api.send( api.send(
$msg({ $msg({
'to': stanza.getAttribute('from'), 'to': stanza.getAttribute('from'),
'type': 'error', 'type': 'error',
...@@ -1160,7 +1161,7 @@ converse.plugins.add('converse-chat', { ...@@ -1160,7 +1161,7 @@ converse.plugins.add('converse-chat', {
if (utils.isSameBareJID(from_jid, _converse.bare_jid)) { if (utils.isSameBareJID(from_jid, _converse.bare_jid)) {
return; return;
} }
const chatbox = await _converse.api.chatboxes.get(from_jid); const chatbox = await api.chatboxes.get(from_jid);
if (!chatbox) { if (!chatbox) {
return; return;
} }
...@@ -1184,7 +1185,7 @@ converse.plugins.add('converse-chat', { ...@@ -1184,7 +1185,7 @@ converse.plugins.add('converse-chat', {
let to_jid = stanza.getAttribute('to'); let to_jid = stanza.getAttribute('to');
const to_resource = Strophe.getResourceFromJid(to_jid); const to_resource = Strophe.getResourceFromJid(to_jid);
if (_converse.api.settings.get('filter_by_resource') && (to_resource && to_resource !== _converse.resource)) { if (api.settings.get('filter_by_resource') && (to_resource && to_resource !== _converse.resource)) {
return log.info(`handleMessageStanza: Ignoring incoming message intended for a different resource: ${to_jid}`); return log.info(`handleMessageStanza: Ignoring incoming message intended for a different resource: ${to_jid}`);
} else if (utils.isHeadlineMessage(_converse, stanza)) { } else if (utils.isHeadlineMessage(_converse, stanza)) {
// XXX: Prosody sends headline messages with the // XXX: Prosody sends headline messages with the
...@@ -1229,15 +1230,15 @@ converse.plugins.add('converse-chat', { ...@@ -1229,15 +1230,15 @@ converse.plugins.add('converse-chat', {
return log.error(`Don't know how to handle message stanza without 'to' attribute. ${stanza.outerHTML}`); return log.error(`Don't know how to handle message stanza without 'to' attribute. ${stanza.outerHTML}`);
} }
const contact_jid = is_me ? Strophe.getBareJidFromJid(to_jid) : from_bare_jid; const contact_jid = is_me ? Strophe.getBareJidFromJid(to_jid) : from_bare_jid;
const contact = await _converse.api.contacts.get(contact_jid); const contact = await api.contacts.get(contact_jid);
if (contact === undefined && !_converse.api.settings.get("allow_non_roster_messaging")) { if (contact === undefined && !api.settings.get("allow_non_roster_messaging")) {
log.error(`Blocking messaging with a JID not in our roster because allow_non_roster_messaging is false.`); log.error(`Blocking messaging with a JID not in our roster because allow_non_roster_messaging is false.`);
return log.error(stanza); return log.error(stanza);
} }
// Get chat box, but only create when the message has something to show to the user // Get chat box, but only create when the message has something to show to the user
const has_body = sizzle(`body, encrypted[xmlns="${Strophe.NS.OMEMO}"]`, stanza).length > 0; const has_body = sizzle(`body, encrypted[xmlns="${Strophe.NS.OMEMO}"]`, stanza).length > 0;
const roster_nick = contact?.attributes?.nickname; const roster_nick = contact?.attributes?.nickname;
const chatbox = await _converse.api.chats.get(contact_jid, {'nickname': roster_nick}, has_body); const chatbox = await api.chats.get(contact_jid, {'nickname': roster_nick}, has_body);
chatbox && await chatbox.queueMessage(stanza, original_stanza, from_jid); chatbox && await chatbox.queueMessage(stanza, original_stanza, from_jid);
/** /**
* Triggered when a message stanza is been received and processed. * Triggered when a message stanza is been received and processed.
...@@ -1247,7 +1248,7 @@ converse.plugins.add('converse-chat', { ...@@ -1247,7 +1248,7 @@ converse.plugins.add('converse-chat', {
* @property { XMLElement } stanza * @property { XMLElement } stanza
* @example _converse.api.listen.on('message', obj => { ... }); * @example _converse.api.listen.on('message', obj => { ... });
*/ */
_converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': chatbox}); api.trigger('message', {'stanza': original_stanza, 'chatbox': chatbox});
} }
...@@ -1287,12 +1288,12 @@ converse.plugins.add('converse-chat', { ...@@ -1287,12 +1288,12 @@ converse.plugins.add('converse-chat', {
function autoJoinChats () { function autoJoinChats () {
// Automatically join private chats, based on the // Automatically join private chats, based on the
// "auto_join_private_chats" configuration setting. // "auto_join_private_chats" configuration setting.
_converse.api.settings.get('auto_join_private_chats').forEach(jid => { api.settings.get('auto_join_private_chats').forEach(jid => {
if (_converse.chatboxes.where({'jid': jid}).length) { if (_converse.chatboxes.where({'jid': jid}).length) {
return; return;
} }
if (isString(jid)) { if (isString(jid)) {
_converse.api.chats.open(jid); api.chats.open(jid);
} else { } else {
log.error('Invalid jid criteria specified for "auto_join_private_chats"'); log.error('Invalid jid criteria specified for "auto_join_private_chats"');
} }
...@@ -1305,7 +1306,7 @@ converse.plugins.add('converse-chat', { ...@@ -1305,7 +1306,7 @@ converse.plugins.add('converse-chat', {
* @example _converse.api.listen.on('privateChatsAutoJoined', () => { ... }); * @example _converse.api.listen.on('privateChatsAutoJoined', () => { ... });
* @example _converse.api.waitUntil('privateChatsAutoJoined').then(() => { ... }); * @example _converse.api.waitUntil('privateChatsAutoJoined').then(() => { ... });
*/ */
_converse.api.trigger('privateChatsAutoJoined'); api.trigger('privateChatsAutoJoined');
} }
...@@ -1314,17 +1315,17 @@ converse.plugins.add('converse-chat', { ...@@ -1314,17 +1315,17 @@ converse.plugins.add('converse-chat', {
if (!utils.isValidJID(jid)) { if (!utils.isValidJID(jid)) {
return log.warn(`Invalid JID "${jid}" provided in URL fragment`); return log.warn(`Invalid JID "${jid}" provided in URL fragment`);
} }
_converse.api.chats.open(jid); api.chats.open(jid);
} }
_converse.router.route('converse/chat?jid=:jid', openChat); _converse.router.route('converse/chat?jid=:jid', openChat);
/************************ END Route Handlers ************************/ /************************ END Route Handlers ************************/
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxesFetched', autoJoinChats); api.listen.on('chatBoxesFetched', autoJoinChats);
_converse.api.listen.on('presencesInitialized', registerMessageHandlers); api.listen.on('presencesInitialized', registerMessageHandlers);
_converse.api.listen.on('clearSession', () => { api.listen.on('clearSession', () => {
if (_converse.shouldClearCache()) { if (_converse.shouldClearCache()) {
return Promise.all(_converse.chatboxes.map(c => c.messages && c.messages.clearStore({'silent': true}))); return Promise.all(_converse.chatboxes.map(c => c.messages && c.messages.clearStore({'silent': true})));
} }
...@@ -1333,26 +1334,26 @@ converse.plugins.add('converse-chat', { ...@@ -1333,26 +1334,26 @@ converse.plugins.add('converse-chat', {
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The "chats" namespace (used for one-on-one chats) * The "chats" namespace (used for one-on-one chats)
* *
* @namespace _converse.api.chats * @namespace api.chats
* @memberOf _converse.api * @memberOf api
*/ */
chats: { chats: {
/** /**
* @method _converse.api.chats.create * @method api.chats.create
* @param {string|string[]} jid|jids An jid or array of jids * @param {string|string[]} jid|jids An jid or array of jids
* @param {object} [attrs] An object containing configuration attributes. * @param {object} [attrs] An object containing configuration attributes.
*/ */
async create (jids, attrs) { async create (jids, attrs) {
if (isString(jids)) { if (isString(jids)) {
if (attrs && !attrs?.fullname) { if (attrs && !attrs?.fullname) {
const contact = await _converse.api.contacts.get(jids); const contact = await api.contacts.get(jids);
attrs.fullname = contact?.attributes?.fullname; attrs.fullname = contact?.attributes?.fullname;
} }
const chatbox = _converse.api.chats.get(jids, attrs, true); const chatbox = api.chats.get(jids, attrs, true);
if (!chatbox) { if (!chatbox) {
log.error("Could not open chatbox for JID: "+jids); log.error("Could not open chatbox for JID: "+jids);
return; return;
...@@ -1361,9 +1362,9 @@ converse.plugins.add('converse-chat', { ...@@ -1361,9 +1362,9 @@ converse.plugins.add('converse-chat', {
} }
if (Array.isArray(jids)) { if (Array.isArray(jids)) {
return Promise.all(jids.forEach(async jid => { return Promise.all(jids.forEach(async jid => {
const contact = await _converse.api.contacts.get(jids); const contact = await api.contacts.get(jids);
attrs.fullname = contact?.attributes?.fullname; attrs.fullname = contact?.attributes?.fullname;
return _converse.api.chats.get(jid, attrs, true).maybeShow(); return api.chats.get(jid, attrs, true).maybeShow();
})); }));
} }
log.error("chats.create: You need to provide at least one JID"); log.error("chats.create: You need to provide at least one JID");
...@@ -1373,7 +1374,7 @@ converse.plugins.add('converse-chat', { ...@@ -1373,7 +1374,7 @@ converse.plugins.add('converse-chat', {
/** /**
* Opens a new one-on-one chat. * Opens a new one-on-one chat.
* *
* @method _converse.api.chats.open * @method api.chats.open
* @param {String|string[]} name - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com'] * @param {String|string[]} name - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model. * @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [attrs.minimized] - Should the chat be created in minimized state. * @param {Boolean} [attrs.minimized] - Should the chat be created in minimized state.
...@@ -1392,7 +1393,7 @@ converse.plugins.add('converse-chat', { ...@@ -1392,7 +1393,7 @@ converse.plugins.add('converse-chat', {
* initialize: function() { * initialize: function() {
* const _converse = this._converse; * const _converse = this._converse;
* // Note, buddy@example.org must be in your contacts roster! * // Note, buddy@example.org must be in your contacts roster!
* _converse.api.chats.open('buddy@example.com').then(chat => { * api.chats.open('buddy@example.com').then(chat => {
* // Now you can do something with the chat model * // Now you can do something with the chat model
* }); * });
* } * }
...@@ -1404,7 +1405,7 @@ converse.plugins.add('converse-chat', { ...@@ -1404,7 +1405,7 @@ converse.plugins.add('converse-chat', {
* initialize: function () { * initialize: function () {
* const _converse = this._converse; * const _converse = this._converse;
* // Note, these users must first be in your contacts roster! * // Note, these users must first be in your contacts roster!
* _converse.api.chats.open(['buddy1@example.com', 'buddy2@example.com']).then(chats => { * api.chats.open(['buddy1@example.com', 'buddy2@example.com']).then(chats => {
* // Now you can do something with the chat models * // Now you can do something with the chat models
* }); * });
* } * }
...@@ -1412,14 +1413,14 @@ converse.plugins.add('converse-chat', { ...@@ -1412,14 +1413,14 @@ converse.plugins.add('converse-chat', {
*/ */
async open (jids, attrs, force) { async open (jids, attrs, force) {
if (isString(jids)) { if (isString(jids)) {
const chat = await _converse.api.chats.get(jids, attrs, true); const chat = await api.chats.get(jids, attrs, true);
if (chat) { if (chat) {
return chat.maybeShow(force); return chat.maybeShow(force);
} }
return chat; return chat;
} else if (Array.isArray(jids)) { } else if (Array.isArray(jids)) {
return Promise.all( return Promise.all(
jids.map(j => _converse.api.chats.get(j, attrs, true).then(c => c && c.maybeShow(force))) jids.map(j => api.chats.get(j, attrs, true).then(c => c && c.maybeShow(force)))
.filter(c => c) .filter(c => c)
); );
} }
...@@ -1431,7 +1432,7 @@ converse.plugins.add('converse-chat', { ...@@ -1431,7 +1432,7 @@ converse.plugins.add('converse-chat', {
/** /**
* Retrieves a chat or all chats. * Retrieves a chat or all chats.
* *
* @method _converse.api.chats.get * @method api.chats.get
* @param {String|string[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com'] * @param {String|string[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model. * @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [create=false] - Whether the chat should be created if it's not found. * @param {Boolean} [create=false] - Whether the chat should be created if it's not found.
...@@ -1439,22 +1440,22 @@ converse.plugins.add('converse-chat', { ...@@ -1439,22 +1440,22 @@ converse.plugins.add('converse-chat', {
* *
* @example * @example
* // To return a single chat, provide the JID of the contact you're chatting with in that chat: * // To return a single chat, provide the JID of the contact you're chatting with in that chat:
* const model = await _converse.api.chats.get('buddy@example.com'); * const model = await api.chats.get('buddy@example.com');
* *
* @example * @example
* // To return an array of chats, provide an array of JIDs: * // To return an array of chats, provide an array of JIDs:
* const models = await _converse.api.chats.get(['buddy1@example.com', 'buddy2@example.com']); * const models = await api.chats.get(['buddy1@example.com', 'buddy2@example.com']);
* *
* @example * @example
* // To return all open chats, call the method without any parameters:: * // To return all open chats, call the method without any parameters::
* const models = await _converse.api.chats.get(); * const models = await api.chats.get();
* *
*/ */
async get (jids, attrs={}, create=false) { async get (jids, attrs={}, create=false) {
async function _get (jid) { async function _get (jid) {
let model = await _converse.api.chatboxes.get(jid); let model = await api.chatboxes.get(jid);
if (!model && create) { if (!model && create) {
model = await _converse.api.chatboxes.create(jid, attrs, _converse.ChatBox); model = await api.chatboxes.create(jid, attrs, _converse.ChatBox);
} else { } else {
model = (model && model.get('type') === _converse.PRIVATE_CHAT_TYPE) ? model : null; model = (model && model.get('type') === _converse.PRIVATE_CHAT_TYPE) ? model : null;
if (model && Object.keys(attrs).length) { if (model && Object.keys(attrs).length) {
...@@ -1464,7 +1465,7 @@ converse.plugins.add('converse-chat', { ...@@ -1464,7 +1465,7 @@ converse.plugins.add('converse-chat', {
return model; return model;
} }
if (jids === undefined) { if (jids === undefined) {
const chats = await _converse.api.chatboxes.get(); const chats = await api.chatboxes.get();
return chats.filter(c => (c.get('type') === _converse.PRIVATE_CHAT_TYPE)); return chats.filter(c => (c.get('type') === _converse.PRIVATE_CHAT_TYPE));
} else if (isString(jids)) { } else if (isString(jids)) {
return _get(jids); return _get(jids);
......
...@@ -26,8 +26,9 @@ converse.plugins.add('converse-chatboxes', { ...@@ -26,8 +26,9 @@ converse.plugins.add('converse-chatboxes', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.promises.add([ api.promises.add([
'chatBoxesFetched', 'chatBoxesFetched',
'chatBoxesInitialized', 'chatBoxesInitialized',
'privateChatsAutoJoined' 'privateChatsAutoJoined'
...@@ -78,7 +79,7 @@ converse.plugins.add('converse-chatboxes', { ...@@ -78,7 +79,7 @@ converse.plugins.add('converse-chatboxes', {
* @example _converse.api.listen.on('message', obj => { ... }); * @example _converse.api.listen.on('message', obj => { ... });
* @example _converse.api.waitUntil('chatBoxesFetched').then(() => { ... }); * @example _converse.api.waitUntil('chatBoxesFetched').then(() => { ... });
*/ */
_converse.api.trigger('chatBoxesFetched'); api.trigger('chatBoxesFetched');
}, },
onConnected (reconnecting) { onConnected (reconnecting) {
...@@ -114,13 +115,13 @@ converse.plugins.add('converse-chatboxes', { ...@@ -114,13 +115,13 @@ converse.plugins.add('converse-chatboxes', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('addClientFeatures', () => { api.listen.on('addClientFeatures', () => {
_converse.api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT); api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT);
_converse.api.disco.own.features.add(Strophe.NS.HTTPUPLOAD); api.disco.own.features.add(Strophe.NS.HTTPUPLOAD);
_converse.api.disco.own.features.add(Strophe.NS.OUTOFBAND); api.disco.own.features.add(Strophe.NS.OUTOFBAND);
}); });
_converse.api.listen.on('pluginsInitialized', () => { api.listen.on('pluginsInitialized', () => {
_converse.chatboxes = new _converse.ChatBoxes(); _converse.chatboxes = new _converse.ChatBoxes();
/** /**
* Triggered once the _converse.ChatBoxes collection has been initialized. * Triggered once the _converse.ChatBoxes collection has been initialized.
...@@ -128,32 +129,32 @@ converse.plugins.add('converse-chatboxes', { ...@@ -128,32 +129,32 @@ converse.plugins.add('converse-chatboxes', {
* @example _converse.api.listen.on('chatBoxesInitialized', () => { ... }); * @example _converse.api.listen.on('chatBoxesInitialized', () => { ... });
* @example _converse.api.waitUntil('chatBoxesInitialized').then(() => { ... }); * @example _converse.api.waitUntil('chatBoxesInitialized').then(() => { ... });
*/ */
_converse.api.trigger('chatBoxesInitialized'); api.trigger('chatBoxesInitialized');
}); });
_converse.api.listen.on('presencesInitialized', (reconnecting) => _converse.chatboxes.onConnected(reconnecting)); api.listen.on('presencesInitialized', (reconnecting) => _converse.chatboxes.onConnected(reconnecting));
_converse.api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection())); api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection()));
_converse.api.listen.on('windowStateChanged', d => (d.state === 'visible') && _converse.clearMsgCounter()); api.listen.on('windowStateChanged', d => (d.state === 'visible') && _converse.clearMsgCounter());
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The "chatboxes" namespace. * The "chatboxes" namespace.
* *
* @namespace _converse.api.chatboxes * @namespace api.chatboxes
* @memberOf _converse.api * @memberOf api
*/ */
chatboxes: { chatboxes: {
/** /**
* @method _converse.api.chats.create * @method api.chats.create
* @param { String|String[] } jids - A JID or array of JIDs * @param { String|String[] } jids - A JID or array of JIDs
* @param { Object } [attrs] An object containing configuration attributes * @param { Object } [attrs] An object containing configuration attributes
* @param { Model } model - The type of chatbox that should be created * @param { Model } model - The type of chatbox that should be created
*/ */
async create (jids=[], attrs={}, model) { async create (jids=[], attrs={}, model) {
await _converse.api.waitUntil('chatBoxesFetched'); await api.waitUntil('chatBoxesFetched');
if (isString(jids)) { if (isString(jids)) {
return createChatBox(jids, attrs, model); return createChatBox(jids, attrs, model);
} else { } else {
...@@ -162,11 +163,11 @@ converse.plugins.add('converse-chatboxes', { ...@@ -162,11 +163,11 @@ converse.plugins.add('converse-chatboxes', {
}, },
/** /**
* @method _converse.api.chats.get * @method api.chats.get
* @param { String|String[] } jids - A JID or array of JIDs * @param { String|String[] } jids - A JID or array of JIDs
*/ */
async get (jids) { async get (jids) {
await _converse.api.waitUntil('chatBoxesFetched'); await api.waitUntil('chatBoxesFetched');
if (jids === undefined) { if (jids === undefined) {
return _converse.chatboxes.models; return _converse.chatboxes.models;
} else if (isString(jids)) { } else if (isString(jids)) {
......
...@@ -20,10 +20,11 @@ converse.plugins.add('converse-disco', { ...@@ -20,10 +20,11 @@ converse.plugins.add('converse-disco', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
// Promises exposed by this plugin // Promises exposed by this plugin
_converse.api.promises.add('discoInitialized'); api.promises.add('discoInitialized');
_converse.api.promises.add('streamFeaturesAdded'); api.promises.add('streamFeaturesAdded');
/** /**
...@@ -106,7 +107,7 @@ converse.plugins.add('converse-disco', { ...@@ -106,7 +107,7 @@ converse.plugins.add('converse-disco', {
* @type { Model } * @type { Model }
* @example _converse.api.listen.on('featuresDiscovered', feature => { ... }); * @example _converse.api.listen.on('featuresDiscovered', feature => { ... });
*/ */
_converse.api.trigger('serviceDiscovered', feature); api.trigger('serviceDiscovered', feature);
}, },
onFieldAdded (field) { onFieldAdded (field) {
...@@ -117,7 +118,7 @@ converse.plugins.add('converse-disco', { ...@@ -117,7 +118,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#discoExtensionFieldDiscovered * @event _converse#discoExtensionFieldDiscovered
* @example _converse.api.listen.on('discoExtensionFieldDiscovered', () => { ... }); * @example _converse.api.listen.on('discoExtensionFieldDiscovered', () => { ... });
*/ */
_converse.api.trigger('discoExtensionFieldDiscovered', field); api.trigger('discoExtensionFieldDiscovered', field);
}, },
async fetchFeatures (options) { async fetchFeatures (options) {
...@@ -144,7 +145,7 @@ converse.plugins.add('converse-disco', { ...@@ -144,7 +145,7 @@ converse.plugins.add('converse-disco', {
async queryInfo () { async queryInfo () {
let stanza; let stanza;
try { try {
stanza = await _converse.api.disco.info(this.get('jid'), null); stanza = await api.disco.info(this.get('jid'), null);
} catch (iq) { } catch (iq) {
log.error(iq); log.error(iq);
this.waitUntilFeaturesDiscovered.resolve(this); this.waitUntilFeaturesDiscovered.resolve(this);
...@@ -178,7 +179,7 @@ converse.plugins.add('converse-disco', { ...@@ -178,7 +179,7 @@ converse.plugins.add('converse-disco', {
// server or a conference component. // server or a conference component.
return; return;
} }
const stanza = await _converse.api.disco.items(this.get('jid')); const stanza = await api.disco.items(this.get('jid'));
this.onDiscoItems(stanza); this.onDiscoItems(stanza);
}, },
...@@ -246,13 +247,13 @@ converse.plugins.add('converse-disco', { ...@@ -246,13 +247,13 @@ converse.plugins.add('converse-disco', {
function addClientFeatures () { function addClientFeatures () {
// See https://xmpp.org/registrar/disco-categories.html // See https://xmpp.org/registrar/disco-categories.html
_converse.api.disco.own.identities.add('client', 'web', 'Converse'); api.disco.own.identities.add('client', 'web', 'Converse');
_converse.api.disco.own.features.add(Strophe.NS.CHATSTATES); api.disco.own.features.add(Strophe.NS.CHATSTATES);
_converse.api.disco.own.features.add(Strophe.NS.DISCO_INFO); api.disco.own.features.add(Strophe.NS.DISCO_INFO);
_converse.api.disco.own.features.add(Strophe.NS.ROSTERX); // Limited support api.disco.own.features.add(Strophe.NS.ROSTERX); // Limited support
if (_converse.api.settings.get("message_carbons")) { if (api.settings.get("message_carbons")) {
_converse.api.disco.own.features.add(Strophe.NS.CARBONS); api.disco.own.features.add(Strophe.NS.CARBONS);
} }
/** /**
* Triggered in converse-disco once the core disco features of * Triggered in converse-disco once the core disco features of
...@@ -260,7 +261,7 @@ converse.plugins.add('converse-disco', { ...@@ -260,7 +261,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#addClientFeatures * @event _converse#addClientFeatures
* @example _converse.api.listen.on('addClientFeatures', () => { ... }); * @example _converse.api.listen.on('addClientFeatures', () => { ... });
*/ */
_converse.api.trigger('addClientFeatures'); api.trigger('addClientFeatures');
return this; return this;
} }
...@@ -274,7 +275,7 @@ converse.plugins.add('converse-disco', { ...@@ -274,7 +275,7 @@ converse.plugins.add('converse-disco', {
if (!_converse.stream_features) { if (!_converse.stream_features) {
const bare_jid = Strophe.getBareJidFromJid(_converse.jid); const bare_jid = Strophe.getBareJidFromJid(_converse.jid);
const id = `converse.stream-features-${bare_jid}`; const id = `converse.stream-features-${bare_jid}`;
_converse.api.promises.add('streamFeaturesAdded'); api.promises.add('streamFeaturesAdded');
_converse.stream_features = new Collection(); _converse.stream_features = new Collection();
_converse.stream_features.browserStorage = _converse.createStore(id, "session"); _converse.stream_features.browserStorage = _converse.createStore(id, "session");
} }
...@@ -306,7 +307,7 @@ converse.plugins.add('converse-disco', { ...@@ -306,7 +307,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#streamFeaturesAdded * @event _converse#streamFeaturesAdded
* @example _converse.api.listen.on('streamFeaturesAdded', () => { ... }); * @example _converse.api.listen.on('streamFeaturesAdded', () => { ... });
*/ */
_converse.api.trigger('streamFeaturesAdded'); api.trigger('streamFeaturesAdded');
} }
...@@ -339,7 +340,7 @@ converse.plugins.add('converse-disco', { ...@@ -339,7 +340,7 @@ converse.plugins.add('converse-disco', {
iqresult.c('identity', attrs).up(); iqresult.c('identity', attrs).up();
}); });
plugin._features.forEach(feature => iqresult.c('feature', {'var': feature}).up()); plugin._features.forEach(feature => iqresult.c('feature', {'var': feature}).up());
_converse.api.send(iqresult.tree()); api.send(iqresult.tree());
return true; return true;
} }
...@@ -364,12 +365,12 @@ converse.plugins.add('converse-disco', { ...@@ -364,12 +365,12 @@ converse.plugins.add('converse-disco', {
* @event _converse#discoInitialized * @event _converse#discoInitialized
* @example _converse.api.listen.on('discoInitialized', () => { ... }); * @example _converse.api.listen.on('discoInitialized', () => { ... });
*/ */
_converse.api.trigger('discoInitialized'); api.trigger('discoInitialized');
} }
/******************** Event Handlers ********************/ /******************** Event Handlers ********************/
_converse.api.listen.on('userSessionInitialized', async () => { api.listen.on('userSessionInitialized', async () => {
initStreamFeatures(); initStreamFeatures();
if (_converse.connfeedback.get('connection_status') === Strophe.Status.ATTACHED) { if (_converse.connfeedback.get('connection_status') === Strophe.Status.ATTACHED) {
// When re-attaching to a BOSH session, we fetch the stream features from the cache. // When re-attaching to a BOSH session, we fetch the stream features from the cache.
...@@ -377,20 +378,20 @@ converse.plugins.add('converse-disco', { ...@@ -377,20 +378,20 @@ converse.plugins.add('converse-disco', {
notifyStreamFeaturesAdded(); notifyStreamFeaturesAdded();
} }
}); });
_converse.api.listen.on('beforeResourceBinding', populateStreamFeatures); api.listen.on('beforeResourceBinding', populateStreamFeatures);
_converse.api.listen.on('reconnected', initializeDisco); api.listen.on('reconnected', initializeDisco);
_converse.api.listen.on('connected', initializeDisco); api.listen.on('connected', initializeDisco);
_converse.api.listen.on('beforeTearDown', async () => { api.listen.on('beforeTearDown', async () => {
_converse.api.promises.add('streamFeaturesAdded') api.promises.add('streamFeaturesAdded')
if (_converse.stream_features) { if (_converse.stream_features) {
await _converse.stream_features.clearStore(); await _converse.stream_features.clearStore();
delete _converse.stream_features; delete _converse.stream_features;
} }
}); });
_converse.api.listen.on('clearSession', () => { api.listen.on('clearSession', () => {
if (_converse.shouldClearCache() && _converse.disco_entities) { if (_converse.shouldClearCache() && _converse.disco_entities) {
Array.from(_converse.disco_entities.models).forEach(e => e.features.clearStore()); Array.from(_converse.disco_entities.models).forEach(e => e.features.clearStore());
Array.from(_converse.disco_entities.models).forEach(e => e.identities.clearStore()); Array.from(_converse.disco_entities.models).forEach(e => e.identities.clearStore());
...@@ -404,34 +405,34 @@ converse.plugins.add('converse-disco', { ...@@ -404,34 +405,34 @@ converse.plugins.add('converse-disco', {
/************************ API ************************/ /************************ API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The XEP-0030 service discovery API * The XEP-0030 service discovery API
* *
* This API lets you discover information about entities on the * This API lets you discover information about entities on the
* XMPP network. * XMPP network.
* *
* @namespace _converse.api.disco * @namespace api.disco
* @memberOf _converse.api * @memberOf api
*/ */
disco: { disco: {
/** /**
* @namespace _converse.api.disco.stream * @namespace api.disco.stream
* @memberOf _converse.api.disco * @memberOf api.disco
*/ */
stream: { stream: {
/** /**
* @method _converse.api.disco.stream.getFeature * @method api.disco.stream.getFeature
* @param {String} name The feature name * @param {String} name The feature name
* @param {String} xmlns The XML namespace * @param {String} xmlns The XML namespace
* @example _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver') * @example _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver')
*/ */
async getFeature (name, xmlns) { async getFeature (name, xmlns) {
await _converse.api.waitUntil('streamFeaturesAdded'); await api.waitUntil('streamFeaturesAdded');
if (!name || !xmlns) { if (!name || !xmlns) {
throw new Error("name and xmlns need to be provided when calling disco.stream.getFeature"); throw new Error("name and xmlns need to be provided when calling disco.stream.getFeature");
} }
if (_converse.stream_features === undefined && !_converse.api.connection.connected()) { if (_converse.stream_features === undefined && !api.connection.connected()) {
// Happens during tests when disco lookups happen asynchronously after teardown. // Happens during tests when disco lookups happen asynchronously after teardown.
const msg = `Tried to get feature ${name} ${xmlns} but _converse.stream_features has been torn down`; const msg = `Tried to get feature ${name} ${xmlns} but _converse.stream_features has been torn down`;
log.warn(msg); log.warn(msg);
...@@ -442,18 +443,18 @@ converse.plugins.add('converse-disco', { ...@@ -442,18 +443,18 @@ converse.plugins.add('converse-disco', {
}, },
/** /**
* @namespace _converse.api.disco.own * @namespace api.disco.own
* @memberOf _converse.api.disco * @memberOf api.disco
*/ */
own: { own: {
/** /**
* @namespace _converse.api.disco.own.identities * @namespace api.disco.own.identities
* @memberOf _converse.api.disco.own * @memberOf api.disco.own
*/ */
identities: { identities: {
/** /**
* Lets you add new identities for this client (i.e. instance of Converse) * Lets you add new identities for this client (i.e. instance of Converse)
* @method _converse.api.disco.own.identities.add * @method api.disco.own.identities.add
* *
* @param {String} category - server, client, gateway, directory, etc. * @param {String} category - server, client, gateway, directory, etc.
* @param {String} type - phone, pc, web, etc. * @param {String} type - phone, pc, web, etc.
...@@ -475,7 +476,7 @@ converse.plugins.add('converse-disco', { ...@@ -475,7 +476,7 @@ converse.plugins.add('converse-disco', {
}, },
/** /**
* Clears all previously registered identities. * Clears all previously registered identities.
* @method _converse.api.disco.own.identities.clear * @method api.disco.own.identities.clear
* @example _converse.api.disco.own.identities.clear(); * @example _converse.api.disco.own.identities.clear();
*/ */
clear () { clear () {
...@@ -484,8 +485,8 @@ converse.plugins.add('converse-disco', { ...@@ -484,8 +485,8 @@ converse.plugins.add('converse-disco', {
/** /**
* Returns all of the identities registered for this client * Returns all of the identities registered for this client
* (i.e. instance of Converse). * (i.e. instance of Converse).
* @method _converse.api.disco.identities.get * @method api.disco.identities.get
* @example const identities = _converse.api.disco.own.identities.get(); * @example const identities = api.disco.own.identities.get();
*/ */
get () { get () {
return plugin._identities; return plugin._identities;
...@@ -493,13 +494,13 @@ converse.plugins.add('converse-disco', { ...@@ -493,13 +494,13 @@ converse.plugins.add('converse-disco', {
}, },
/** /**
* @namespace _converse.api.disco.own.features * @namespace api.disco.own.features
* @memberOf _converse.api.disco.own * @memberOf api.disco.own
*/ */
features: { features: {
/** /**
* Lets you register new disco features for this client (i.e. instance of Converse) * Lets you register new disco features for this client (i.e. instance of Converse)
* @method _converse.api.disco.own.features.add * @method api.disco.own.features.add
* @param {String} name - e.g. http://jabber.org/protocol/caps * @param {String} name - e.g. http://jabber.org/protocol/caps
* @example _converse.api.disco.own.features.add("http://jabber.org/protocol/caps"); * @example _converse.api.disco.own.features.add("http://jabber.org/protocol/caps");
*/ */
...@@ -511,7 +512,7 @@ converse.plugins.add('converse-disco', { ...@@ -511,7 +512,7 @@ converse.plugins.add('converse-disco', {
}, },
/** /**
* Clears all previously registered features. * Clears all previously registered features.
* @method _converse.api.disco.own.features.clear * @method api.disco.own.features.clear
* @example _converse.api.disco.own.features.clear(); * @example _converse.api.disco.own.features.clear();
*/ */
clear () { clear () {
...@@ -519,8 +520,8 @@ converse.plugins.add('converse-disco', { ...@@ -519,8 +520,8 @@ converse.plugins.add('converse-disco', {
}, },
/** /**
* Returns all of the features registered for this client (i.e. instance of Converse). * Returns all of the features registered for this client (i.e. instance of Converse).
* @method _converse.api.disco.own.features.get * @method api.disco.own.features.get
* @example const features = _converse.api.disco.own.features.get(); * @example const features = api.disco.own.features.get();
*/ */
get () { get () {
return plugin._features; return plugin._features;
...@@ -531,7 +532,7 @@ converse.plugins.add('converse-disco', { ...@@ -531,7 +532,7 @@ converse.plugins.add('converse-disco', {
/** /**
* Query for information about an XMPP entity * Query for information about an XMPP entity
* *
* @method _converse.api.disco.info * @method api.disco.info
* @param {string} jid The Jabber ID of the entity to query * @param {string} jid The Jabber ID of the entity to query
* @param {string} [node] A specific node identifier associated with the JID * @param {string} [node] A specific node identifier associated with the JID
* @returns {promise} Promise which resolves once we have a result from the server. * @returns {promise} Promise which resolves once we have a result from the server.
...@@ -546,13 +547,13 @@ converse.plugins.add('converse-disco', { ...@@ -546,13 +547,13 @@ converse.plugins.add('converse-disco', {
'to':jid, 'to':jid,
'type':'get' 'type':'get'
}).c('query', attrs); }).c('query', attrs);
return _converse.api.sendIQ(info); return api.sendIQ(info);
}, },
/** /**
* Query for items associated with an XMPP entity * Query for items associated with an XMPP entity
* *
* @method _converse.api.disco.items * @method api.disco.items
* @param {string} jid The Jabber ID of the entity to query for items * @param {string} jid The Jabber ID of the entity to query for items
* @param {string} [node] A specific node identifier associated with the JID * @param {string} [node] A specific node identifier associated with the JID
* @returns {promise} Promise which resolves once we have a result from the server. * @returns {promise} Promise which resolves once we have a result from the server.
...@@ -562,7 +563,7 @@ converse.plugins.add('converse-disco', { ...@@ -562,7 +563,7 @@ converse.plugins.add('converse-disco', {
if (node) { if (node) {
attrs.node = node; attrs.node = node;
} }
return _converse.api.sendIQ( return api.sendIQ(
$iq({ $iq({
'from': _converse.connection.jid, 'from': _converse.connection.jid,
'to':jid, 'to':jid,
...@@ -574,24 +575,24 @@ converse.plugins.add('converse-disco', { ...@@ -574,24 +575,24 @@ converse.plugins.add('converse-disco', {
/** /**
* Namespace for methods associated with disco entities * Namespace for methods associated with disco entities
* *
* @namespace _converse.api.disco.entities * @namespace api.disco.entities
* @memberOf _converse.api.disco * @memberOf api.disco
*/ */
entities: { entities: {
/** /**
* Get the corresponding `DiscoEntity` instance. * Get the corresponding `DiscoEntity` instance.
* *
* @method _converse.api.disco.entities.get * @method api.disco.entities.get
* @param {string} jid The Jabber ID of the entity * @param {string} jid The Jabber ID of the entity
* @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);
*/ */
async get (jid, create=false) { async get (jid, create=false) {
await _converse.api.waitUntil('discoInitialized'); await api.waitUntil('discoInitialized');
if (!jid) { if (!jid) {
return _converse.disco_entities; return _converse.disco_entities;
} }
if (_converse.disco_entities === undefined && !_converse.api.connection.connected()) { if (_converse.disco_entities === undefined && !api.connection.connected()) {
// Happens during tests when disco lookups happen asynchronously after teardown. // Happens during tests when disco lookups happen asynchronously after teardown.
const msg = `Tried to look up entity ${jid} but _converse.disco_entities has been torn down`; const msg = `Tried to look up entity ${jid} but _converse.disco_entities has been torn down`;
log.warn(msg); log.warn(msg);
...@@ -601,7 +602,7 @@ converse.plugins.add('converse-disco', { ...@@ -601,7 +602,7 @@ converse.plugins.add('converse-disco', {
if (entity || !create) { if (entity || !create) {
return entity; return entity;
} }
return _converse.api.disco.entities.create(jid); return api.disco.entities.create(jid);
}, },
/** /**
...@@ -612,7 +613,7 @@ converse.plugins.add('converse-disco', { ...@@ -612,7 +613,7 @@ converse.plugins.add('converse-disco', {
* Fetching from cache can be disabled by passing in * Fetching from cache can be disabled by passing in
* `ignore_cache: true` in the options parameter. * `ignore_cache: true` in the options parameter.
* *
* @method _converse.api.disco.entities.create * @method api.disco.entities.create
* @param {string} jid The Jabber ID of the entity * @param {string} jid The Jabber ID of the entity
* @param {object} [options] Additional options * @param {object} [options] Additional options
* @param {boolean} [options.ignore_cache] * @param {boolean} [options.ignore_cache]
...@@ -625,14 +626,14 @@ converse.plugins.add('converse-disco', { ...@@ -625,14 +626,14 @@ converse.plugins.add('converse-disco', {
}, },
/** /**
* @namespace _converse.api.disco.features * @namespace api.disco.features
* @memberOf _converse.api.disco * @memberOf api.disco
*/ */
features: { features: {
/** /**
* Return a given feature of a disco entity * Return a given feature of a disco entity
* *
* @method _converse.api.disco.features.get * @method api.disco.features.get
* @param {string} feature The feature that might be * @param {string} feature The feature that might be
* supported. In the XML stanza, this is the `var` * supported. In the XML stanza, this is the `var`
* attribute of the `<feature>` element. For * attribute of the `<feature>` element. For
...@@ -644,16 +645,16 @@ converse.plugins.add('converse-disco', { ...@@ -644,16 +645,16 @@ converse.plugins.add('converse-disco', {
* itself or those items associated with the entity if * itself or those items associated with the entity if
* they support the given feature. * they support the given feature.
* @example * @example
* _converse.api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid); * api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid);
*/ */
async get (feature, jid) { async get (feature, jid) {
if (!jid) { if (!jid) {
throw new TypeError('You need to provide an entity JID'); throw new TypeError('You need to provide an entity JID');
} }
await _converse.api.waitUntil('discoInitialized'); await api.waitUntil('discoInitialized');
let entity = await _converse.api.disco.entities.get(jid, true); let entity = await api.disco.entities.get(jid, true);
if (_converse.disco_entities === undefined && !_converse.api.connection.connected()) { if (_converse.disco_entities === undefined && !api.connection.connected()) {
// Happens during tests when disco lookups happen asynchronously after teardown. // Happens during tests when disco lookups happen asynchronously after teardown.
const msg = `Tried to get feature ${feature} for ${jid} but _converse.disco_entities has been torn down`; const msg = `Tried to get feature ${feature} for ${jid} but _converse.disco_entities has been torn down`;
log.warn(msg); log.warn(msg);
...@@ -669,7 +670,7 @@ converse.plugins.add('converse-disco', { ...@@ -669,7 +670,7 @@ converse.plugins.add('converse-disco', {
/** /**
* Used to determine whether an entity supports a given feature. * Used to determine whether an entity supports a given feature.
* *
* @method _converse.api.disco.supports * @method api.disco.supports
* @param {string} feature The feature that might be * @param {string} feature The feature that might be
* supported. In the XML stanza, this is the `var` * supported. In the XML stanza, this is the `var`
* attribute of the `<feature>` element. For * attribute of the `<feature>` element. For
...@@ -678,32 +679,32 @@ converse.plugins.add('converse-disco', { ...@@ -678,32 +679,32 @@ converse.plugins.add('converse-disco', {
* (and its associated items) which should be queried * (and its associated items) which should be queried
* @returns {promise} A promise which resolves with `true` or `false`. * @returns {promise} A promise which resolves with `true` or `false`.
* @example * @example
* if (await _converse.api.disco.supports(Strophe.NS.MAM, _converse.bare_jid)) { * if (await api.disco.supports(Strophe.NS.MAM, _converse.bare_jid)) {
* // The feature is supported * // The feature is supported
* } else { * } else {
* // The feature is not supported * // The feature is not supported
* } * }
*/ */
async supports (feature, jid) { async supports (feature, jid) {
const features = await _converse.api.disco.features.get(feature, jid); const features = await api.disco.features.get(feature, jid);
return features.length > 0; return features.length > 0;
}, },
/** /**
* Refresh the features, fields and identities associated with a * Refresh the features, fields and identities associated with a
* disco entity by refetching them from the server * disco entity by refetching them from the server
* @method _converse.api.disco.refresh * @method api.disco.refresh
* @param {string} jid The JID of the entity whose features are refreshed. * @param {string} jid The JID of the entity whose features are refreshed.
* @returns {promise} A promise which resolves once the features have been refreshed * @returns {promise} A promise which resolves once the features have been refreshed
* @example * @example
* await _converse.api.disco.refresh('room@conference.example.org'); * await api.disco.refresh('room@conference.example.org');
*/ */
async refresh (jid) { async refresh (jid) {
if (!jid) { if (!jid) {
throw new TypeError('api.disco.refresh: You need to provide an entity JID'); throw new TypeError('api.disco.refresh: You need to provide an entity JID');
} }
await _converse.api.waitUntil('discoInitialized'); await api.waitUntil('discoInitialized');
let entity = await _converse.api.disco.entities.get(jid); let entity = await api.disco.entities.get(jid);
if (entity) { if (entity) {
entity.features.reset(); entity.features.reset();
entity.fields.reset(); entity.fields.reset();
...@@ -714,34 +715,34 @@ converse.plugins.add('converse-disco', { ...@@ -714,34 +715,34 @@ converse.plugins.add('converse-disco', {
entity.queryInfo(); entity.queryInfo();
} else { } else {
// Create it if it doesn't exist // Create it if it doesn't exist
entity = await _converse.api.disco.entities.create(jid, {'ignore_cache': true}); entity = await api.disco.entities.create(jid, {'ignore_cache': true});
} }
return entity.waitUntilFeaturesDiscovered; return entity.waitUntilFeaturesDiscovered;
}, },
/** /**
* @deprecated Use {@link _converse.api.disco.refresh} instead. * @deprecated Use {@link api.disco.refresh} instead.
* @method _converse.api.disco.refreshFeatures * @method api.disco.refreshFeatures
*/ */
refreshFeatures (jid) { refreshFeatures (jid) {
return _converse.api.refresh(jid); return api.refresh(jid);
}, },
/** /**
* Return all the features associated with a disco entity * Return all the features associated with a disco entity
* *
* @method _converse.api.disco.getFeatures * @method api.disco.getFeatures
* @param {string} jid The JID of the entity whose features are returned. * @param {string} jid The JID of the entity whose features are returned.
* @returns {promise} A promise which resolves with the returned features * @returns {promise} A promise which resolves with the returned features
* @example * @example
* const features = await _converse.api.disco.getFeatures('room@conference.example.org'); * const features = await api.disco.getFeatures('room@conference.example.org');
*/ */
async getFeatures (jid) { async getFeatures (jid) {
if (!jid) { if (!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');
} }
await _converse.api.waitUntil('discoInitialized'); await api.waitUntil('discoInitialized');
let entity = await _converse.api.disco.entities.get(jid, true); let entity = await api.disco.entities.get(jid, true);
entity = await entity.waitUntilFeaturesDiscovered; entity = await entity.waitUntilFeaturesDiscovered;
return entity.features; return entity.features;
}, },
...@@ -752,17 +753,17 @@ converse.plugins.add('converse-disco', { ...@@ -752,17 +753,17 @@ converse.plugins.add('converse-disco', {
* *
* See [XEP-0129: Service Discovery Extensions](https://xmpp.org/extensions/xep-0128.html) * See [XEP-0129: Service Discovery Extensions](https://xmpp.org/extensions/xep-0128.html)
* *
* @method _converse.api.disco.getFields * @method api.disco.getFields
* @param {string} jid The JID of the entity whose fields are returned. * @param {string} jid The JID of the entity whose fields are returned.
* @example * @example
* const fields = await _converse.api.disco.getFields('room@conference.example.org'); * const fields = await api.disco.getFields('room@conference.example.org');
*/ */
async getFields (jid) { async getFields (jid) {
if (!jid) { if (!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');
} }
await _converse.api.waitUntil('discoInitialized'); await api.waitUntil('discoInitialized');
let entity = await _converse.api.disco.entities.get(jid, true); let entity = await api.disco.entities.get(jid, true);
entity = await entity.waitUntilFeaturesDiscovered; entity = await entity.waitUntilFeaturesDiscovered;
return entity.fields; return entity.fields;
}, },
...@@ -775,7 +776,7 @@ converse.plugins.add('converse-disco', { ...@@ -775,7 +776,7 @@ converse.plugins.add('converse-disco', {
* `category='pubsub'` and `type='pep'` as explained in this section of * `category='pubsub'` and `type='pep'` as explained in this section of
* XEP-0163: https://xmpp.org/extensions/xep-0163.html#support * XEP-0163: https://xmpp.org/extensions/xep-0163.html#support
* *
* @method _converse.api.disco.getIdentity * @method api.disco.getIdentity
* @param {string} The identity category. * @param {string} The identity category.
* In the XML stanza, this is the `category` * In the XML stanza, this is the `category`
* attribute of the `<identity>` element. * attribute of the `<identity>` element.
...@@ -788,7 +789,7 @@ converse.plugins.add('converse-disco', { ...@@ -788,7 +789,7 @@ converse.plugins.add('converse-disco', {
* @returns {promise} A promise which resolves with a map indicating * @returns {promise} A promise which resolves with a map indicating
* whether an identity with a given type is provided by the entity. * whether an identity with a given type is provided by the entity.
* @example * @example
* _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then( * api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then(
* function (identity) { * function (identity) {
* if (identity) { * if (identity) {
* // The entity DOES have this identity * // The entity DOES have this identity
...@@ -799,8 +800,8 @@ converse.plugins.add('converse-disco', { ...@@ -799,8 +800,8 @@ converse.plugins.add('converse-disco', {
* ).catch(e => log.error(e)); * ).catch(e => log.error(e));
*/ */
async getIdentity (category, type, jid) { async getIdentity (category, type, jid) {
const e = await _converse.api.disco.entities.get(jid, true); const e = await api.disco.entities.get(jid, true);
if (e === undefined && !_converse.api.connection.connected()) { if (e === undefined && !api.connection.connected()) {
// Happens during tests when disco lookups happen asynchronously after teardown. // Happens during tests when disco lookups happen asynchronously after teardown.
const msg = `Tried to look up category ${category} for ${jid} but _converse.disco_entities has been torn down`; const msg = `Tried to look up category ${category} for ${jid} but _converse.disco_entities has been torn down`;
log.warn(msg); log.warn(msg);
......
...@@ -61,9 +61,10 @@ converse.plugins.add('converse-emoji', { ...@@ -61,9 +61,10 @@ converse.plugins.add('converse-emoji', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
const { ___ } = _converse; const { ___ } = _converse;
_converse.api.settings.update({ api.settings.update({
'emoji_image_path': twemoji.default.base, 'emoji_image_path': twemoji.default.base,
'emoji_categories': { 'emoji_categories': {
"smileys": ":grinning:", "smileys": ":grinning:",
...@@ -98,8 +99,8 @@ converse.plugins.add('converse-emoji', { ...@@ -98,8 +99,8 @@ converse.plugins.add('converse-emoji', {
}); });
_converse.emojis = {}; _converse.emojis = {};
_converse.api.promises.add('emojisInitialized', false); api.promises.add('emojisInitialized', false);
twemoji.default.base = _converse.api.settings.get('emoji_image_path'); twemoji.default.base = api.settings.get('emoji_image_path');
/** /**
...@@ -162,7 +163,7 @@ converse.plugins.add('converse-emoji', { ...@@ -162,7 +163,7 @@ converse.plugins.add('converse-emoji', {
} }
}; };
const transform = u.shortnamesToEmojis; const transform = u.shortnamesToEmojis;
return _converse.api.settings.get('use_system_emojis') ? transform : text => twemoji.default.parse(transform(text), how); return api.settings.get('use_system_emojis') ? transform : text => twemoji.default.parse(transform(text), how);
}, },
/** /**
...@@ -263,18 +264,18 @@ converse.plugins.add('converse-emoji', { ...@@ -263,18 +264,18 @@ converse.plugins.add('converse-emoji', {
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
// We extend the default converse.js API to add methods specific to MUC groupchats. // We extend the default converse.js API to add methods specific to MUC groupchats.
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The "rooms" namespace groups methods relevant to chatrooms * The "rooms" namespace groups methods relevant to chatrooms
* (aka groupchats). * (aka groupchats).
* *
* @namespace _converse.api.rooms * @namespace api.rooms
* @memberOf _converse.api * @memberOf api
*/ */
emojis: { emojis: {
/** /**
* Initializes Emoji support by downloading the emojis JSON (and any applicable images). * Initializes Emoji support by downloading the emojis JSON (and any applicable images).
* @method _converse.api.emojis.initialize * @method api.emojis.initialize
* @returns {Promise} * @returns {Promise}
*/ */
async initialize () { async initialize () {
...@@ -300,7 +301,7 @@ converse.plugins.add('converse-emoji', { ...@@ -300,7 +301,7 @@ converse.plugins.add('converse-emoji', {
* fetched and its save to start calling emoji utility methods. * fetched and its save to start calling emoji utility methods.
* @event _converse#emojisInitialized * @event _converse#emojisInitialized
*/ */
_converse.api.trigger('emojisInitialized'); api.trigger('emojisInitialized');
} }
} }
}); });
......
...@@ -47,6 +47,7 @@ converse.plugins.add('converse-headlines', { ...@@ -47,6 +47,7 @@ converse.plugins.add('converse-headlines', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
/** /**
* Shows headline messages * Shows headline messages
...@@ -58,7 +59,7 @@ converse.plugins.add('converse-headlines', { ...@@ -58,7 +59,7 @@ converse.plugins.add('converse-headlines', {
defaults () { defaults () {
return { return {
'bookmarked': false, 'bookmarked': false,
'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")), 'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
'message_type': 'headline', 'message_type': 'headline',
'num_unread': 0, 'num_unread': 0,
'time_opened': this.get('time_opened') || (new Date()).getTime(), 'time_opened': this.get('time_opened') || (new Date()).getTime(),
...@@ -75,7 +76,7 @@ converse.plugins.add('converse-headlines', { ...@@ -75,7 +76,7 @@ converse.plugins.add('converse-headlines', {
* @type { _converse.HeadlinesBox } * @type { _converse.HeadlinesBox }
* @example _converse.api.listen.on('headlinesBoxInitialized', model => { ... }); * @example _converse.api.listen.on('headlinesBoxInitialized', model => { ... });
*/ */
_converse.api.trigger('headlinesBoxInitialized', this); api.trigger('headlinesBoxInitialized', this);
} }
}); });
...@@ -85,7 +86,7 @@ converse.plugins.add('converse-headlines', { ...@@ -85,7 +86,7 @@ converse.plugins.add('converse-headlines', {
const from_jid = message.getAttribute('from'); const from_jid = message.getAttribute('from');
if (from_jid.includes('@') && if (from_jid.includes('@') &&
!_converse.roster.get(from_jid) && !_converse.roster.get(from_jid) &&
!_converse.api.settings.get("allow_non_roster_messaging")) { !api.settings.get("allow_non_roster_messaging")) {
return; return;
} }
if (message.querySelector('body') === null) { if (message.querySelector('body') === null) {
...@@ -100,7 +101,7 @@ converse.plugins.add('converse-headlines', { ...@@ -100,7 +101,7 @@ converse.plugins.add('converse-headlines', {
}); });
const attrs = await chatbox.getMessageAttributesFromStanza(message, message); const attrs = await chatbox.getMessageAttributesFromStanza(message, message);
await chatbox.createMessage(attrs); await chatbox.createMessage(attrs);
_converse.api.trigger('message', {'chatbox': chatbox, 'stanza': message}); api.trigger('message', {'chatbox': chatbox, 'stanza': message});
} }
} }
...@@ -112,26 +113,26 @@ converse.plugins.add('converse-headlines', { ...@@ -112,26 +113,26 @@ converse.plugins.add('converse-headlines', {
return true return true
}, null, 'message'); }, null, 'message');
} }
_converse.api.listen.on('connected', registerHeadlineHandler); api.listen.on('connected', registerHeadlineHandler);
_converse.api.listen.on('reconnected', registerHeadlineHandler); api.listen.on('reconnected', registerHeadlineHandler);
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The "headlines" namespace, which is used for headline-channels * The "headlines" namespace, which is used for headline-channels
* which are read-only channels containing messages of type * which are read-only channels containing messages of type
* "headline". * "headline".
* *
* @namespace _converse.api.headlines * @namespace api.headlines
* @memberOf _converse.api * @memberOf api
*/ */
headlines: { headlines: {
/** /**
* Retrieves a headline-channel or all headline-channels. * Retrieves a headline-channel or all headline-channels.
* *
* @method _converse.api.headlines.get * @method api.headlines.get
* @param {String|String[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com'] * @param {String|String[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model. * @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [create=false] - Whether the chat should be created if it's not found. * @param {Boolean} [create=false] - Whether the chat should be created if it's not found.
...@@ -139,9 +140,9 @@ converse.plugins.add('converse-headlines', { ...@@ -139,9 +140,9 @@ converse.plugins.add('converse-headlines', {
*/ */
async get (jids, attrs={}, create=false) { async get (jids, attrs={}, create=false) {
async function _get (jid) { async function _get (jid) {
let model = await _converse.api.chatboxes.get(jid); let model = await api.chatboxes.get(jid);
if (!model && create) { if (!model && create) {
model = await _converse.api.chatboxes.create(jid, attrs, _converse.HeadlinesBox); model = await api.chatboxes.create(jid, attrs, _converse.HeadlinesBox);
} else { } else {
model = (model && model.get('type') === _converse.HEADLINES_TYPE) ? model : null; model = (model && model.get('type') === _converse.HEADLINES_TYPE) ? model : null;
if (model && Object.keys(attrs).length) { if (model && Object.keys(attrs).length) {
...@@ -151,7 +152,7 @@ converse.plugins.add('converse-headlines', { ...@@ -151,7 +152,7 @@ converse.plugins.add('converse-headlines', {
return model; return model;
} }
if (jids === undefined) { if (jids === undefined) {
const chats = await _converse.api.chatboxes.get(); const chats = await api.chatboxes.get();
return chats.filter(c => (c.get('type') === _converse.HEADLINES_TYPE)); return chats.filter(c => (c.get('type') === _converse.HEADLINES_TYPE));
} else if (isString(jids)) { } else if (isString(jids)) {
return _get(jids); return _get(jids);
......
...@@ -28,8 +28,9 @@ converse.plugins.add('converse-mam', { ...@@ -28,8 +28,9 @@ converse.plugins.add('converse-mam', {
* loaded by Converse.js's plugin machinery. * loaded by Converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({ api.settings.update({
archived_messages_page_size: '50', archived_messages_page_size: '50',
message_archiving: undefined, // Supported values are 'always', 'never', 'roster' (https://xmpp.org/extensions/xep-0313.html#prefs) message_archiving: undefined, // Supported values are 'always', 'never', 'roster' (https://xmpp.org/extensions/xep-0313.html#prefs)
message_archiving_timeout: 20000, // Time (in milliseconds) to wait before aborting MAM request message_archiving_timeout: 20000, // Time (in milliseconds) to wait before aborting MAM request
...@@ -85,18 +86,18 @@ converse.plugins.add('converse-mam', { ...@@ -85,18 +86,18 @@ converse.plugins.add('converse-mam', {
} }
const is_groupchat = this.get('type') === _converse.CHATROOMS_TYPE; const is_groupchat = this.get('type') === _converse.CHATROOMS_TYPE;
const mam_jid = is_groupchat ? this.get('jid') : _converse.bare_jid; const mam_jid = is_groupchat ? this.get('jid') : _converse.bare_jid;
if (!(await _converse.api.disco.supports(Strophe.NS.MAM, mam_jid))) { if (!(await api.disco.supports(Strophe.NS.MAM, mam_jid))) {
return; return;
} }
const msg_handler = is_groupchat ? s => this.queueMessage(s) : s => _converse.handleMessageStanza(s); const msg_handler = is_groupchat ? s => this.queueMessage(s) : s => _converse.handleMessageStanza(s);
const query = Object.assign({ const query = Object.assign({
'groupchat': is_groupchat, 'groupchat': is_groupchat,
'max': _converse.api.settings.get('archived_messages_page_size'), 'max': api.settings.get('archived_messages_page_size'),
'with': this.get('jid'), 'with': this.get('jid'),
}, options); }, options);
const result = await _converse.api.archive.query(query); const result = await api.archive.query(query);
/* eslint-disable no-await-in-loop */ /* eslint-disable no-await-in-loop */
for (const message of result.messages) { for (const message of result.messages) {
try { try {
...@@ -113,9 +114,9 @@ converse.plugins.add('converse-mam', { ...@@ -113,9 +114,9 @@ converse.plugins.add('converse-mam', {
if (page && result.rsm) { if (page && result.rsm) {
if (page === 'forwards') { if (page === 'forwards') {
options = result.rsm.next(_converse.api.settings.get('archived_messages_page_size'), options.before); options = result.rsm.next(api.settings.get('archived_messages_page_size'), options.before);
} else if (page === 'backwards') { } else if (page === 'backwards') {
options = result.rsm.previous(_converse.api.settings.get('archived_messages_page_size'), options.after); options = result.rsm.previous(api.settings.get('archived_messages_page_size'), options.after);
} }
return this.fetchArchivedMessages(options, page); return this.fetchArchivedMessages(options, page);
} else { } else {
...@@ -150,32 +151,32 @@ converse.plugins.add('converse-mam', { ...@@ -150,32 +151,32 @@ converse.plugins.add('converse-mam', {
*/ */
const preference = sizzle(`prefs[xmlns="${Strophe.NS.MAM}"]`, iq).pop(); const preference = sizzle(`prefs[xmlns="${Strophe.NS.MAM}"]`, iq).pop();
const default_pref = preference.getAttribute('default'); const default_pref = preference.getAttribute('default');
if (default_pref !== _converse.api.settings.get('message_archiving')) { if (default_pref !== api.settings.get('message_archiving')) {
const stanza = $iq({'type': 'set'}) const stanza = $iq({'type': 'set'})
.c('prefs', { .c('prefs', {
'xmlns':Strophe.NS.MAM, 'xmlns':Strophe.NS.MAM,
'default':_converse.api.settings.get('message_archiving') 'default':api.settings.get('message_archiving')
}); });
Array.from(preference.children).forEach(child => stanza.cnode(child).up()); Array.from(preference.children).forEach(child => stanza.cnode(child).up());
// XXX: Strictly speaking, the server should respond with the updated prefs // XXX: Strictly speaking, the server should respond with the updated prefs
// (see example 18: https://xmpp.org/extensions/xep-0313.html#config) // (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
// but Prosody doesn't do this, so we don't rely on it. // but Prosody doesn't do this, so we don't rely on it.
_converse.api.sendIQ(stanza) api.sendIQ(stanza)
.then(() => feature.save({'preferences': {'default':_converse.api.settings.get('message_archiving')}})) .then(() => feature.save({'preferences': {'default':api.settings.get('message_archiving')}}))
.catch(_converse.onMAMError); .catch(_converse.onMAMError);
} else { } else {
feature.save({'preferences': {'default':_converse.api.settings.get('message_archiving')}}); feature.save({'preferences': {'default':api.settings.get('message_archiving')}});
} }
}; };
function getMAMPrefsFromFeature (feature) { function getMAMPrefsFromFeature (feature) {
const prefs = feature.get('preferences') || {}; const prefs = feature.get('preferences') || {};
if (feature.get('var') !== Strophe.NS.MAM || _converse.api.settings.get('message_archiving') === undefined) { if (feature.get('var') !== Strophe.NS.MAM || api.settings.get('message_archiving') === undefined) {
return; return;
} }
if (prefs['default'] !== _converse.api.settings.get('message_archiving')) { if (prefs['default'] !== api.settings.get('message_archiving')) {
_converse.api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM})) api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}))
.then(iq => _converse.onMAMPreferences(iq, feature)) .then(iq => _converse.onMAMPreferences(iq, feature))
.catch(_converse.onMAMError); .catch(_converse.onMAMError);
} }
...@@ -193,26 +194,26 @@ converse.plugins.add('converse-mam', { ...@@ -193,26 +194,26 @@ converse.plugins.add('converse-mam', {
} }
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.MAM)); api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.MAM));
_converse.api.listen.on('serviceDiscovered', getMAMPrefsFromFeature); api.listen.on('serviceDiscovered', getMAMPrefsFromFeature);
_converse.api.listen.on('chatRoomViewInitialized', view => { api.listen.on('chatRoomViewInitialized', view => {
if (_converse.muc_show_logs_before_join) { if (_converse.muc_show_logs_before_join) {
// If we want to show MAM logs before entering the MUC, we need // If we want to show MAM logs before entering the MUC, we need
// to be informed once it's clear that this MUC supports MAM. // to be informed once it's clear that this MUC supports MAM.
view.model.features.on('change:mam_enabled', preMUCJoinMAMFetch(view.model)); view.model.features.on('change:mam_enabled', preMUCJoinMAMFetch(view.model));
} }
}); });
_converse.api.listen.on('enteredNewRoom', room => room.features.get('mam_enabled') && room.fetchNewestMessages()); api.listen.on('enteredNewRoom', room => room.features.get('mam_enabled') && room.fetchNewestMessages());
_converse.api.listen.on('chatReconnected', chat => { api.listen.on('chatReconnected', chat => {
// XXX: For MUCs, we listen to enteredNewRoom instead // XXX: For MUCs, we listen to enteredNewRoom instead
if (chat.get('type') === _converse.PRIVATE_CHAT_TYPE) { if (chat.get('type') === _converse.PRIVATE_CHAT_TYPE) {
chat.fetchNewestMessages(); chat.fetchNewestMessages();
} }
}); });
_converse.api.listen.on('afterMessagesFetched', chat => { api.listen.on('afterMessagesFetched', chat => {
// XXX: We don't want to query MAM every time this is triggered // XXX: We don't want to query MAM every time this is triggered
// since it's not necessary when the chat is restored from cache. // since it's not necessary when the chat is restored from cache.
// (given that BOSH or SMACKS will ensure that you get messages // (given that BOSH or SMACKS will ensure that you get messages
...@@ -226,7 +227,7 @@ converse.plugins.add('converse-mam', { ...@@ -226,7 +227,7 @@ converse.plugins.add('converse-mam', {
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The [XEP-0313](https://xmpp.org/extensions/xep-0313.html) Message Archive Management API * The [XEP-0313](https://xmpp.org/extensions/xep-0313.html) Message Archive Management API
* *
...@@ -236,8 +237,8 @@ converse.plugins.add('converse-mam', { ...@@ -236,8 +237,8 @@ converse.plugins.add('converse-mam', {
* option in the configuration settings section, which you'll * option in the configuration settings section, which you'll
* usually want to use in conjunction with this API. * usually want to use in conjunction with this API.
* *
* @namespace _converse.api.archive * @namespace api.archive
* @memberOf _converse.api * @memberOf api
*/ */
'archive': { 'archive': {
/** /**
...@@ -246,7 +247,7 @@ converse.plugins.add('converse-mam', { ...@@ -246,7 +247,7 @@ converse.plugins.add('converse-mam', {
* The options parameter can also be an instance of * The options parameter can also be an instance of
* _converse.RSM to enable easy querying between results pages. * _converse.RSM to enable easy querying between results pages.
* *
* @method _converse.api.archive.query * @method api.archive.query
* @param {(Object|_converse.RSM)} options Query parameters, either * @param {(Object|_converse.RSM)} options Query parameters, either
* MAM-specific or also for Result Set Management. * MAM-specific or also for Result Set Management.
* Can be either an object or an instance of _converse.RSM. * Can be either an object or an instance of _converse.RSM.
...@@ -276,7 +277,7 @@ converse.plugins.add('converse-mam', { ...@@ -276,7 +277,7 @@ converse.plugins.add('converse-mam', {
* *
* let result; * let result;
* try { * try {
* result = await _converse.api.archive.query(); * result = await api.archive.query();
* } catch (e) { * } catch (e) {
* // The query was not successful, perhaps inform the user? * // The query was not successful, perhaps inform the user?
* // The IQ stanza returned by the XMPP server is passed in, so that you * // The IQ stanza returned by the XMPP server is passed in, so that you
...@@ -296,7 +297,7 @@ converse.plugins.add('converse-mam', { ...@@ -296,7 +297,7 @@ converse.plugins.add('converse-mam', {
* // For a particular user * // For a particular user
* let result; * let result;
* try { * try {
* result = await _converse.api.archive.query({'with': 'john@doe.net'}); * result = await api.archive.query({'with': 'john@doe.net'});
* } catch (e) { * } catch (e) {
* // The query was not successful * // The query was not successful
* } * }
...@@ -304,7 +305,7 @@ converse.plugins.add('converse-mam', { ...@@ -304,7 +305,7 @@ converse.plugins.add('converse-mam', {
* // For a particular room * // For a particular room
* let result; * let result;
* try { * try {
* result = await _converse.api.archive.query({'with': 'discuss@conference.doglovers.net', 'groupchat': true}); * result = await api.archive.query({'with': 'discuss@conference.doglovers.net', 'groupchat': true});
* } catch (e) { * } catch (e) {
* // The query was not successful * // The query was not successful
* } * }
...@@ -324,7 +325,7 @@ converse.plugins.add('converse-mam', { ...@@ -324,7 +325,7 @@ converse.plugins.add('converse-mam', {
* }; * };
* let result; * let result;
* try { * try {
* result = await _converse.api.archive.query(options); * result = await api.archive.query(options);
* } catch (e) { * } catch (e) {
* // The query was not successful * // The query was not successful
* } * }
...@@ -339,7 +340,7 @@ converse.plugins.add('converse-mam', { ...@@ -339,7 +340,7 @@ converse.plugins.add('converse-mam', {
* // Return maximum 10 archived messages * // Return maximum 10 archived messages
* let result; * let result;
* try { * try {
* result = await _converse.api.archive.query({'with': 'john@doe.net', 'max':10}); * result = await api.archive.query({'with': 'john@doe.net', 'max':10});
* } catch (e) { * } catch (e) {
* // The query was not successful * // The query was not successful
* } * }
...@@ -363,7 +364,7 @@ converse.plugins.add('converse-mam', { ...@@ -363,7 +364,7 @@ converse.plugins.add('converse-mam', {
* *
* let result; * let result;
* try { * try {
* result = await _converse.api.archive.query({'with': 'john@doe.net', 'max':10}); * result = await api.archive.query({'with': 'john@doe.net', 'max':10});
* } catch (e) { * } catch (e) {
* // The query was not successful * // The query was not successful
* } * }
...@@ -372,7 +373,7 @@ converse.plugins.add('converse-mam', { ...@@ -372,7 +373,7 @@ converse.plugins.add('converse-mam', {
* *
* while (result.rsm) { * while (result.rsm) {
* try { * try {
* result = await _converse.api.archive.query(rsm.next(10)); * result = await api.archive.query(rsm.next(10));
* } catch (e) { * } catch (e) {
* // The query was not successful * // The query was not successful
* } * }
...@@ -391,7 +392,7 @@ converse.plugins.add('converse-mam', { ...@@ -391,7 +392,7 @@ converse.plugins.add('converse-mam', {
* *
* let result; * let result;
* try { * try {
* result = await _converse.api.archive.query({'before': '', 'max':5}); * result = await api.archive.query({'before': '', 'max':5});
* } catch (e) { * } catch (e) {
* // The query was not successful * // The query was not successful
* } * }
...@@ -400,7 +401,7 @@ converse.plugins.add('converse-mam', { ...@@ -400,7 +401,7 @@ converse.plugins.add('converse-mam', {
* *
* // Now we query again, to get the previous batch. * // Now we query again, to get the previous batch.
* try { * try {
* result = await _converse.api.archive.query(rsm.previous(5);); * result = await api.archive.query(rsm.previous(5););
* } catch (e) { * } catch (e) {
* // The query was not successful * // The query was not successful
* } * }
...@@ -409,7 +410,7 @@ converse.plugins.add('converse-mam', { ...@@ -409,7 +410,7 @@ converse.plugins.add('converse-mam', {
* *
*/ */
async query (options) { async query (options) {
if (!_converse.api.connection.connected()) { if (!api.connection.connected()) {
throw new Error('Can\'t call `api.archive.query` before having established an XMPP session'); throw new Error('Can\'t call `api.archive.query` before having established an XMPP session');
} }
const attrs = {'type':'set'}; const attrs = {'type':'set'};
...@@ -423,7 +424,7 @@ converse.plugins.add('converse-mam', { ...@@ -423,7 +424,7 @@ converse.plugins.add('converse-mam', {
} }
const jid = attrs.to || _converse.bare_jid; const jid = attrs.to || _converse.bare_jid;
const supported = await _converse.api.disco.supports(Strophe.NS.MAM, jid); const supported = await api.disco.supports(Strophe.NS.MAM, jid);
if (!supported) { if (!supported) {
log.warn(`Did not fetch MAM archive for ${jid} because it doesn't support ${Strophe.NS.MAM}`); log.warn(`Did not fetch MAM archive for ${jid} because it doesn't support ${Strophe.NS.MAM}`);
return {'messages': []}; return {'messages': []};
...@@ -479,7 +480,7 @@ converse.plugins.add('converse-mam', { ...@@ -479,7 +480,7 @@ converse.plugins.add('converse-mam', {
}, Strophe.NS.MAM); }, Strophe.NS.MAM);
let error; let error;
const iq_result = await _converse.api.sendIQ(stanza, _converse.api.settings.get('message_archiving_timeout'), false) const iq_result = await api.sendIQ(stanza, api.settings.get('message_archiving_timeout'), false)
if (iq_result === null) { if (iq_result === null) {
const err_msg = "Timeout while trying to fetch archived messages."; const err_msg = "Timeout while trying to fetch archived messages.";
log.error(err_msg); log.error(err_msg);
......
...@@ -102,13 +102,14 @@ converse.plugins.add('converse-muc', { ...@@ -102,13 +102,14 @@ converse.plugins.add('converse-muc', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
const { __, ___ } = _converse; const { __, ___ } = _converse;
// Configuration values for this plugin // Configuration values for this plugin
// ==================================== // ====================================
// Refer to docs/source/configuration.rst for explanations of these // Refer to docs/source/configuration.rst for explanations of these
// configuration settings. // configuration settings.
_converse.api.settings.update({ api.settings.update({
'allow_muc': true, 'allow_muc': true,
'allow_muc_invitations': true, 'allow_muc_invitations': true,
'auto_join_on_invite': false, 'auto_join_on_invite': false,
...@@ -122,9 +123,9 @@ converse.plugins.add('converse-muc', { ...@@ -122,9 +123,9 @@ converse.plugins.add('converse-muc', {
'muc_nickname_from_jid': false, 'muc_nickname_from_jid': false,
'muc_show_logs_before_join': false 'muc_show_logs_before_join': false
}); });
_converse.api.promises.add(['roomsAutoJoined']); api.promises.add(['roomsAutoJoined']);
if (_converse.api.settings.get('locked_muc_domain') && !isString(_converse.api.settings.get('muc_domain'))) { if (api.settings.get('locked_muc_domain') && !isString(api.settings.get('muc_domain'))) {
throw new Error("Config Error: it makes no sense to set locked_muc_domain "+ throw new Error("Config Error: it makes no sense to set locked_muc_domain "+
"to true when muc_domain is not set"); "to true when muc_domain is not set");
} }
...@@ -188,11 +189,11 @@ converse.plugins.add('converse-muc', { ...@@ -188,11 +189,11 @@ converse.plugins.add('converse-muc', {
if (!u.isValidMUCJID(jid)) { if (!u.isValidMUCJID(jid)) {
return log.warn(`invalid jid "${jid}" provided in url fragment`); return log.warn(`invalid jid "${jid}" provided in url fragment`);
} }
await _converse.api.waitUntil('roomsAutoJoined'); await api.waitUntil('roomsAutoJoined');
if (_converse.allow_bookmarks) { if (_converse.allow_bookmarks) {
await _converse.api.waitUntil('bookmarksInitialized'); await api.waitUntil('bookmarksInitialized');
} }
_converse.api.rooms.open(jid); api.rooms.open(jid);
} }
_converse.router.route('converse/room?jid=:jid', openRoom); _converse.router.route('converse/room?jid=:jid', openRoom);
...@@ -207,7 +208,7 @@ converse.plugins.add('converse-muc', { ...@@ -207,7 +208,7 @@ converse.plugins.add('converse-muc', {
const nick = _converse.xmppstatus.getNickname(); const nick = _converse.xmppstatus.getNickname();
if (nick) { if (nick) {
return nick; return nick;
} else if (_converse.api.settings.get('muc_nickname_from_jid')) { } else if (api.settings.get('muc_nickname_from_jid')) {
return Strophe.unescapeNode(Strophe.getNodeFromJid(_converse.bare_jid)); return Strophe.unescapeNode(Strophe.getNodeFromJid(_converse.bare_jid));
} }
} }
...@@ -219,7 +220,7 @@ converse.plugins.add('converse-muc', { ...@@ -219,7 +220,7 @@ converse.plugins.add('converse-muc', {
*/ */
settings.type = _converse.CHATROOMS_TYPE; settings.type = _converse.CHATROOMS_TYPE;
settings.id = jid; settings.id = jid;
const chatbox = await _converse.api.rooms.get(jid, settings, true); const chatbox = await api.rooms.get(jid, settings, true);
chatbox.maybeShow(true); chatbox.maybeShow(true);
return chatbox; return chatbox;
} }
...@@ -247,7 +248,7 @@ converse.plugins.add('converse-muc', { ...@@ -247,7 +248,7 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoomMessages} * @type { _converse.ChatRoomMessages}
* @example _converse.api.listen.on('chatRoomMessageInitialized', model => { ... }); * @example _converse.api.listen.on('chatRoomMessageInitialized', model => { ... });
*/ */
_converse.api.trigger('chatRoomMessageInitialized', this); api.trigger('chatRoomMessageInitialized', this);
}, },
/** /**
...@@ -259,7 +260,7 @@ converse.plugins.add('converse-muc', { ...@@ -259,7 +260,7 @@ converse.plugins.add('converse-muc', {
* @returns { Boolean } * @returns { Boolean }
*/ */
mayBeModerated () { mayBeModerated () {
return ['all', 'moderator'].includes(_converse.api.settings.get('allow_message_retraction')) && return ['all', 'moderator'].includes(api.settings.get('allow_message_retraction')) &&
this.collection.chatbox.canModerateMessages(); this.collection.chatbox.canModerateMessages();
}, },
...@@ -351,7 +352,7 @@ converse.plugins.add('converse-muc', { ...@@ -351,7 +352,7 @@ converse.plugins.add('converse-muc', {
'num_unread_general': 0, 'num_unread_general': 0,
'bookmarked': false, 'bookmarked': false,
'chat_state': undefined, 'chat_state': undefined,
'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")), 'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
'message_type': 'groupchat', 'message_type': 'groupchat',
'name': '', 'name': '',
'num_unread': 0, 'num_unread': 0,
...@@ -386,7 +387,7 @@ converse.plugins.add('converse-muc', { ...@@ -386,7 +387,7 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoom } * @type { _converse.ChatRoom }
* @example _converse.api.listen.on('chatRoomInitialized', model => { ... }); * @example _converse.api.listen.on('chatRoomInitialized', model => { ... });
*/ */
await _converse.api.trigger('chatRoomInitialized', this, {'Synchronous': true}); await api.trigger('chatRoomInitialized', this, {'Synchronous': true});
this.initialized.resolve(); this.initialized.resolve();
}, },
...@@ -427,7 +428,7 @@ converse.plugins.add('converse-muc', { ...@@ -427,7 +428,7 @@ converse.plugins.add('converse-muc', {
nick = await this.getAndPersistNickname(nick); nick = await this.getAndPersistNickname(nick);
if (!nick) { if (!nick) {
u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.NICKNAME_REQUIRED}); u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.NICKNAME_REQUIRED});
if (_converse.api.settings.get('muc_show_logs_before_join')) { if (api.settings.get('muc_show_logs_before_join')) {
await this.fetchMessages(); await this.fetchMessages();
} }
return this; return this;
...@@ -436,13 +437,13 @@ converse.plugins.add('converse-muc', { ...@@ -436,13 +437,13 @@ converse.plugins.add('converse-muc', {
'from': _converse.connection.jid, 'from': _converse.connection.jid,
'to': this.getRoomJIDAndNick() 'to': this.getRoomJIDAndNick()
}).c("x", {'xmlns': Strophe.NS.MUC}) }).c("x", {'xmlns': Strophe.NS.MUC})
.c("history", {'maxstanzas': this.features.get('mam_enabled') ? 0 : _converse.api.settings.get('muc_history_max_stanzas')}).up(); .c("history", {'maxstanzas': this.features.get('mam_enabled') ? 0 : api.settings.get('muc_history_max_stanzas')}).up();
if (password) { if (password) {
stanza.cnode(Strophe.xmlElement("password", [], password)); stanza.cnode(Strophe.xmlElement("password", [], password));
} }
this.session.save('connection_status', converse.ROOMSTATUS.CONNECTING); this.session.save('connection_status', converse.ROOMSTATUS.CONNECTING);
_converse.api.send(stanza); api.send(stanza);
return this; return this;
}, },
...@@ -491,10 +492,10 @@ converse.plugins.add('converse-muc', { ...@@ -491,10 +492,10 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoom} * @type { _converse.ChatRoom}
* @example _converse.api.listen.on('enteredNewRoom', model => { ... }); * @example _converse.api.listen.on('enteredNewRoom', model => { ... });
*/ */
_converse.api.trigger('enteredNewRoom', this); api.trigger('enteredNewRoom', this);
if (_converse.api.settings.get('auto_register_muc_nickname') && if (api.settings.get('auto_register_muc_nickname') &&
await _converse.api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid'))) { await api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid'))) {
this.registerNickname() this.registerNickname()
} }
} }
...@@ -618,7 +619,7 @@ converse.plugins.add('converse-muc', { ...@@ -618,7 +619,7 @@ converse.plugins.add('converse-muc', {
}, },
invitesAllowed () { invitesAllowed () {
return _converse.api.settings.get('allow_muc_invitations') && return api.settings.get('allow_muc_invitations') &&
(this.features.get('open') || (this.features.get('open') ||
this.getOwnAffiliation() === "owner" this.getOwnAffiliation() === "owner"
); );
...@@ -628,7 +629,7 @@ converse.plugins.add('converse-muc', { ...@@ -628,7 +629,7 @@ converse.plugins.add('converse-muc', {
const name = this.get('name'); const name = this.get('name');
if (name) { if (name) {
return name; return name;
} else if (_converse.api.settings.get('locked_muc_domain') === 'hidden') { } else if (api.settings.get('locked_muc_domain') === 'hidden') {
return Strophe.getNodeFromJid(this.get('jid')); return Strophe.getNodeFromJid(this.get('jid'));
} else { } else {
return this.get('jid'); return this.get('jid');
...@@ -671,7 +672,7 @@ converse.plugins.add('converse-muc', { ...@@ -671,7 +672,7 @@ converse.plugins.add('converse-muc', {
promise.reject(stanza); promise.reject(stanza);
} }
}, null, 'message', ['error', 'groupchat'], id); }, null, 'message', ['error', 'groupchat'], id);
_converse.api.send(el) api.send(el)
return promise; return promise;
}, },
...@@ -771,7 +772,7 @@ converse.plugins.add('converse-muc', { ...@@ -771,7 +772,7 @@ converse.plugins.add('converse-muc', {
}).c('moderate', {xmlns: Strophe.NS.MODERATE}) }).c('moderate', {xmlns: Strophe.NS.MODERATE})
.c('retract', {xmlns: Strophe.NS.RETRACT}).up() .c('retract', {xmlns: Strophe.NS.RETRACT}).up()
.c('reason').t(reason || ''); .c('reason').t(reason || '');
return _converse.api.sendIQ(iq, null, false); return api.sendIQ(iq, null, false);
}, },
/** /**
...@@ -795,7 +796,7 @@ converse.plugins.add('converse-muc', { ...@@ -795,7 +796,7 @@ converse.plugins.add('converse-muc', {
if (reason && reason.length > 0) { if (reason && reason.length > 0) {
iq.c("reason", reason); iq.c("reason", reason);
} }
return _converse.api.sendIQ(iq); return api.sendIQ(iq);
}, },
/** /**
...@@ -813,7 +814,7 @@ converse.plugins.add('converse-muc', { ...@@ -813,7 +814,7 @@ converse.plugins.add('converse-muc', {
await new Promise((success, error) => disco_entity.destroy({success, error})); await new Promise((success, error) => disco_entity.destroy({success, error}));
} }
} }
if (_converse.api.connection.connected()) { if (api.connection.connected()) {
this.sendUnavailablePresence(exit_msg); this.sendUnavailablePresence(exit_msg);
} }
u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED}); u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED});
...@@ -836,7 +837,7 @@ converse.plugins.add('converse-muc', { ...@@ -836,7 +837,7 @@ converse.plugins.add('converse-muc', {
canModerateMessages () { canModerateMessages () {
const self = this.getOwnOccupant(); const self = this.getOwnOccupant();
return self && self.isModerator() && _converse.api.disco.supports(Strophe.NS.MODERATE, this.get('jid')); return self && self.isModerator() && api.disco.supports(Strophe.NS.MODERATE, this.get('jid'));
}, },
sendUnavailablePresence (exit_msg) { sendUnavailablePresence (exit_msg) {
...@@ -986,7 +987,7 @@ converse.plugins.add('converse-muc', { ...@@ -986,7 +987,7 @@ converse.plugins.add('converse-muc', {
// <gone/> is not applicable within MUC context // <gone/> is not applicable within MUC context
return; return;
} }
_converse.api.send( api.send(
$msg({'to':this.get('jid'), 'type': 'groupchat'}) $msg({'to':this.get('jid'), 'type': 'groupchat'})
.c(chat_state, {'xmlns': Strophe.NS.CHATSTATES}).up() .c(chat_state, {'xmlns': Strophe.NS.CHATSTATES}).up()
.c('no-store', {'xmlns': Strophe.NS.HINTS}).up() .c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
...@@ -1020,7 +1021,7 @@ converse.plugins.add('converse-muc', { ...@@ -1020,7 +1021,7 @@ converse.plugins.add('converse-muc', {
'to': recipient, 'to': recipient,
'id': u.getUniqueId() 'id': u.getUniqueId()
}).c('x', attrs); }).c('x', attrs);
_converse.api.send(invitation); api.send(invitation);
/** /**
* After the user has sent out a direct invitation (as per XEP-0249), * After the user has sent out a direct invitation (as per XEP-0249),
* to a roster contact, asking them to join a room. * to a roster contact, asking them to join a room.
...@@ -1031,7 +1032,7 @@ converse.plugins.add('converse-muc', { ...@@ -1031,7 +1032,7 @@ converse.plugins.add('converse-muc', {
* @property {string} reason - The original reason for the invitation * @property {string} reason - The original reason for the invitation
* @example _converse.api.listen.on('chatBoxMaximized', view => { ... }); * @example _converse.api.listen.on('chatBoxMaximized', view => { ... });
*/ */
_converse.api.trigger('roomInviteSent', { api.trigger('roomInviteSent', {
'room': this, 'room': this,
'recipient': recipient, 'recipient': recipient,
'reason': reason 'reason': reason
...@@ -1046,7 +1047,7 @@ converse.plugins.add('converse-muc', { ...@@ -1046,7 +1047,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise} * @returns {Promise}
*/ */
refreshDiscoInfo () { refreshDiscoInfo () {
return _converse.api.disco.refresh(this.get('jid')) return api.disco.refresh(this.get('jid'))
.then(() => this.getDiscoInfo()) .then(() => this.getDiscoInfo())
.catch(e => log.error(e)); .catch(e => log.error(e));
}, },
...@@ -1059,7 +1060,7 @@ converse.plugins.add('converse-muc', { ...@@ -1059,7 +1060,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise} * @returns {Promise}
*/ */
getDiscoInfo () { getDiscoInfo () {
return _converse.api.disco.getIdentity('conference', 'text', this.get('jid')) return api.disco.getIdentity('conference', 'text', this.get('jid'))
.then(identity => this.save({'name': identity && identity.get('name')})) .then(identity => this.save({'name': identity && identity.get('name')}))
.then(() => this.getDiscoInfoFields()) .then(() => this.getDiscoInfoFields())
.then(() => this.getDiscoInfoFeatures()) .then(() => this.getDiscoInfoFeatures())
...@@ -1075,7 +1076,7 @@ converse.plugins.add('converse-muc', { ...@@ -1075,7 +1076,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise} * @returns {Promise}
*/ */
async getDiscoInfoFields () { async getDiscoInfoFields () {
const fields = await _converse.api.disco.getFields(this.get('jid')); const fields = await api.disco.getFields(this.get('jid'));
const config = fields.reduce((config, f) => { const config = fields.reduce((config, f) => {
const name = f.get('var'); const name = f.get('var');
if (name && name.startsWith('muc#roominfo_')) { if (name && name.startsWith('muc#roominfo_')) {
...@@ -1095,7 +1096,7 @@ converse.plugins.add('converse-muc', { ...@@ -1095,7 +1096,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise} * @returns {Promise}
*/ */
async getDiscoInfoFeatures () { async getDiscoInfoFeatures () {
const features = await _converse.api.disco.getFeatures(this.get('jid')); const features = await api.disco.getFeatures(this.get('jid'));
const attrs = Object.assign( const attrs = Object.assign(
zipObject(converse.ROOM_FEATURES, converse.ROOM_FEATURES.map(() => false)), zipObject(converse.ROOM_FEATURES, converse.ROOM_FEATURES.map(() => false)),
{'fetched': (new Date()).toISOString()} {'fetched': (new Date()).toISOString()}
...@@ -1194,7 +1195,7 @@ converse.plugins.add('converse-muc', { ...@@ -1194,7 +1195,7 @@ converse.plugins.add('converse-muc', {
* @returns { Promise<XMLElement> } * @returns { Promise<XMLElement> }
*/ */
fetchRoomConfiguration () { fetchRoomConfiguration () {
return _converse.api.sendIQ( return api.sendIQ(
$iq({'to': this.get('jid'), 'type': "get"}) $iq({'to': this.get('jid'), 'type': "get"})
.c("query", {xmlns: Strophe.NS.MUC_OWNER}) .c("query", {xmlns: Strophe.NS.MUC_OWNER})
); );
...@@ -1213,7 +1214,7 @@ converse.plugins.add('converse-muc', { ...@@ -1213,7 +1214,7 @@ converse.plugins.add('converse-muc', {
.c("query", {xmlns: Strophe.NS.MUC_OWNER}) .c("query", {xmlns: Strophe.NS.MUC_OWNER})
.c("x", {xmlns: Strophe.NS.XFORM, type: "submit"}); .c("x", {xmlns: Strophe.NS.XFORM, type: "submit"});
config.forEach(node => iq.cnode(node).up()); config.forEach(node => iq.cnode(node).up());
return _converse.api.sendIQ(iq); return api.sendIQ(iq);
}, },
/** /**
...@@ -1267,7 +1268,7 @@ converse.plugins.add('converse-muc', { ...@@ -1267,7 +1268,7 @@ converse.plugins.add('converse-muc', {
if (member.reason !== undefined) { if (member.reason !== undefined) {
iq.c("reason", member.reason); iq.c("reason", member.reason);
} }
return _converse.api.sendIQ(iq); return api.sendIQ(iq);
}, },
/** /**
...@@ -1309,7 +1310,7 @@ converse.plugins.add('converse-muc', { ...@@ -1309,7 +1310,7 @@ converse.plugins.add('converse-muc', {
if (reason !== null) { if (reason !== null) {
iq.c("reason", reason); iq.c("reason", reason);
} }
return _converse.api.sendIQ(iq).then(onSuccess).catch(onError); return api.sendIQ(iq).then(onSuccess).catch(onError);
}, },
/** /**
...@@ -1388,7 +1389,7 @@ converse.plugins.add('converse-muc', { ...@@ -1388,7 +1389,7 @@ converse.plugins.add('converse-muc', {
const iq = $iq({to: this.get('jid'), type: "get"}) const iq = $iq({to: this.get('jid'), type: "get"})
.c("query", {xmlns: Strophe.NS.MUC_ADMIN}) .c("query", {xmlns: Strophe.NS.MUC_ADMIN})
.c("item", {'affiliation': affiliation}); .c("item", {'affiliation': affiliation});
const result = await _converse.api.sendIQ(iq, null, false); const result = await api.sendIQ(iq, null, false);
if (result === null) { if (result === null) {
const err_msg = `Error: timeout while fetching ${affiliation} list for MUC ${this.get('jid')}`; const err_msg = `Error: timeout while fetching ${affiliation} list for MUC ${this.get('jid')}`;
const err = new Error(err_msg); const err = new Error(err_msg);
...@@ -1466,7 +1467,7 @@ converse.plugins.add('converse-muc', { ...@@ -1466,7 +1467,7 @@ converse.plugins.add('converse-muc', {
'xmlns': Strophe.NS.DISCO_INFO, 'xmlns': Strophe.NS.DISCO_INFO,
'node': 'x-roomuser-item' 'node': 'x-roomuser-item'
}) })
const result = await _converse.api.sendIQ(stanza, null, false); const result = await api.sendIQ(stanza, null, false);
if (u.isErrorObject(result)) { if (u.isErrorObject(result)) {
throw result; throw result;
} }
...@@ -1480,7 +1481,7 @@ converse.plugins.add('converse-muc', { ...@@ -1480,7 +1481,7 @@ converse.plugins.add('converse-muc', {
const jid = this.get('jid'); const jid = this.get('jid');
let iq, err_msg; let iq, err_msg;
try { try {
iq = await _converse.api.sendIQ( iq = await api.sendIQ(
$iq({ $iq({
'to': jid, 'to': jid,
'from': _converse.connection.jid, 'from': _converse.connection.jid,
...@@ -1501,7 +1502,7 @@ converse.plugins.add('converse-muc', { ...@@ -1501,7 +1502,7 @@ converse.plugins.add('converse-muc', {
return log.error(`Can't register the user register in the groupchat ${jid} due to the required fields`); return log.error(`Can't register the user register in the groupchat ${jid} due to the required fields`);
} }
try { try {
await _converse.api.sendIQ($iq({ await api.sendIQ($iq({
'to': jid, 'to': jid,
'from': _converse.connection.jid, 'from': _converse.connection.jid,
'type': 'set' 'type': 'set'
...@@ -1675,7 +1676,7 @@ converse.plugins.add('converse-muc', { ...@@ -1675,7 +1676,7 @@ converse.plugins.add('converse-muc', {
* @param { String } value * @param { String } value
*/ */
setSubject(value='') { setSubject(value='') {
_converse.api.send( api.send(
$msg({ $msg({
to: this.get('jid'), to: this.get('jid'),
from: _converse.connection.jid, from: _converse.connection.jid,
...@@ -1749,7 +1750,7 @@ converse.plugins.add('converse-muc', { ...@@ -1749,7 +1750,7 @@ converse.plugins.add('converse-muc', {
'type': "get" 'type': "get"
}).c("ping", {'xmlns': Strophe.NS.PING}); }).c("ping", {'xmlns': Strophe.NS.PING});
try { try {
await _converse.api.sendIQ(ping); await api.sendIQ(ping);
} catch (e) { } catch (e) {
if (e === null) { if (e === null) {
log.error(`Timeout error while checking whether we're joined to MUC: ${this.get('jid')}`); log.error(`Timeout error while checking whether we're joined to MUC: ${this.get('jid')}`);
...@@ -1950,14 +1951,14 @@ converse.plugins.add('converse-muc', { ...@@ -1950,14 +1951,14 @@ converse.plugins.add('converse-muc', {
this.updateMessage(message, original_stanza); this.updateMessage(message, original_stanza);
} }
if (message || stanza_utils.isReceipt(stanza) || stanza_utils.isChatMarker(stanza)) { if (message || stanza_utils.isReceipt(stanza) || stanza_utils.isChatMarker(stanza)) {
return _converse.api.trigger('message', {'stanza': original_stanza}); return api.trigger('message', {'stanza': original_stanza});
} }
if (await this.handleRetraction(attrs) || if (await this.handleRetraction(attrs) ||
await this.handleModeration(attrs) || await this.handleModeration(attrs) ||
this.subjectChangeHandled(attrs) || this.subjectChangeHandled(attrs) ||
this.ignorableCSN(attrs)) { this.ignorableCSN(attrs)) {
return _converse.api.trigger('message', {'stanza': original_stanza}); return api.trigger('message', {'stanza': original_stanza});
} }
this.setEditable(attrs, attrs.time); this.setEditable(attrs, attrs.time);
...@@ -1968,7 +1969,7 @@ converse.plugins.add('converse-muc', { ...@@ -1968,7 +1969,7 @@ converse.plugins.add('converse-muc', {
const msg = this.handleCorrection(attrs) || await this.createMessage(attrs); const msg = this.handleCorrection(attrs) || await this.createMessage(attrs);
this.incrementUnreadMsgCounter(msg); this.incrementUnreadMsgCounter(msg);
} }
_converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': this}); api.trigger('message', {'stanza': original_stanza, 'chatbox': this});
}, },
handleModifyError(pres) { handleModifyError(pres) {
...@@ -2089,7 +2090,7 @@ converse.plugins.add('converse-muc', { ...@@ -2089,7 +2090,7 @@ converse.plugins.add('converse-muc', {
onNicknameClash (presence) { onNicknameClash (presence) {
if (_converse.api.settings.get('muc_nickname_from_jid')) { if (api.settings.get('muc_nickname_from_jid')) {
const nick = presence.getAttribute('from').split('/')[1]; const nick = presence.getAttribute('from').split('/')[1];
if (nick === _converse.getDefaultMUCNickname()) { if (nick === _converse.getDefaultMUCNickname()) {
this.join(nick + '-2'); this.join(nick + '-2');
...@@ -2216,7 +2217,7 @@ converse.plugins.add('converse-muc', { ...@@ -2216,7 +2217,7 @@ converse.plugins.add('converse-muc', {
if (locked_room) { if (locked_room) {
if (this.get('auto_configure')) { if (this.get('auto_configure')) {
this.autoConfigureChatRoom().then(() => this.refreshDiscoInfo()); this.autoConfigureChatRoom().then(() => this.refreshDiscoInfo());
} else if (_converse.api.settings.get('muc_instant_rooms')) { } else if (api.settings.get('muc_instant_rooms')) {
// Accept default configuration // Accept default configuration
this.sendConfiguration().then(() => this.refreshDiscoInfo()); this.sendConfiguration().then(() => this.refreshDiscoInfo());
} else { } else {
...@@ -2320,7 +2321,7 @@ converse.plugins.add('converse-muc', { ...@@ -2320,7 +2321,7 @@ converse.plugins.add('converse-muc', {
vcards.filter(v => v).forEach(vcard => { vcards.filter(v => v).forEach(vcard => {
if (hash && vcard.get('image_hash') !== hash) { if (hash && vcard.get('image_hash') !== hash) {
_converse.api.vcard.update(vcard, true); api.vcard.update(vcard, true);
} }
}); });
}, },
...@@ -2359,7 +2360,7 @@ converse.plugins.add('converse-muc', { ...@@ -2359,7 +2360,7 @@ converse.plugins.add('converse-muc', {
}, },
getAutoFetchedAffiliationLists () { getAutoFetchedAffiliationLists () {
const affs = _converse.api.settings.get('muc_fetch_members'); const affs = api.settings.get('muc_fetch_members');
return Array.isArray(affs) ? affs : (affs ? ['member', 'admin', 'owner'] : []); return Array.isArray(affs) ? affs : (affs ? ['member', 'admin', 'owner'] : []);
}, },
...@@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc', { ...@@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc', {
* @event _converse#membersFetched * @event _converse#membersFetched
* @example _converse.api.listen.on('membersFetched', () => { ... }); * @example _converse.api.listen.on('membersFetched', () => { ... });
*/ */
_converse.api.trigger('membersFetched'); api.trigger('membersFetched');
}, },
findOccupant (data) { findOccupant (data) {
...@@ -2426,13 +2427,13 @@ converse.plugins.add('converse-muc', { ...@@ -2426,13 +2427,13 @@ converse.plugins.add('converse-muc', {
_converse.RoomsPanelModel = Model.extend({ _converse.RoomsPanelModel = Model.extend({
defaults: function () { defaults: function () {
return { return {
'muc_domain': _converse.api.settings.get('muc_domain'), 'muc_domain': api.settings.get('muc_domain'),
'nick': _converse.getDefaultMUCNickname() 'nick': _converse.getDefaultMUCNickname()
} }
}, },
setDomain (jid) { setDomain (jid) {
if (!_converse.api.settings.get('locked_muc_domain')) { if (!api.settings.get('locked_muc_domain')) {
this.save('muc_domain', Strophe.getDomainFromJid(jid)); this.save('muc_domain', Strophe.getDomainFromJid(jid));
} }
} }
...@@ -2453,7 +2454,7 @@ converse.plugins.add('converse-muc', { ...@@ -2453,7 +2454,7 @@ converse.plugins.add('converse-muc', {
reason = x_el.getAttribute('reason'); reason = x_el.getAttribute('reason');
let result; let result;
if (_converse.api.settings.get('auto_join_on_invite')) { if (api.settings.get('auto_join_on_invite')) {
result = true; result = true;
} else { } else {
// Invite request might come from someone not your roster list // Invite request might come from someone not your roster list
...@@ -2478,7 +2479,7 @@ converse.plugins.add('converse-muc', { ...@@ -2478,7 +2479,7 @@ converse.plugins.add('converse-muc', {
} }
}; };
if (_converse.api.settings.get('allow_muc_invitations')) { if (api.settings.get('allow_muc_invitations')) {
const registerDirectInvitationHandler = function () { const registerDirectInvitationHandler = function () {
_converse.connection.addHandler( _converse.connection.addHandler(
(message) => { (message) => {
...@@ -2486,15 +2487,15 @@ converse.plugins.add('converse-muc', { ...@@ -2486,15 +2487,15 @@ converse.plugins.add('converse-muc', {
return true; return true;
}, 'jabber:x:conference', 'message'); }, 'jabber:x:conference', 'message');
}; };
_converse.api.listen.on('connected', registerDirectInvitationHandler); api.listen.on('connected', registerDirectInvitationHandler);
_converse.api.listen.on('reconnected', registerDirectInvitationHandler); api.listen.on('reconnected', registerDirectInvitationHandler);
} }
const createChatRoom = function (jid, attrs) { const createChatRoom = function (jid, attrs) {
if (jid.startsWith('xmpp:') && jid.endsWith('?join')) { if (jid.startsWith('xmpp:') && jid.endsWith('?join')) {
jid = jid.replace(/^xmpp:/, '').replace(/\?join$/, ''); jid = jid.replace(/^xmpp:/, '').replace(/\?join$/, '');
} }
return _converse.api.rooms.get(jid, attrs, true); return api.rooms.get(jid, attrs, true);
}; };
/** /**
...@@ -2504,14 +2505,14 @@ converse.plugins.add('converse-muc', { ...@@ -2504,14 +2505,14 @@ converse.plugins.add('converse-muc', {
* settings). * settings).
*/ */
function autoJoinRooms () { function autoJoinRooms () {
_converse.api.settings.get('auto_join_rooms').forEach(groupchat => { api.settings.get('auto_join_rooms').forEach(groupchat => {
if (isString(groupchat)) { if (isString(groupchat)) {
if (_converse.chatboxes.where({'jid': groupchat}).length) { if (_converse.chatboxes.where({'jid': groupchat}).length) {
return; return;
} }
_converse.api.rooms.open(groupchat); api.rooms.open(groupchat);
} else if (isObject(groupchat)) { } else if (isObject(groupchat)) {
_converse.api.rooms.open(groupchat.jid, clone(groupchat)); api.rooms.open(groupchat.jid, clone(groupchat));
} else { } else {
log.error('Invalid groupchat criteria specified for "auto_join_rooms"'); log.error('Invalid groupchat criteria specified for "auto_join_rooms"');
} }
...@@ -2523,40 +2524,40 @@ converse.plugins.add('converse-muc', { ...@@ -2523,40 +2524,40 @@ converse.plugins.add('converse-muc', {
* @example _converse.api.listen.on('roomsAutoJoined', () => { ... }); * @example _converse.api.listen.on('roomsAutoJoined', () => { ... });
* @example _converse.api.waitUntil('roomsAutoJoined').then(() => { ... }); * @example _converse.api.waitUntil('roomsAutoJoined').then(() => { ... });
*/ */
_converse.api.trigger('roomsAutoJoined'); api.trigger('roomsAutoJoined');
} }
async function onWindowStateChanged (data) { async function onWindowStateChanged (data) {
if (data.state === 'visible' && _converse.api.connection.connected()) { if (data.state === 'visible' && api.connection.connected()) {
const rooms = await _converse.api.rooms.get(); const rooms = await api.rooms.get();
rooms.forEach(room => room.rejoinIfNecessary()); rooms.forEach(room => room.rejoinIfNecessary());
} }
} }
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('beforeTearDown', () => { api.listen.on('beforeTearDown', () => {
const groupchats = _converse.chatboxes.where({'type': _converse.CHATROOMS_TYPE}); const groupchats = _converse.chatboxes.where({'type': _converse.CHATROOMS_TYPE});
groupchats.forEach(muc => u.safeSave(muc.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED})); groupchats.forEach(muc => u.safeSave(muc.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED}));
}); });
_converse.api.listen.on('windowStateChanged', onWindowStateChanged); api.listen.on('windowStateChanged', onWindowStateChanged);
_converse.api.listen.on('addClientFeatures', () => { api.listen.on('addClientFeatures', () => {
if (_converse.api.settings.get('allow_muc')) { if (api.settings.get('allow_muc')) {
_converse.api.disco.own.features.add(Strophe.NS.MUC); api.disco.own.features.add(Strophe.NS.MUC);
} }
if (_converse.api.settings.get('allow_muc_invitations')) { if (api.settings.get('allow_muc_invitations')) {
_converse.api.disco.own.features.add('jabber:x:conference'); // Invites api.disco.own.features.add('jabber:x:conference'); // Invites
} }
}); });
_converse.api.listen.on('chatBoxesFetched', autoJoinRooms); api.listen.on('chatBoxesFetched', autoJoinRooms);
_converse.api.listen.on('beforeResourceBinding', () => { api.listen.on('beforeResourceBinding', () => {
_converse.connection.addHandler(stanza => { _converse.connection.addHandler(stanza => {
const muc_jid = Strophe.getBareJidFromJid(stanza.getAttribute('from')); const muc_jid = Strophe.getBareJidFromJid(stanza.getAttribute('from'));
if (!_converse.chatboxes.get(muc_jid)) { if (!_converse.chatboxes.get(muc_jid)) {
_converse.api.waitUntil('chatBoxesFetched') api.waitUntil('chatBoxesFetched')
.then(async () => { .then(async () => {
const muc = _converse.chatboxes.get(muc_jid); const muc = _converse.chatboxes.get(muc_jid);
if (muc) { if (muc) {
...@@ -2580,11 +2581,11 @@ converse.plugins.add('converse-muc', { ...@@ -2580,11 +2581,11 @@ converse.plugins.add('converse-muc', {
.filter(m => (m.get('type') === _converse.CHATROOMS_TYPE)) .filter(m => (m.get('type') === _converse.CHATROOMS_TYPE))
.forEach(m => m.session.save({'connection_status': converse.ROOMSTATUS.DISCONNECTED})); .forEach(m => m.session.save({'connection_status': converse.ROOMSTATUS.DISCONNECTED}));
} }
_converse.api.listen.on('disconnected', disconnectChatRooms); api.listen.on('disconnected', disconnectChatRooms);
_converse.api.listen.on('statusInitialized', () => { api.listen.on('statusInitialized', () => {
window.addEventListener(_converse.unloadevent, () => { window.addEventListener(_converse.unloadevent, () => {
const using_websocket = _converse.api.connection.isType('websocket'); const using_websocket = api.connection.isType('websocket');
if (using_websocket && if (using_websocket &&
(!_converse.enable_smacks || !_converse.session.get('smacks_stream_id'))) { (!_converse.enable_smacks || !_converse.session.get('smacks_stream_id'))) {
// For non-SMACKS websocket connections, or non-resumeable // For non-SMACKS websocket connections, or non-resumeable
...@@ -2601,22 +2602,22 @@ converse.plugins.add('converse-muc', { ...@@ -2601,22 +2602,22 @@ converse.plugins.add('converse-muc', {
converse.env.muc_utils = muc_utils; converse.env.muc_utils = muc_utils;
// We extend the default converse.js API to add methods specific to MUC groupchats. // We extend the default converse.js API to add methods specific to MUC groupchats.
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* The "rooms" namespace groups methods relevant to chatrooms * The "rooms" namespace groups methods relevant to chatrooms
* (aka groupchats). * (aka groupchats).
* *
* @namespace _converse.api.rooms * @namespace api.rooms
* @memberOf _converse.api * @memberOf api
*/ */
rooms: { rooms: {
/** /**
* Creates a new MUC chatroom (aka groupchat) * Creates a new MUC chatroom (aka groupchat)
* *
* Similar to {@link _converse.api.rooms.open}, but creates * Similar to {@link api.rooms.open}, but creates
* the chatroom in the background (i.e. doesn't cause a view to open). * the chatroom in the background (i.e. doesn't cause a view to open).
* *
* @method _converse.api.rooms.create * @method api.rooms.create
* @param {(string[]|string)} jid|jids The JID or array of * @param {(string[]|string)} jid|jids The JID or array of
* JIDs of the chatroom(s) to create * JIDs of the chatroom(s) to create
* @param {object} [attrs] attrs The room attributes * @param {object} [attrs] attrs The room attributes
...@@ -2624,7 +2625,7 @@ converse.plugins.add('converse-muc', { ...@@ -2624,7 +2625,7 @@ converse.plugins.add('converse-muc', {
*/ */
create (jids, attrs={}) { create (jids, attrs={}) {
attrs = isString(attrs) ? {'nick': attrs} : (attrs || {}); attrs = isString(attrs) ? {'nick': attrs} : (attrs || {});
if (!attrs.nick && _converse.api.settings.get('muc_nickname_from_jid')) { if (!attrs.nick && api.settings.get('muc_nickname_from_jid')) {
attrs.nick = Strophe.getNodeFromJid(_converse.bare_jid); attrs.nick = Strophe.getNodeFromJid(_converse.bare_jid);
} }
if (jids === undefined) { if (jids === undefined) {
...@@ -2638,9 +2639,9 @@ converse.plugins.add('converse-muc', { ...@@ -2638,9 +2639,9 @@ converse.plugins.add('converse-muc', {
/** /**
* Opens a MUC chatroom (aka groupchat) * Opens a MUC chatroom (aka groupchat)
* *
* Similar to {@link _converse.api.chats.open}, but for groupchats. * Similar to {@link api.chats.open}, but for groupchats.
* *
* @method _converse.api.rooms.open * @method api.rooms.open
* @param {string} jid The room JID or JIDs (if not specified, all * @param {string} jid The room JID or JIDs (if not specified, all
* currently open rooms will be returned). * currently open rooms will be returned).
* @param {string} attrs A map containing any extra room attributes. * @param {string} attrs A map containing any extra room attributes.
...@@ -2667,19 +2668,19 @@ converse.plugins.add('converse-muc', { ...@@ -2667,19 +2668,19 @@ converse.plugins.add('converse-muc', {
* @returns {Promise} Promise which resolves with the Model representing the chat. * @returns {Promise} Promise which resolves with the Model representing the chat.
* *
* @example * @example
* this._converse.api.rooms.open('group@muc.example.com') * this.api.rooms.open('group@muc.example.com')
* *
* @example * @example
* // To return an array of rooms, provide an array of room JIDs: * // To return an array of rooms, provide an array of room JIDs:
* _converse.api.rooms.open(['group1@muc.example.com', 'group2@muc.example.com']) * api.rooms.open(['group1@muc.example.com', 'group2@muc.example.com'])
* *
* @example * @example
* // To setup a custom nickname when joining the room, provide the optional nick argument: * // To setup a custom nickname when joining the room, provide the optional nick argument:
* _converse.api.rooms.open('group@muc.example.com', {'nick': 'mycustomnick'}) * api.rooms.open('group@muc.example.com', {'nick': 'mycustomnick'})
* *
* @example * @example
* // For example, opening a room with a specific default configuration: * // For example, opening a room with a specific default configuration:
* _converse.api.rooms.open( * api.rooms.open(
* 'myroom@conference.example.org', * 'myroom@conference.example.org',
* { 'nick': 'coolguy69', * { 'nick': 'coolguy69',
* 'auto_configure': true, * 'auto_configure': true,
...@@ -2695,17 +2696,17 @@ converse.plugins.add('converse-muc', { ...@@ -2695,17 +2696,17 @@ converse.plugins.add('converse-muc', {
* ); * );
*/ */
async open (jids, attrs, force=false) { async open (jids, attrs, force=false) {
await _converse.api.waitUntil('chatBoxesFetched'); await api.waitUntil('chatBoxesFetched');
if (jids === undefined) { if (jids === undefined) {
const err_msg = 'rooms.open: You need to provide at least one JID'; const err_msg = 'rooms.open: You need to provide at least one JID';
log.error(err_msg); log.error(err_msg);
throw(new TypeError(err_msg)); throw(new TypeError(err_msg));
} else if (isString(jids)) { } else if (isString(jids)) {
const room = await _converse.api.rooms.create(jids, attrs); const room = await api.rooms.create(jids, attrs);
room && room.maybeShow(force); room && room.maybeShow(force);
return room; return room;
} else { } else {
const rooms = await Promise.all(jids.map(jid => _converse.api.rooms.create(jid, attrs))); const rooms = await Promise.all(jids.map(jid => api.rooms.create(jid, attrs)));
rooms.forEach(r => r.maybeShow(force)); rooms.forEach(r => r.maybeShow(force));
return rooms; return rooms;
} }
...@@ -2714,7 +2715,7 @@ converse.plugins.add('converse-muc', { ...@@ -2714,7 +2715,7 @@ converse.plugins.add('converse-muc', {
/** /**
* Fetches the object representing a MUC chatroom (aka groupchat) * Fetches the object representing a MUC chatroom (aka groupchat)
* *
* @method _converse.api.rooms.get * @method api.rooms.get
* @param {string} [jid] The room JID (if not specified, all rooms will be returned). * @param {string} [jid] The room JID (if not specified, all rooms will be returned).
* @param {object} attrs A map containing any extra room attributes For example, if you want * @param {object} attrs A map containing any extra room attributes For example, if you want
* to specify the nickname, use `{'nick': 'bloodninja'}`. Previously (before * to specify the nickname, use `{'nick': 'bloodninja'}`. Previously (before
...@@ -2726,9 +2727,9 @@ converse.plugins.add('converse-muc', { ...@@ -2726,9 +2727,9 @@ converse.plugins.add('converse-muc', {
* if not found (default: `false`) * if not found (default: `false`)
* @returns { Promise<_converse.ChatRoom> } * @returns { Promise<_converse.ChatRoom> }
* @example * @example
* _converse.api.waitUntil('roomsAutoJoined').then(() => { * api.waitUntil('roomsAutoJoined').then(() => {
* const create_if_not_found = true; * const create_if_not_found = true;
* _converse.api.rooms.get( * api.rooms.get(
* 'group@muc.example.com', * 'group@muc.example.com',
* {'nick': 'dread-pirate-roberts'}, * {'nick': 'dread-pirate-roberts'},
* create_if_not_found * create_if_not_found
...@@ -2737,9 +2738,9 @@ converse.plugins.add('converse-muc', { ...@@ -2737,9 +2738,9 @@ converse.plugins.add('converse-muc', {
*/ */
async get (jids, attrs={}, create=false) { async get (jids, attrs={}, create=false) {
async function _get (jid) { async function _get (jid) {
let model = await _converse.api.chatboxes.get(jid); let model = await api.chatboxes.get(jid);
if (!model && create) { if (!model && create) {
model = await _converse.api.chatboxes.create(jid, attrs, _converse.ChatRoom); model = await api.chatboxes.create(jid, attrs, _converse.ChatRoom);
} else { } else {
model = (model && model.get('type') === _converse.CHATROOMS_TYPE) ? model : null; model = (model && model.get('type') === _converse.CHATROOMS_TYPE) ? model : null;
if (model && Object.keys(attrs).length) { if (model && Object.keys(attrs).length) {
...@@ -2749,7 +2750,7 @@ converse.plugins.add('converse-muc', { ...@@ -2749,7 +2750,7 @@ converse.plugins.add('converse-muc', {
return model; return model;
} }
if (jids === undefined) { if (jids === undefined) {
const chats = await _converse.api.chatboxes.get(); const chats = await api.chatboxes.get();
return chats.filter(c => (c.get('type') === _converse.CHATROOMS_TYPE)); return chats.filter(c => (c.get('type') === _converse.CHATROOMS_TYPE));
} else if (isString(jids)) { } else if (isString(jids)) {
return _get(jids); return _get(jids);
......
...@@ -22,9 +22,11 @@ converse.plugins.add('converse-ping', { ...@@ -22,9 +22,11 @@ converse.plugins.add('converse-ping', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
let lastStanzaDate; let lastStanzaDate;
_converse.api.settings.update({ api.settings.update({
ping_interval: 60 //in seconds ping_interval: 60 //in seconds
}); });
...@@ -39,14 +41,14 @@ converse.plugins.add('converse-ping', { ...@@ -39,14 +41,14 @@ converse.plugins.add('converse-ping', {
function registerPongHandler () { function registerPongHandler () {
if (_converse.connection.disco !== undefined) { if (_converse.connection.disco !== undefined) {
_converse.api.disco.own.features.add(Strophe.NS.PING); api.disco.own.features.add(Strophe.NS.PING);
} }
return _converse.connection.addHandler(pong, Strophe.NS.PING, "iq", "get"); return _converse.connection.addHandler(pong, Strophe.NS.PING, "iq", "get");
} }
function registerPingHandler () { function registerPingHandler () {
_converse.connection.addHandler(() => { _converse.connection.addHandler(() => {
if (_converse.api.settings.get('ping_interval') > 0) { if (api.settings.get('ping_interval') > 0) {
// Handler on each stanza, saves the received date // Handler on each stanza, saves the received date
// in order to ping only when needed. // in order to ping only when needed.
lastStanzaDate = new Date(); lastStanzaDate = new Date();
...@@ -56,13 +58,13 @@ converse.plugins.add('converse-ping', { ...@@ -56,13 +58,13 @@ converse.plugins.add('converse-ping', {
} }
setTimeout(() => { setTimeout(() => {
if (_converse.api.settings.get('ping_interval') > 0) { if (api.settings.get('ping_interval') > 0) {
const now = new Date(); const now = new Date();
if (!lastStanzaDate) { if (!lastStanzaDate) {
lastStanzaDate = now; lastStanzaDate = now;
} }
if ((now - lastStanzaDate)/1000 > _converse.api.settings.get('ping_interval')) { if ((now - lastStanzaDate)/1000 > api.settings.get('ping_interval')) {
return _converse.api.ping(); return api.ping();
} }
return true; return true;
} }
...@@ -75,25 +77,25 @@ converse.plugins.add('converse-ping', { ...@@ -75,25 +77,25 @@ converse.plugins.add('converse-ping', {
registerPongHandler(); registerPongHandler();
registerPingHandler(); registerPingHandler();
}; };
_converse.api.listen.on('connected', onConnected); api.listen.on('connected', onConnected);
_converse.api.listen.on('reconnected', onConnected); api.listen.on('reconnected', onConnected);
function onWindowStateChanged (data) { function onWindowStateChanged (data) {
if (data.state === 'visible' && _converse.api.connection.connected()) { if (data.state === 'visible' && api.connection.connected()) {
_converse.api.ping(null, 5000); api.ping(null, 5000);
} }
} }
_converse.api.listen.on('windowStateChanged', onWindowStateChanged); api.listen.on('windowStateChanged', onWindowStateChanged);
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
Object.assign(_converse.api, { Object.assign(api, {
/** /**
* Pings the service represented by the passed in JID by sending an IQ stanza. * Pings the service represented by the passed in JID by sending an IQ stanza.
* @private * @private
* @method _converse.api.ping * @method api.ping
* @param { String } [jid] - The JID of the service to ping * @param { String } [jid] - The JID of the service to ping
* @param { Integer } [timeout] - The amount of time in * @param { Integer } [timeout] - The amount of time in
* milliseconds to wait for a response. The default is 10000; * milliseconds to wait for a response. The default is 10000;
...@@ -112,11 +114,11 @@ converse.plugins.add('converse-ping', { ...@@ -112,11 +114,11 @@ converse.plugins.add('converse-ping', {
'id': u.getUniqueId('ping') 'id': u.getUniqueId('ping')
}).c('ping', {'xmlns': Strophe.NS.PING}); }).c('ping', {'xmlns': Strophe.NS.PING});
const result = await _converse.api.sendIQ(iq, timeout || 10000, false); const result = await api.sendIQ(iq, timeout || 10000, false);
if (result === null) { if (result === null) {
log.warn(`Timeout while pinging ${jid}`); log.warn(`Timeout while pinging ${jid}`);
if (jid === Strophe.getDomainFromJid(_converse.bare_jid)) { if (jid === Strophe.getDomainFromJid(_converse.bare_jid)) {
_converse.api.connection.reconnect(); api.connection.reconnect();
} }
} else if (u.isErrorStanza(result)) { } else if (u.isErrorStanza(result)) {
log.error(`Error while pinging ${jid}`); log.error(`Error while pinging ${jid}`);
......
...@@ -21,6 +21,7 @@ converse.plugins.add('converse-pubsub', { ...@@ -21,6 +21,7 @@ converse.plugins.add('converse-pubsub', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
...@@ -58,7 +59,7 @@ converse.plugins.add('converse-pubsub', { ...@@ -58,7 +59,7 @@ converse.plugins.add('converse-pubsub', {
if (options) { if (options) {
jid = jid || _converse.bare_jid; jid = jid || _converse.bare_jid;
if (await _converse.api.disco.supports(Strophe.NS.PUBSUB + '#publish-options', jid)) { if (await api.disco.supports(Strophe.NS.PUBSUB + '#publish-options', jid)) {
stanza.c('publish-options') stanza.c('publish-options')
.c('x', {'xmlns': Strophe.NS.XFORM, 'type': 'submit'}) .c('x', {'xmlns': Strophe.NS.XFORM, 'type': 'submit'})
.c('field', {'var': 'FORM_TYPE', 'type': 'hidden'}) .c('field', {'var': 'FORM_TYPE', 'type': 'hidden'})
...@@ -71,7 +72,7 @@ converse.plugins.add('converse-pubsub', { ...@@ -71,7 +72,7 @@ converse.plugins.add('converse-pubsub', {
} }
} }
try { try {
_converse.api.sendIQ(stanza); api.sendIQ(stanza);
} catch (iq) { } catch (iq) {
if (iq instanceof Element && if (iq instanceof Element &&
strict_options && strict_options &&
...@@ -82,7 +83,7 @@ converse.plugins.add('converse-pubsub', { ...@@ -82,7 +83,7 @@ converse.plugins.add('converse-pubsub', {
const el = stanza.nodeTree; const el = stanza.nodeTree;
el.querySelector('publish-options').outerHTML = ''; el.querySelector('publish-options').outerHTML = '';
log.warn(`PubSub: Republishing without publish options. ${el.outerHTML}`); log.warn(`PubSub: Republishing without publish options. ${el.outerHTML}`);
_converse.api.sendIQ(el); api.sendIQ(el);
} else { } else {
throw iq; throw iq;
} }
......
...@@ -22,16 +22,17 @@ converse.plugins.add('converse-roster', { ...@@ -22,16 +22,17 @@ converse.plugins.add('converse-roster', {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this, const { _converse } = this;
{ __ } = _converse; const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({ api.settings.update({
'allow_contact_requests': true, 'allow_contact_requests': true,
'auto_subscribe': false, 'auto_subscribe': false,
'synchronize_availability': true, 'synchronize_availability': true,
}); });
_converse.api.promises.add([ api.promises.add([
'cachedRoster', 'cachedRoster',
'roster', 'roster',
'rosterContactsFetched', 'rosterContactsFetched',
...@@ -73,7 +74,7 @@ converse.plugins.add('converse-roster', { ...@@ -73,7 +74,7 @@ converse.plugins.add('converse-roster', {
_converse.rejectPresenceSubscription = function (jid, message) { _converse.rejectPresenceSubscription = function (jid, message) {
const pres = $pres({to: jid, type: "unsubscribed"}); const pres = $pres({to: jid, type: "unsubscribed"});
if (message && message !== "") { pres.c("status").t(message); } if (message && message !== "") { pres.c("status").t(message); }
_converse.api.send(pres); api.send(pres);
}; };
...@@ -107,9 +108,9 @@ converse.plugins.add('converse-roster', { ...@@ -107,9 +108,9 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('rosterGroupsFetched', () => { ... }); * @example _converse.api.listen.on('rosterGroupsFetched', () => { ... });
* @example _converse.api.waitUntil('rosterGroupsFetched').then(() => { ... }); * @example _converse.api.waitUntil('rosterGroupsFetched').then(() => { ... });
*/ */
_converse.api.trigger('rosterGroupsFetched'); api.trigger('rosterGroupsFetched');
await _converse.roster.fetchRosterContacts(); await _converse.roster.fetchRosterContacts();
_converse.api.trigger('rosterContactsFetched'); api.trigger('rosterContactsFetched');
} catch (reason) { } catch (reason) {
log.error(reason); log.error(reason);
} finally { } finally {
...@@ -231,14 +232,14 @@ converse.plugins.add('converse-roster', { ...@@ -231,14 +232,14 @@ converse.plugins.add('converse-roster', {
* @type { _converse.RosterContact } * @type { _converse.RosterContact }
* @example _converse.api.listen.on('contactPresenceChanged', contact => { ... }); * @example _converse.api.listen.on('contactPresenceChanged', contact => { ... });
*/ */
this.listenTo(this.presence, 'change:show', () => _converse.api.trigger('contactPresenceChanged', this)); this.listenTo(this.presence, 'change:show', () => api.trigger('contactPresenceChanged', this));
this.listenTo(this.presence, 'change:show', () => this.trigger('presenceChanged')); this.listenTo(this.presence, 'change:show', () => this.trigger('presenceChanged'));
/** /**
* Synchronous event which provides a hook for further initializing a RosterContact * Synchronous event which provides a hook for further initializing a RosterContact
* @event _converse#rosterContactInitialized * @event _converse#rosterContactInitialized
* @param { _converse.RosterContact } contact * @param { _converse.RosterContact } contact
*/ */
await _converse.api.trigger('rosterContactInitialized', this, {'Synchronous': true}); await api.trigger('rosterContactInitialized', this, {'Synchronous': true});
this.initialized.resolve(); this.initialized.resolve();
}, },
...@@ -277,7 +278,7 @@ converse.plugins.add('converse-roster', { ...@@ -277,7 +278,7 @@ converse.plugins.add('converse-roster', {
if (nick) { if (nick) {
pres.c('nick', {'xmlns': Strophe.NS.NICK}).t(nick).up(); pres.c('nick', {'xmlns': Strophe.NS.NICK}).t(nick).up();
} }
_converse.api.send(pres); api.send(pres);
this.save('ask', "subscribe"); // ask === 'subscribe' Means we have asked to subscribe to them. this.save('ask', "subscribe"); // ask === 'subscribe' Means we have asked to subscribe to them.
return this; return this;
}, },
...@@ -291,7 +292,7 @@ converse.plugins.add('converse-roster', { ...@@ -291,7 +292,7 @@ converse.plugins.add('converse-roster', {
* @method _converse.RosterContacts#ackSubscribe * @method _converse.RosterContacts#ackSubscribe
*/ */
ackSubscribe () { ackSubscribe () {
_converse.api.send($pres({ api.send($pres({
'type': 'subscribe', 'type': 'subscribe',
'to': this.get('jid') 'to': this.get('jid')
})); }));
...@@ -308,7 +309,7 @@ converse.plugins.add('converse-roster', { ...@@ -308,7 +309,7 @@ converse.plugins.add('converse-roster', {
* @param { String } jid - The Jabber ID of the user who is unsubscribing * @param { String } jid - The Jabber ID of the user who is unsubscribing
*/ */
ackUnsubscribe () { ackUnsubscribe () {
_converse.api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')})); api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')}));
this.removeFromRoster(); this.removeFromRoster();
this.destroy(); this.destroy();
}, },
...@@ -335,7 +336,7 @@ converse.plugins.add('converse-roster', { ...@@ -335,7 +336,7 @@ converse.plugins.add('converse-roster', {
if (message && message !== "") { if (message && message !== "") {
pres.c("status").t(message); pres.c("status").t(message);
} }
_converse.api.send(pres); api.send(pres);
return this; return this;
}, },
...@@ -349,7 +350,7 @@ converse.plugins.add('converse-roster', { ...@@ -349,7 +350,7 @@ converse.plugins.add('converse-roster', {
const iq = $iq({type: 'set'}) const iq = $iq({type: 'set'})
.c('query', {xmlns: Strophe.NS.ROSTER}) .c('query', {xmlns: Strophe.NS.ROSTER})
.c('item', {jid: this.get('jid'), subscription: "remove"}); .c('item', {jid: this.get('jid'), subscription: "remove"});
return _converse.api.sendIQ(iq); return api.sendIQ(iq);
} }
}); });
...@@ -441,7 +442,7 @@ converse.plugins.add('converse-roster', { ...@@ -441,7 +442,7 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('cachedRoster', (items) => { ... }); * @example _converse.api.listen.on('cachedRoster', (items) => { ... });
* @example _converse.api.waitUntil('cachedRoster').then(items => { ... }); * @example _converse.api.waitUntil('cachedRoster').then(items => { ... });
*/ */
_converse.api.trigger('cachedRoster', result); api.trigger('cachedRoster', result);
} else { } else {
_converse.send_initial_presence = true; _converse.send_initial_presence = true;
return _converse.roster.fetchFromServer(); return _converse.roster.fetchFromServer();
...@@ -498,7 +499,7 @@ converse.plugins.add('converse-roster', { ...@@ -498,7 +499,7 @@ converse.plugins.add('converse-roster', {
.c('query', {'xmlns': Strophe.NS.ROSTER}) .c('query', {'xmlns': Strophe.NS.ROSTER})
.c('item', { jid, name }); .c('item', { jid, name });
groups.forEach(g => iq.c('group').t(g).up()); groups.forEach(g => iq.c('group').t(g).up());
return _converse.api.sendIQ(iq); return api.sendIQ(iq);
}, },
/** /**
...@@ -513,7 +514,7 @@ converse.plugins.add('converse-roster', { ...@@ -513,7 +514,7 @@ converse.plugins.add('converse-roster', {
* @param { Object } attributes - Any additional attributes to be stored on the user's model. * @param { Object } attributes - Any additional attributes to be stored on the user's model.
*/ */
async addContactToRoster (jid, name, groups, attributes) { async addContactToRoster (jid, name, groups, attributes) {
await _converse.api.waitUntil('rosterContactsFetched'); await api.waitUntil('rosterContactsFetched');
groups = groups || []; groups = groups || [];
try { try {
await this.sendContactAddIQ(jid, name, groups); await this.sendContactAddIQ(jid, name, groups);
...@@ -573,7 +574,7 @@ converse.plugins.add('converse-roster', { ...@@ -573,7 +574,7 @@ converse.plugins.add('converse-roster', {
); );
return; return;
} }
_converse.api.send($iq({type: 'result', id, from: _converse.connection.jid})); api.send($iq({type: 'result', id, from: _converse.connection.jid}));
const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop(); const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop();
this.data.save('version', query.getAttribute('ver')); this.data.save('version', query.getAttribute('ver'));
...@@ -595,12 +596,12 @@ converse.plugins.add('converse-roster', { ...@@ -595,12 +596,12 @@ converse.plugins.add('converse-roster', {
* @type { XMLElement } * @type { XMLElement }
* @example _converse.api.listen.on('rosterPush', iq => { ... }); * @example _converse.api.listen.on('rosterPush', iq => { ... });
*/ */
_converse.api.trigger('rosterPush', iq); api.trigger('rosterPush', iq);
return; return;
}, },
rosterVersioningSupported () { rosterVersioningSupported () {
return _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver') && this.data.get('version'); return api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver') && this.data.get('version');
}, },
/** /**
...@@ -617,7 +618,7 @@ converse.plugins.add('converse-roster', { ...@@ -617,7 +618,7 @@ converse.plugins.add('converse-roster', {
if (this.rosterVersioningSupported()) { if (this.rosterVersioningSupported()) {
stanza.attrs({'ver': this.data.get('version')}); stanza.attrs({'ver': this.data.get('version')});
} }
const iq = await _converse.api.sendIQ(stanza, null, false); const iq = await api.sendIQ(stanza, null, false);
if (iq.getAttribute('type') !== 'error') { if (iq.getAttribute('type') !== 'error') {
const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop(); const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop();
if (query) { if (query) {
...@@ -641,7 +642,7 @@ converse.plugins.add('converse-roster', { ...@@ -641,7 +642,7 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('roster', iq => { ... }); * @example _converse.api.listen.on('roster', iq => { ... });
* @example _converse.api.waitUntil('roster').then(iq => { ... }); * @example _converse.api.waitUntil('roster').then(iq => { ... });
*/ */
_converse.api.trigger('roster', iq); api.trigger('roster', iq);
}, },
/* Update or create RosterContact models based on the given `item` XML /* Update or create RosterContact models based on the given `item` XML
...@@ -701,7 +702,7 @@ converse.plugins.add('converse-roster', { ...@@ -701,7 +702,7 @@ converse.plugins.add('converse-roster', {
* @type { _converse.RosterContact } * @type { _converse.RosterContact }
* @example _converse.api.listen.on('contactRequest', contact => { ... }); * @example _converse.api.listen.on('contactRequest', contact => { ... });
*/ */
_converse.api.trigger('contactRequest', this.create(user_data)); api.trigger('contactRequest', this.create(user_data));
}, },
...@@ -710,13 +711,13 @@ converse.plugins.add('converse-roster', { ...@@ -710,13 +711,13 @@ converse.plugins.add('converse-roster', {
bare_jid = Strophe.getBareJidFromJid(jid), bare_jid = Strophe.getBareJidFromJid(jid),
contact = this.get(bare_jid); contact = this.get(bare_jid);
if (!_converse.api.settings.get('allow_contact_requests')) { if (!api.settings.get('allow_contact_requests')) {
_converse.rejectPresenceSubscription( _converse.rejectPresenceSubscription(
jid, jid,
__("This client does not allow presence subscriptions") __("This client does not allow presence subscriptions")
); );
} }
if (_converse.api.settings.get('auto_subscribe')) { if (api.settings.get('auto_subscribe')) {
if ((!contact) || (contact.get('subscription') !== 'to')) { if ((!contact) || (contact.get('subscription') !== 'to')) {
this.subscribeBack(bare_jid, presence); this.subscribeBack(bare_jid, presence);
} else { } else {
...@@ -742,8 +743,8 @@ converse.plugins.add('converse-roster', { ...@@ -742,8 +743,8 @@ converse.plugins.add('converse-roster', {
if ((_converse.connection.jid !== jid) && if ((_converse.connection.jid !== jid) &&
(presence_type !== 'unavailable') && (presence_type !== 'unavailable') &&
(_converse.api.settings.get('synchronize_availability') === true || (api.settings.get('synchronize_availability') === true ||
_converse.api.settings.get('synchronize_availability') === resource)) { api.settings.get('synchronize_availability') === resource)) {
// Another resource has changed its status and // Another resource has changed its status and
// synchronize_availability option set to update, // synchronize_availability option set to update,
// we'll update ours as well. // we'll update ours as well.
...@@ -889,7 +890,7 @@ converse.plugins.add('converse-roster', { ...@@ -889,7 +890,7 @@ converse.plugins.add('converse-roster', {
} }
} }
_converse.api.listen.on('chatBoxesInitialized', () => { api.listen.on('chatBoxesInitialized', () => {
_converse.chatboxes.on('change:num_unread', updateUnreadCounter); _converse.chatboxes.on('change:num_unread', updateUnreadCounter);
_converse.chatboxes.on('add', chatbox => { _converse.chatboxes.on('add', chatbox => {
...@@ -899,9 +900,9 @@ converse.plugins.add('converse-roster', { ...@@ -899,9 +900,9 @@ converse.plugins.add('converse-roster', {
}); });
}); });
_converse.api.listen.on('beforeTearDown', () => _converse.unregisterPresenceHandler()); api.listen.on('beforeTearDown', () => _converse.unregisterPresenceHandler());
_converse.api.waitUntil('rosterContactsFetched').then(() => { api.waitUntil('rosterContactsFetched').then(() => {
_converse.roster.on('add', (contact) => { _converse.roster.on('add', (contact) => {
/* When a new contact is added, check if we already have a /* When a new contact is added, check if we already have a
* chatbox open for it, and if so attach it to the chatbox. * chatbox open for it, and if so attach it to the chatbox.
...@@ -917,9 +918,9 @@ converse.plugins.add('converse-roster', { ...@@ -917,9 +918,9 @@ converse.plugins.add('converse-roster', {
_converse.presences && await _converse.presences.clearStore(); _converse.presences && await _converse.presences.clearStore();
} }
_converse.api.listen.on('streamResumptionFailed', () => _converse.session.set('roster_cached', false)); api.listen.on('streamResumptionFailed', () => _converse.session.set('roster_cached', false));
_converse.api.listen.on('clearSession', async () => { api.listen.on('clearSession', async () => {
await clearPresences(); await clearPresences();
if (_converse.shouldClearCache()) { if (_converse.shouldClearCache()) {
if (_converse.rostergroups) { if (_converse.rostergroups) {
...@@ -934,7 +935,7 @@ converse.plugins.add('converse-roster', { ...@@ -934,7 +935,7 @@ converse.plugins.add('converse-roster', {
} }
}); });
_converse.api.listen.on('statusInitialized', async reconnecting => { api.listen.on('statusInitialized', async reconnecting => {
if (reconnecting) { if (reconnecting) {
// When reconnecting and not resuming a previous session, // When reconnecting and not resuming a previous session,
// we clear all cached presence data, since it might be stale // we clear all cached presence data, since it might be stale
...@@ -957,14 +958,14 @@ converse.plugins.add('converse-roster', { ...@@ -957,14 +958,14 @@ converse.plugins.add('converse-roster', {
* @type { bool } * @type { bool }
* @example _converse.api.listen.on('presencesInitialized', reconnecting => { ... }); * @example _converse.api.listen.on('presencesInitialized', reconnecting => { ... });
*/ */
_converse.api.trigger('presencesInitialized', reconnecting); api.trigger('presencesInitialized', reconnecting);
}); });
async function initRoster () { async function initRoster () {
// Initialize the Bakcbone collections that represent the contats // Initialize the Bakcbone collections that represent the contats
// roster and the roster groups. // roster and the roster groups.
await _converse.api.waitUntil('VCardsInitialized'); await api.waitUntil('VCardsInitialized');
_converse.roster = new _converse.RosterContacts(); _converse.roster = new _converse.RosterContacts();
let id = `converse.contacts-${_converse.bare_jid}`; let id = `converse.contacts-${_converse.bare_jid}`;
_converse.roster.browserStorage = _converse.createStore(id); _converse.roster.browserStorage = _converse.createStore(id);
...@@ -986,10 +987,10 @@ converse.plugins.add('converse-roster', { ...@@ -986,10 +987,10 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('rosterInitialized', () => { ... }); * @example _converse.api.listen.on('rosterInitialized', () => { ... });
* @example _converse.api.waitUntil('rosterInitialized').then(() => { ... }); * @example _converse.api.waitUntil('rosterInitialized').then(() => { ... });
*/ */
_converse.api.trigger('rosterInitialized'); api.trigger('rosterInitialized');
} }
_converse.api.listen.on('presencesInitialized', async (reconnecting) => { api.listen.on('presencesInitialized', async (reconnecting) => {
if (reconnecting) { if (reconnecting) {
/** /**
* Similar to `rosterInitialized`, but instead pertaining to reconnection. * Similar to `rosterInitialized`, but instead pertaining to reconnection.
...@@ -998,7 +999,7 @@ converse.plugins.add('converse-roster', { ...@@ -998,7 +999,7 @@ converse.plugins.add('converse-roster', {
* @event _converse#rosterReadyAfterReconnection * @event _converse#rosterReadyAfterReconnection
* @example _converse.api.listen.on('rosterReadyAfterReconnection', () => { ... }); * @example _converse.api.listen.on('rosterReadyAfterReconnection', () => { ... });
*/ */
_converse.api.trigger('rosterReadyAfterReconnection'); api.trigger('rosterReadyAfterReconnection');
} else { } else {
await initRoster(); await initRoster();
} }
...@@ -1050,7 +1051,7 @@ converse.plugins.add('converse-roster', { ...@@ -1050,7 +1051,7 @@ converse.plugins.add('converse-roster', {
* }); * });
*/ */
async get (jids) { async get (jids) {
await _converse.api.waitUntil('rosterContactsFetched'); await api.waitUntil('rosterContactsFetched');
const _getter = jid => _converse.roster.get(Strophe.getBareJidFromJid(jid)); const _getter = jid => _converse.roster.get(Strophe.getBareJidFromJid(jid));
if (jids === undefined) { if (jids === undefined) {
jids = _converse.roster.pluck('jid'); jids = _converse.roster.pluck('jid');
...@@ -1073,7 +1074,7 @@ converse.plugins.add('converse-roster', { ...@@ -1073,7 +1074,7 @@ converse.plugins.add('converse-roster', {
* _converse.api.contacts.add('buddy@example.com', 'Buddy') * _converse.api.contacts.add('buddy@example.com', 'Buddy')
*/ */
async add (jid, name) { async add (jid, name) {
await _converse.api.waitUntil('rosterContactsFetched'); await api.waitUntil('rosterContactsFetched');
if (!isString(jid) || !jid.includes('@')) { if (!isString(jid) || !jid.includes('@')) {
throw new TypeError('contacts.add: invalid jid'); throw new TypeError('contacts.add: invalid jid');
} }
......
...@@ -18,21 +18,22 @@ converse.plugins.add('converse-smacks', { ...@@ -18,21 +18,22 @@ converse.plugins.add('converse-smacks', {
initialize () { initialize () {
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
// Configuration values for this plugin // Configuration values for this plugin
// ==================================== // ====================================
// Refer to docs/source/configuration.rst for explanations of these // Refer to docs/source/configuration.rst for explanations of these
// configuration settings. // configuration settings.
_converse.api.settings.update({ api.settings.update({
'enable_smacks': true, 'enable_smacks': true,
'smacks_max_unacked_stanzas': 5, 'smacks_max_unacked_stanzas': 5,
}); });
function isStreamManagementSupported () { function isStreamManagementSupported () {
if (_converse.api.connection.isType('bosh') && !_converse.isTestEnv()) { if (api.connection.isType('bosh') && !_converse.isTestEnv()) {
return false; return false;
} }
return _converse.api.disco.stream.getFeature('sm', Strophe.NS.SM); return api.disco.stream.getFeature('sm', Strophe.NS.SM);
} }
function handleAck (el) { function handleAck (el) {
...@@ -69,7 +70,7 @@ converse.plugins.add('converse-smacks', { ...@@ -69,7 +70,7 @@ converse.plugins.add('converse-smacks', {
if (_converse.session.get('smacks_enabled')) { if (_converse.session.get('smacks_enabled')) {
const h = _converse.session.get('num_stanzas_handled'); const h = _converse.session.get('num_stanzas_handled');
const stanza = u.toStanza(`<a xmlns="${Strophe.NS.SM}" h="${h}"/>`); const stanza = u.toStanza(`<a xmlns="${Strophe.NS.SM}" h="${h}"/>`);
_converse.api.send(stanza); api.send(stanza);
} }
return true; return true;
} }
...@@ -132,7 +133,7 @@ converse.plugins.add('converse-smacks', { ...@@ -132,7 +133,7 @@ converse.plugins.add('converse-smacks', {
* Triggered when the XEP-0198 stream could not be resumed. * Triggered when the XEP-0198 stream could not be resumed.
* @event _converse#streamResumptionFailed * @event _converse#streamResumptionFailed
*/ */
_converse.api.trigger('streamResumptionFailed'); api.trigger('streamResumptionFailed');
return true; return true;
} }
...@@ -158,7 +159,7 @@ converse.plugins.add('converse-smacks', { ...@@ -158,7 +159,7 @@ converse.plugins.add('converse-smacks', {
// service worker or handling IQ[type="result"] stanzas // service worker or handling IQ[type="result"] stanzas
// differently, more like push stanzas, so that they don't need // differently, more like push stanzas, so that they don't need
// explicit handlers. // explicit handlers.
stanzas.forEach(s => _converse.api.send(s)); stanzas.forEach(s => api.send(s));
} }
function onResumedStanza (el) { function onResumedStanza (el) {
...@@ -179,13 +180,13 @@ converse.plugins.add('converse-smacks', { ...@@ -179,13 +180,13 @@ converse.plugins.add('converse-smacks', {
const previous_id = _converse.session.get('smacks_stream_id'); const previous_id = _converse.session.get('smacks_stream_id');
const h = _converse.session.get('num_stanzas_handled'); const h = _converse.session.get('num_stanzas_handled');
const stanza = u.toStanza(`<resume xmlns="${Strophe.NS.SM}" h="${h}" previd="${previous_id}"/>`); const stanza = u.toStanza(`<resume xmlns="${Strophe.NS.SM}" h="${h}" previd="${previous_id}"/>`);
_converse.api.send(stanza); api.send(stanza);
_converse.connection.flush(); _converse.connection.flush();
await promise; await promise;
} }
async function sendEnableStanza () { async function sendEnableStanza () {
if (!_converse.api.settings.get('enable_smacks') || _converse.session.get('smacks_enabled')) { if (!api.settings.get('enable_smacks') || _converse.session.get('smacks_enabled')) {
return; return;
} }
if (await isStreamManagementSupported()) { if (await isStreamManagementSupported()) {
...@@ -193,16 +194,16 @@ converse.plugins.add('converse-smacks', { ...@@ -193,16 +194,16 @@ converse.plugins.add('converse-smacks', {
_converse.connection._addSysHandler(el => promise.resolve(saveSessionData(el)), Strophe.NS.SM, 'enabled'); _converse.connection._addSysHandler(el => promise.resolve(saveSessionData(el)), Strophe.NS.SM, 'enabled');
_converse.connection._addSysHandler(el => promise.resolve(onFailedStanza(el)), Strophe.NS.SM, 'failed'); _converse.connection._addSysHandler(el => promise.resolve(onFailedStanza(el)), Strophe.NS.SM, 'failed');
const resume = (_converse.api.connection.isType('websocket') || _converse.isTestEnv()); const resume = (api.connection.isType('websocket') || _converse.isTestEnv());
const stanza = u.toStanza(`<enable xmlns="${Strophe.NS.SM}" resume="${resume}"/>`); const stanza = u.toStanza(`<enable xmlns="${Strophe.NS.SM}" resume="${resume}"/>`);
_converse.api.send(stanza); api.send(stanza);
_converse.connection.flush(); _converse.connection.flush();
await promise; await promise;
} }
} }
async function enableStreamManagement () { async function enableStreamManagement () {
if (!_converse.api.settings.get('enable_smacks')) { if (!api.settings.get('enable_smacks')) {
return; return;
} }
if (!(await isStreamManagementSupported())) { if (!(await isStreamManagementSupported())) {
...@@ -235,21 +236,21 @@ converse.plugins.add('converse-smacks', { ...@@ -235,21 +236,21 @@ converse.plugins.add('converse-smacks', {
'unacked_stanzas', 'unacked_stanzas',
(_converse.session.get('unacked_stanzas') || []).concat([stanza_string]) (_converse.session.get('unacked_stanzas') || []).concat([stanza_string])
); );
const max_unacked = _converse.api.settings.get('smacks_max_unacked_stanzas'); const max_unacked = api.settings.get('smacks_max_unacked_stanzas');
if (max_unacked > 0) { if (max_unacked > 0) {
const num = _converse.session.get('num_stanzas_since_last_ack') + 1; const num = _converse.session.get('num_stanzas_since_last_ack') + 1;
if (num % max_unacked === 0) { if (num % max_unacked === 0) {
// Request confirmation of sent stanzas // Request confirmation of sent stanzas
_converse.api.send(u.toStanza(`<r xmlns="${Strophe.NS.SM}"/>`)); api.send(u.toStanza(`<r xmlns="${Strophe.NS.SM}"/>`));
} }
_converse.session.save({'num_stanzas_since_last_ack': num}); _converse.session.save({'num_stanzas_since_last_ack': num});
} }
} }
} }
_converse.api.listen.on('userSessionInitialized', initSessionData); api.listen.on('userSessionInitialized', initSessionData);
_converse.api.listen.on('beforeResourceBinding', enableStreamManagement); api.listen.on('beforeResourceBinding', enableStreamManagement);
_converse.api.listen.on('afterResourceBinding', sendEnableStanza); api.listen.on('afterResourceBinding', sendEnableStanza);
_converse.api.listen.on('send', onStanzaSent); api.listen.on('send', onStanzaSent);
} }
}); });
...@@ -14,8 +14,9 @@ converse.plugins.add('converse-status', { ...@@ -14,8 +14,9 @@ converse.plugins.add('converse-status', {
initialize () { initialize () {
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({ api.settings.update({
auto_away: 0, // Seconds after which user status is set to 'away' auto_away: 0, // Seconds after which user status is set to 'away'
auto_xa: 0, // Seconds after which user status is set to 'xa' auto_xa: 0, // Seconds after which user status is set to 'xa'
csi_waiting_time: 0, // Support for XEP-0352. Seconds before client is considered idle and CSI is sent out. csi_waiting_time: 0, // Support for XEP-0352. Seconds before client is considered idle and CSI is sent out.
...@@ -25,7 +26,7 @@ converse.plugins.add('converse-status', { ...@@ -25,7 +26,7 @@ converse.plugins.add('converse-status', {
_converse.XMPPStatus = Model.extend({ _converse.XMPPStatus = Model.extend({
defaults () { defaults () {
return {"status": _converse.api.settings.get("default_state")} return {"status": api.settings.get("default_state")}
}, },
initialize () { initialize () {
...@@ -50,7 +51,7 @@ converse.plugins.add('converse-status', { ...@@ -50,7 +51,7 @@ converse.plugins.add('converse-status', {
constructPresence (type, status_message) { constructPresence (type, status_message) {
let presence; let presence;
type = isString(type) ? type : (this.get('status') || _converse.api.settings.get("default_state")); type = isString(type) ? type : (this.get('status') || api.settings.get("default_state"));
status_message = isString(status_message) ? status_message : this.get('status_message'); status_message = isString(status_message) ? status_message : this.get('status_message');
// Most of these presence types are actually not explicitly sent, // Most of these presence types are actually not explicitly sent,
// but I add all of them here for reference and future proofing. // but I add all of them here for reference and future proofing.
...@@ -73,7 +74,7 @@ converse.plugins.add('converse-status', { ...@@ -73,7 +74,7 @@ converse.plugins.add('converse-status', {
presence.c('status').t(status_message).up(); presence.c('status').t(status_message).up();
} }
const priority = _converse.api.settings.get("priority"); const priority = api.settings.get("priority");
presence.c('priority').t(isNaN(Number(priority)) ? 0 : priority).up(); presence.c('priority').t(isNaN(Number(priority)) ? 0 : priority).up();
if (_converse.idle) { if (_converse.idle) {
const idle_since = new Date(); const idle_since = new Date();
...@@ -84,7 +85,7 @@ converse.plugins.add('converse-status', { ...@@ -84,7 +85,7 @@ converse.plugins.add('converse-status', {
}, },
sendPresence (type, status_message) { sendPresence (type, status_message) {
_converse.api.send(this.constructPresence(type, status_message)); api.send(this.constructPresence(type, status_message));
} }
}); });
...@@ -97,7 +98,7 @@ converse.plugins.add('converse-status', { ...@@ -97,7 +98,7 @@ converse.plugins.add('converse-status', {
* @param { String } stat - The user's chat status * @param { String } stat - The user's chat status
*/ */
_converse.sendCSI = function (stat) { _converse.sendCSI = function (stat) {
_converse.api.send($build(stat, {xmlns: Strophe.NS.CSI})); api.send($build(stat, {xmlns: Strophe.NS.CSI}));
_converse.inactive = (stat === _converse.INACTIVE) ? true : false; _converse.inactive = (stat === _converse.INACTIVE) ? true : false;
}; };
...@@ -123,7 +124,7 @@ converse.plugins.add('converse-status', { ...@@ -123,7 +124,7 @@ converse.plugins.add('converse-status', {
_converse.auto_changed_status = false; _converse.auto_changed_status = false;
// XXX: we should really remember the original state here, and // XXX: we should really remember the original state here, and
// then set it back to that... // then set it back to that...
_converse.xmppstatus.set('status', _converse.api.settings.get("default_state")); _converse.xmppstatus.set('status', api.settings.get("default_state"));
} }
}; };
...@@ -138,24 +139,24 @@ converse.plugins.add('converse-status', { ...@@ -138,24 +139,24 @@ converse.plugins.add('converse-status', {
} }
const stat = _converse.xmppstatus.get('status'); const stat = _converse.xmppstatus.get('status');
_converse.idle_seconds++; _converse.idle_seconds++;
if (_converse.api.settings.get("csi_waiting_time") > 0 && if (api.settings.get("csi_waiting_time") > 0 &&
_converse.idle_seconds > _converse.api.settings.get("csi_waiting_time") && _converse.idle_seconds > api.settings.get("csi_waiting_time") &&
!_converse.inactive) { !_converse.inactive) {
_converse.sendCSI(_converse.INACTIVE); _converse.sendCSI(_converse.INACTIVE);
} }
if (_converse.api.settings.get("idle_presence_timeout") > 0 && if (api.settings.get("idle_presence_timeout") > 0 &&
_converse.idle_seconds > _converse.api.settings.get("idle_presence_timeout") && _converse.idle_seconds > api.settings.get("idle_presence_timeout") &&
!_converse.idle) { !_converse.idle) {
_converse.idle = true; _converse.idle = true;
_converse.xmppstatus.sendPresence(); _converse.xmppstatus.sendPresence();
} }
if (_converse.api.settings.get("auto_away") > 0 && if (api.settings.get("auto_away") > 0 &&
_converse.idle_seconds > _converse.api.settings.get("auto_away") && _converse.idle_seconds > api.settings.get("auto_away") &&
stat !== 'away' && stat !== 'xa' && stat !== 'dnd') { stat !== 'away' && stat !== 'xa' && stat !== 'dnd') {
_converse.auto_changed_status = true; _converse.auto_changed_status = true;
_converse.xmppstatus.set('status', 'away'); _converse.xmppstatus.set('status', 'away');
} else if (_converse.api.settings.get("auto_xa") > 0 && } else if (api.settings.get("auto_xa") > 0 &&
_converse.idle_seconds > _converse.api.settings.get("auto_xa") && _converse.idle_seconds > api.settings.get("auto_xa") &&
stat !== 'xa' && stat !== 'dnd') { stat !== 'xa' && stat !== 'dnd') {
_converse.auto_changed_status = true; _converse.auto_changed_status = true;
_converse.xmppstatus.set('status', 'xa'); _converse.xmppstatus.set('status', 'xa');
...@@ -167,10 +168,10 @@ converse.plugins.add('converse-status', { ...@@ -167,10 +168,10 @@ converse.plugins.add('converse-status', {
* Required for the auto_away, auto_xa and csi_waiting_time features. * Required for the auto_away, auto_xa and csi_waiting_time features.
*/ */
if ( if (
_converse.api.settings.get("auto_away") < 1 && api.settings.get("auto_away") < 1 &&
_converse.api.settings.get("auto_xa") < 1 && api.settings.get("auto_xa") < 1 &&
_converse.api.settings.get("csi_waiting_time") < 1 && api.settings.get("csi_waiting_time") < 1 &&
_converse.api.settings.get("idle_presence_timeout") < 1 api.settings.get("idle_presence_timeout") < 1
) { ) {
// Waiting time of less then one second means features aren't used. // Waiting time of less then one second means features aren't used.
return; return;
...@@ -192,7 +193,7 @@ converse.plugins.add('converse-status', { ...@@ -192,7 +193,7 @@ converse.plugins.add('converse-status', {
}; };
_converse.api.listen.on('presencesInitialized', (reconnecting) => { api.listen.on('presencesInitialized', (reconnecting) => {
if (!reconnecting) { if (!reconnecting) {
_converse.registerIntervalHandler(); _converse.registerIntervalHandler();
} }
...@@ -206,7 +207,7 @@ converse.plugins.add('converse-status', { ...@@ -206,7 +207,7 @@ converse.plugins.add('converse-status', {
* @example _converse.api.listen.on('statusInitialized', status => { ... }); * @example _converse.api.listen.on('statusInitialized', status => { ... });
* @example _converse.api.waitUntil('statusInitialized').then(() => { ... }); * @example _converse.api.waitUntil('statusInitialized').then(() => { ... });
*/ */
_converse.api.trigger('statusInitialized', reconnecting); api.trigger('statusInitialized', reconnecting);
} }
...@@ -230,15 +231,15 @@ converse.plugins.add('converse-status', { ...@@ -230,15 +231,15 @@ converse.plugins.add('converse-status', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('clearSession', () => { api.listen.on('clearSession', () => {
if (_converse.shouldClearCache() && _converse.xmppstatus) { if (_converse.shouldClearCache() && _converse.xmppstatus) {
_converse.xmppstatus.destroy(); _converse.xmppstatus.destroy();
delete _converse.xmppstatus; delete _converse.xmppstatus;
} }
}); });
_converse.api.listen.on('connected', () => initStatus(false)); api.listen.on('connected', () => initStatus(false));
_converse.api.listen.on('reconnected', () => initStatus(true)); api.listen.on('reconnected', () => initStatus(true));
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
......
...@@ -65,8 +65,9 @@ converse.plugins.add('converse-vcard', { ...@@ -65,8 +65,9 @@ converse.plugins.add('converse-vcard', {
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
const { _converse } = this; const { _converse } = this;
const { api } = _converse;
_converse.api.promises.add('VCardsInitialized'); api.promises.add('VCardsInitialized');
_converse.VCard = Model.extend({ _converse.VCard = Model.extend({
...@@ -105,7 +106,7 @@ converse.plugins.add('converse-vcard', { ...@@ -105,7 +106,7 @@ converse.plugins.add('converse-vcard', {
initialize () { initialize () {
this.on('add', vcard => { this.on('add', vcard => {
_converse.api.vcard.update(vcard); api.vcard.update(vcard);
}); });
} }
}); });
...@@ -152,7 +153,7 @@ converse.plugins.add('converse-vcard', { ...@@ -152,7 +153,7 @@ converse.plugins.add('converse-vcard', {
const to = Strophe.getBareJidFromJid(jid) === _converse.bare_jid ? null : jid; const to = Strophe.getBareJidFromJid(jid) === _converse.bare_jid ? null : jid;
let iq; let iq;
try { try {
iq = await _converse.api.sendIQ(createStanza("get", to)) iq = await api.sendIQ(createStanza("get", to))
} catch (iq) { } catch (iq) {
return { return {
'stanza': iq, 'stanza': iq,
...@@ -174,7 +175,7 @@ converse.plugins.add('converse-vcard', { ...@@ -174,7 +175,7 @@ converse.plugins.add('converse-vcard', {
} else { } else {
jid = model.get('jid'); jid = model.get('jid');
} }
await _converse.api.waitUntil('VCardsInitialized'); await api.waitUntil('VCardsInitialized');
model.vcard = _converse.vcards.findWhere({'jid': jid}); model.vcard = _converse.vcards.findWhere({'jid': jid});
if (!model.vcard) { if (!model.vcard) {
model.vcard = _converse.vcards.create({'jid': jid}); model.vcard = _converse.vcards.create({'jid': jid});
...@@ -202,7 +203,7 @@ converse.plugins.add('converse-vcard', { ...@@ -202,7 +203,7 @@ converse.plugins.add('converse-vcard', {
async function setVCardOnMUCMessage (message) { async function setVCardOnMUCMessage (message) {
await _converse.api.waitUntil('VCardsInitialized'); await api.waitUntil('VCardsInitialized');
if (['error', 'info'].includes(message.get('type'))) { if (['error', 'info'].includes(message.get('type'))) {
return; return;
} else { } else {
...@@ -229,13 +230,13 @@ converse.plugins.add('converse-vcard', { ...@@ -229,13 +230,13 @@ converse.plugins.add('converse-vcard', {
* Triggered as soon as the `_converse.vcards` collection has been initialized and populated from cache. * Triggered as soon as the `_converse.vcards` collection has been initialized and populated from cache.
* @event _converse#VCardsInitialized * @event _converse#VCardsInitialized
*/ */
_converse.api.trigger('VCardsInitialized'); api.trigger('VCardsInitialized');
} }
function clearVCardsSession () { function clearVCardsSession () {
if (_converse.shouldClearCache()) { if (_converse.shouldClearCache()) {
_converse.api.promises.add('VCardsInitialized'); api.promises.add('VCardsInitialized');
if (_converse.vcards) { if (_converse.vcards) {
_converse.vcards.clearStore(); _converse.vcards.clearStore();
delete _converse.vcards; delete _converse.vcards;
...@@ -246,14 +247,14 @@ converse.plugins.add('converse-vcard', { ...@@ -246,14 +247,14 @@ converse.plugins.add('converse-vcard', {
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxInitialized', m => setVCardOnModel(m)); api.listen.on('chatBoxInitialized', m => setVCardOnModel(m));
_converse.api.listen.on('chatRoomInitialized', m => setVCardOnModel(m)); api.listen.on('chatRoomInitialized', m => setVCardOnModel(m));
_converse.api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m)); api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m));
_converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.VCARD)); api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.VCARD));
_converse.api.listen.on('clearSession', () => clearVCardsSession()); api.listen.on('clearSession', () => clearVCardsSession());
_converse.api.listen.on('messageInitialized', m => setVCardOnModel(m)); api.listen.on('messageInitialized', m => setVCardOnModel(m));
_converse.api.listen.on('rosterContactInitialized', m => setVCardOnModel(m)); api.listen.on('rosterContactInitialized', m => setVCardOnModel(m));
_converse.api.listen.on('statusInitialized', _converse.initVCardCollection); api.listen.on('statusInitialized', _converse.initVCardCollection);
/************************ BEGIN API ************************/ /************************ BEGIN API ************************/
...@@ -289,7 +290,7 @@ converse.plugins.add('converse-vcard', { ...@@ -289,7 +290,7 @@ converse.plugins.add('converse-vcard', {
throw Error("No jid provided for the VCard data"); throw Error("No jid provided for the VCard data");
} }
const vcard_el = Strophe.xmlHtmlNode(tpl_vcard(data)).firstElementChild; const vcard_el = Strophe.xmlHtmlNode(tpl_vcard(data)).firstElementChild;
return _converse.api.sendIQ(createStanza("set", jid, vcard_el)); return api.sendIQ(createStanza("set", jid, vcard_el));
}, },
/** /**
......
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