diff --git a/src/converse-bookmark-views.js b/src/converse-bookmark-views.js index f69808235..67d37e782 100644 --- a/src/converse-bookmark-views.js +++ b/src/converse-bookmark-views.js @@ -65,14 +65,14 @@ converse.plugins.add('converse-bookmark-views', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; // Configuration values for this plugin // ==================================== // Refer to docs/source/configuration.rst for explanations of these // configuration settings. - _converse.api.settings.update({ + api.settings.update({ hide_open_bookmarks: true, - muc_respect_autojoin: true }); @@ -96,7 +96,7 @@ converse.plugins.add('converse-bookmark-views', { */ ev.preventDefault(); 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(); }, }); @@ -203,7 +203,7 @@ converse.plugins.add('converse-bookmark-views', { }, 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({ '_converse': _converse, 'bookmarks': this.model, @@ -231,7 +231,7 @@ converse.plugins.add('converse-bookmark-views', { const data = { 'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid } - _converse.api.rooms.open(jid, data, true); + api.rooms.open(jid, data, true); }, removeBookmark: _converse.removeBookmarkViaEvent, @@ -255,7 +255,7 @@ converse.plugins.add('converse-bookmark-views', { /************************ BEGIN Event Handlers ************************/ const initBookmarkViews = async function () { - await _converse.api.waitUntil('roomsPanelRendered'); + await api.waitUntil('roomsPanelRendered'); _converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks}); /** * Triggered once the _converse.Bookmarks collection and _converse.BookmarksView view @@ -263,11 +263,11 @@ converse.plugins.add('converse-bookmark-views', { * @event _converse#bookmarkViewsInitialized * @example _converse.api.listen.on('bookmarkViewsInitialized', () => { ... }); */ - _converse.api.trigger('bookmarkViewsInitialized'); + api.trigger('bookmarkViewsInitialized'); } - _converse.api.listen.on('bookmarksInitialized', initBookmarkViews); - _converse.api.listen.on('chatRoomViewInitialized', view => view.setBookmarkState()); + api.listen.on('bookmarksInitialized', initBookmarkViews); + api.listen.on('chatRoomViewInitialized', view => view.setBookmarkState()); /************************ END Event Handlers ************************/ } }); diff --git a/src/converse-chatboxviews.js b/src/converse-chatboxviews.js index aee17d7d4..8403b97f7 100644 --- a/src/converse-chatboxviews.js +++ b/src/converse-chatboxviews.js @@ -48,14 +48,15 @@ converse.plugins.add('converse-chatboxviews', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; - _converse.api.promises.add(['chatBoxViewsInitialized']); + api.promises.add(['chatBoxViewsInitialized']); // Configuration values for this plugin // ==================================== // Refer to docs/source/configuration.rst for explanations of these // configuration settings. - _converse.api.settings.update({ + api.settings.update({ 'animate': true, 'theme': 'default' }); @@ -74,7 +75,7 @@ converse.plugins.add('converse-chatboxviews', { if (el === null) { el = document.createElement('div'); 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'); if (body) { body.appendChild(el); @@ -97,9 +98,9 @@ converse.plugins.add('converse-chatboxviews', { bg.innerHTML = tpl_background_logo(); } const body = document.querySelector('body'); - body.classList.add(`converse-${_converse.api.settings.get("view_mode")}`); - this.el.classList.add(`converse-${_converse.api.settings.get("view_mode")}`); - if (_converse.api.settings.get("singleton")) { + body.classList.add(`converse-${api.settings.get("view_mode")}`); + this.el.classList.add(`converse-${api.settings.get("view_mode")}`); + if (api.settings.get("singleton")) { this.el.classList.add(`converse-singleton`); } this.render(); @@ -133,7 +134,7 @@ converse.plugins.add('converse-chatboxviews', { /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('chatBoxesInitialized', () => { + api.listen.on('chatBoxesInitialized', () => { _converse.chatboxviews = new _converse.ChatBoxViews({ 'model': _converse.chatboxes }); @@ -142,17 +143,17 @@ converse.plugins.add('converse-chatboxviews', { * @event _converse#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 () { const vh = window.innerHeight * 0.01; document.documentElement.style.setProperty('--vh', `${vh}px`); } - _converse.api.listen.on('chatBoxViewsInitialized', () => calculateViewportHeightUnit()); + api.listen.on('chatBoxViewsInitialized', () => calculateViewportHeightUnit()); window.addEventListener('resize', () => calculateViewportHeightUnit()); /************************ END Event Handlers ************************/ } diff --git a/src/converse-chatview.js b/src/converse-chatview.js index 4b9b22a30..ac562e381 100644 --- a/src/converse-chatview.js +++ b/src/converse-chatview.js @@ -56,9 +56,10 @@ converse.plugins.add('converse-chatview', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; const { __ } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'auto_focus': true, 'message_limit': 0, 'show_send_button': false, @@ -91,7 +92,7 @@ converse.plugins.add('converse-chatview', { * @type { _converse.ChatBox } * @example _converse.api.listen.on('userDetailsModalInitialized', chatbox => { ... }); */ - _converse.api.trigger('userDetailsModalInitialized', this.model); + api.trigger('userDetailsModalInitialized', this.model); }, toHTML () { @@ -126,7 +127,7 @@ converse.plugins.add('converse-chatview', { const refresh_icon = this.el.querySelector('.fa-refresh'); u.addClass('fa-spin', refresh_icon); try { - await _converse.api.vcard.update(this.model.contact.vcard, true); + await api.vcard.update(this.model.contact.vcard, true); } catch (e) { log.fatal(e); this.alert(__('Sorry, something went wrong while trying to refresh'), 'danger'); @@ -149,7 +150,7 @@ converse.plugins.add('converse-chatview', { () => this.model.contact.destroy(), (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.', this.model.contact.getDisplayName()) ]); @@ -229,7 +230,7 @@ converse.plugins.add('converse-chatview', { * @type { _converse.HeadlinesBoxView } * @example _converse.api.listen.on('chatBoxViewInitialized', view => { ... }); */ - _converse.api.trigger('chatBoxViewInitialized', this); + api.trigger('chatBoxViewInitialized', this); }, initDebounced () { @@ -269,7 +270,7 @@ converse.plugins.add('converse-chatview', { }, renderToolbar () { - if (!_converse.api.settings.get('show_toolbar')) { + if (!api.settings.get('show_toolbar')) { return this; } const options = Object.assign( @@ -285,7 +286,7 @@ converse.plugins.add('converse-chatview', { * @type { _converse.ChatBoxView } * @example _converse.api.listen.on('renderToolbar', view => { ... }); */ - _converse.api.trigger('renderToolbar', this); + api.trigger('renderToolbar', this); return this; }, @@ -294,13 +295,13 @@ converse.plugins.add('converse-chatview', { form_container.innerHTML = tpl_chatbox_message_form( 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, 'label_message': this.model.get('composing_spoiler') ? __('Hidden message') : __('Message'), 'label_spoiler_hint': __('Optional hint'), 'message_value': this.el.querySelector('.chat-textarea')?.value, - 'show_send_button': _converse.api.settings.get('show_send_button'), - 'show_toolbar': _converse.api.settings.get('show_toolbar'), + 'show_send_button': api.settings.get('show_send_button'), + 'show_toolbar': api.settings.get('show_toolbar'), 'unread_msgs': __('You have unread messages') })); this.el.addEventListener('focusin', ev => this.emitFocused(ev)); @@ -346,7 +347,7 @@ converse.plugins.add('converse-chatview', { }, 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')) { return; } @@ -372,7 +373,7 @@ converse.plugins.add('converse-chatview', { } const results = await Promise.all( 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); @@ -429,9 +430,9 @@ converse.plugins.add('converse-chatview', { 'i18n_title': __('See more information about this person'), 'icon_class': 'fa-id-card', '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({ 'a_class': 'close-chatbox-button', 'handler': ev => this.close(ev), @@ -439,7 +440,7 @@ converse.plugins.add('converse-chatview', { 'i18n_title': __('Close and end this conversation'), 'icon_class': 'fa-times', 'name': 'close', - 'standalone': _converse.api.settings.get("view_mode") === 'overlayed', + 'standalone': api.settings.get("view_mode") === 'overlayed', }); } return buttons; @@ -456,9 +457,9 @@ converse.plugins.add('converse-chatview', { 'label_clear': __('Clear all messages'), 'label_message_limit': __('Message characters remaining'), 'label_toggle_spoiler': label_toggle_spoiler, - 'message_limit': _converse.api.settings.get('message_limit'), - 'show_call_button': _converse.api.settings.get('visible_toolbar_buttons').call, - 'show_spoiler_button': _converse.api.settings.get('visible_toolbar_buttons').spoiler, + 'message_limit': api.settings.get('message_limit'), + 'show_call_button': api.settings.get('visible_toolbar_buttons').call, + 'show_spoiler_button': api.settings.get('visible_toolbar_buttons').spoiler, 'tooltip_start_call': __('Start a call') } }, @@ -476,7 +477,7 @@ converse.plugins.add('converse-chatview', { * @type {_converse.ChatBoxView | _converse.ChatRoomView} * @example _converse.api.listen.on('afterMessagesFetched', view => { ... }); */ - _converse.api.trigger('afterMessagesFetched', this); + api.trigger('afterMessagesFetched', this); }, insertIntoDOM () { @@ -487,7 +488,7 @@ converse.plugins.add('converse-chatview', { * @type { _converse.ChatBoxView | _converse.HeadlinesBoxView } * @example _converse.api.listen.on('chatBoxInsertedIntoDOM', view => { ... }); */ - _converse.api.trigger('chatBoxInsertedIntoDOM', this); + api.trigger('chatBoxInsertedIntoDOM', this); return this; }, @@ -631,7 +632,7 @@ converse.plugins.add('converse-chatview', { * @property { string } message - The message text * @example _converse.api.listen.on('contactStatusMessageChanged', obj => { ... }); */ - _converse.api.trigger('contactStatusMessageChanged', { + api.trigger('contactStatusMessageChanged', { 'contact': item.attributes, 'message': item.get('status') }); @@ -792,7 +793,7 @@ converse.plugins.add('converse-chatview', { * @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model * @example _converse.api.listen.on('messageAdded', data => { ... }); */ - _converse.api.trigger('messageAdded', { + api.trigger('messageAdded', { 'message': message, 'chatbox': this.model }); @@ -824,7 +825,7 @@ converse.plugins.add('converse-chatview', { ev.preventDefault(); const textarea = this.el.querySelector('.chat-textarea'); 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) { return; } @@ -833,7 +834,7 @@ converse.plugins.add('converse-chatview', { ['Sorry, the connection has been lost, and your message could not be sent'], 'error' ); - _converse.api.connection.reconnect(); + api.connection.reconnect(); return; } let spoiler_hint, hint_el = {}; @@ -860,9 +861,9 @@ converse.plugins.add('converse-chatview', { * @type { _converse.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 // doesn't resize when the textarea is resized to its original size. this.msgs_container.parentElement.style.display = 'none'; @@ -870,7 +871,7 @@ converse.plugins.add('converse-chatview', { textarea.removeAttribute('disabled'); u.removeClass('disabled', textarea); - if (_converse.api.settings.get("view_mode") === 'overlayed') { + if (api.settings.get("view_mode") === 'overlayed') { // XXX: Chrome flexbug workaround. this.msgs_container.parentElement.style.display = ''; } @@ -881,9 +882,9 @@ converse.plugins.add('converse-chatview', { }, updateCharCounter (chars) { - if (_converse.api.settings.get('message_limit')) { + if (api.settings.get('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; if (counter < 1) { u.addClass('error', message_limit); @@ -992,10 +993,10 @@ converse.plugins.add('converse-chatview', { "be removed everywhere."); 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; } - const result = await _converse.api.confirm(__('Confirm'), messages); + const result = await api.confirm(__('Confirm'), messages); if (result) { this.model.retractOwnMessage(message); } @@ -1138,7 +1139,7 @@ converse.plugins.add('converse-chatview', { * @property { _converse.ChatBox | _converse.ChatRoom } _converse.connection - The XMPP Connection object * @example _converse.api.listen.on('callButtonClicked', (connection, model) => { ... }); */ - _converse.api.trigger('callButtonClicked', { + api.trigger('callButtonClicked', { connection: _converse.connection, model: this.model }); @@ -1207,7 +1208,7 @@ converse.plugins.add('converse-chatview', { if (_converse.router.history.getFragment() === "converse/chat?jid="+this.model.get('jid')) { _converse.router.navigate(''); } - if (_converse.api.connection.connected()) { + if (api.connection.connected()) { // Immediately sending the chat state, because the // model is going to be destroyed afterwards. this.model.setChatState(_converse.INACTIVE); @@ -1221,7 +1222,7 @@ converse.plugins.add('converse-chatview', { * @type { _converse.ChatBoxView | _converse.ChatRoomView } * @example _converse.api.listen.on('chatBoxClosed', view => { ... }); */ - _converse.api.trigger('chatBoxClosed', this); + api.trigger('chatBoxClosed', this); return this; }, @@ -1236,7 +1237,7 @@ converse.plugins.add('converse-chatview', { * @type { _converse.ChatBoxView | _converse.ChatRoomView } * @example _converse.api.listen.on('chatBoxBlurred', (view, event) => { ... }); */ - _converse.api.trigger('chatBoxBlurred', this, ev); + api.trigger('chatBoxBlurred', this, ev); }, emitFocused (ev) { @@ -1250,7 +1251,7 @@ converse.plugins.add('converse-chatview', { * @type { _converse.ChatBoxView | _converse.ChatRoomView } * @example _converse.api.listen.on('chatBoxFocused', (view, event) => { ... }); */ - _converse.api.trigger('chatBoxFocused', this, ev); + api.trigger('chatBoxFocused', this, ev); }, focus () { @@ -1262,7 +1263,7 @@ converse.plugins.add('converse-chatview', { }, maybeFocus () { - _converse.api.settings.get('auto_focus') && this.focus(); + api.settings.get('auto_focus') && this.focus(); }, hide () { @@ -1289,9 +1290,9 @@ converse.plugins.add('converse-chatview', { * @type {object} * @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()); } else { u.showElement(this.el); @@ -1363,7 +1364,7 @@ converse.plugins.add('converse-chatview', { * @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model * @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) { @@ -1381,7 +1382,7 @@ converse.plugins.add('converse-chatview', { } }); - _converse.api.listen.on('chatBoxViewsInitialized', () => { + api.listen.on('chatBoxViewsInitialized', () => { const views = _converse.chatboxviews; _converse.chatboxes.on('add', async item => { if (!views.get(item.get('id')) && item.get('type') === _converse.PRIVATE_CHAT_TYPE) { @@ -1402,13 +1403,13 @@ converse.plugins.add('converse-chatview', { }); } } - _converse.api.listen.on('windowStateChanged', onWindowStateChanged); - _converse.api.listen.on('connected', () => _converse.api.disco.own.features.add(Strophe.NS.SPOILER)); + api.listen.on('windowStateChanged', onWindowStateChanged); + api.listen.on('connected', () => api.disco.own.features.add(Strophe.NS.SPOILER)); /************************ END Event Handlers ************************/ /************************ BEGIN API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * The "chatview" namespace groups methods pertaining to views * for one-on-one chats. diff --git a/src/converse-controlbox.js b/src/converse-controlbox.js index 0b17d35e1..bbab1f720 100644 --- a/src/converse-controlbox.js +++ b/src/converse-controlbox.js @@ -98,10 +98,11 @@ converse.plugins.add('converse-controlbox', { /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - const { _converse } = this, - { __ } = _converse; + const { _converse } = this; + const { api } = _converse; + const { __ } = _converse; - _converse.api.settings.update({ + api.settings.update({ allow_logout: true, default_domain: undefined, locked_domain: undefined, @@ -109,7 +110,7 @@ converse.plugins.add('converse-controlbox', { sticky_controlbox: false }); - _converse.api.promises.add('controlBoxInitialized'); + api.promises.add('controlBoxInitialized'); _converse.ControlBox = _converse.ChatBox.extend({ @@ -119,7 +120,7 @@ converse.plugins.add('converse-controlbox', { 'bookmarked': false, 'box_id': 'controlbox', 'chat_state': undefined, - 'closed': !_converse.api.settings.get('show_controlbox_by_default'), + 'closed': !api.settings.get('show_controlbox_by_default'), 'num_unread': 0, 'time_opened': this.get('time_opened') || (new Date()).getTime(), 'type': _converse.CONTROLBOX_TYPE, @@ -137,7 +138,7 @@ converse.plugins.add('converse-controlbox', { validate (attrs) { 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; @@ -191,13 +192,13 @@ converse.plugins.add('converse-controlbox', { * @type { _converse.ControlBoxView } * @example _converse.api.listen.on('controlBoxInitialized', view => { ... }); */ - _converse.api.trigger('controlBoxInitialized', this); + api.trigger('controlBoxInitialized', this); }, render () { if (this.model.get('connected')) { 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())); @@ -225,7 +226,7 @@ converse.plugins.add('converse-controlbox', { createBrandHeadingHTML () { 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', { if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev?.name === 'closeAllChatBoxes' && (_converse.disconnection_cause !== _converse.LOGOUT || - _converse.api.settings.get('show_controlbox_by_default'))) { + api.settings.get('show_controlbox_by_default'))) { return; } - if (_converse.api.settings.get('sticky_controlbox')) { + if (api.settings.get('sticky_controlbox')) { return; } const connection = _converse?.connection || {}; @@ -302,7 +303,7 @@ converse.plugins.add('converse-controlbox', { } else { this.model.trigger('hide'); } - _converse.api.trigger('controlBoxClosed', this); + api.trigger('controlBoxClosed', this); return this; }, @@ -315,13 +316,13 @@ converse.plugins.add('converse-controlbox', { }, hide (callback) { - if (_converse.api.settings.get('sticky_controlbox')) { + if (api.settings.get('sticky_controlbox')) { return; } 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.show(callback); @@ -336,7 +337,7 @@ converse.plugins.add('converse-controlbox', { * @event _converse#controlBoxOpened * @type {_converse.ControlBox} */ - _converse.api.trigger('controlBoxOpened', this); + api.trigger('controlBoxOpened', this); }, show () { @@ -387,12 +388,12 @@ converse.plugins.add('converse-controlbox', { 'LOGIN': _converse.LOGIN, 'PREBIND': _converse.PREBIND, 'auto_login': _converse.auto_login, - 'authentication': _converse.api.settings.get("authentication"), + 'authentication': api.settings.get("authentication"), 'connection_status': connection_status, 'conn_feedback_class': feedback_class, 'conn_feedback_subject': pretty_status, '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'), 'show_trust_checkbox': _converse.trusted !== 'on' && _converse.trusted !== 'off' }) @@ -402,8 +403,8 @@ converse.plugins.add('converse-controlbox', { initPopovers () { Array.from(this.el.querySelectorAll('[data-title]')).forEach(el => { new bootstrap.Popover(el, { - 'trigger': _converse.api.settings.get("view_mode") === 'mobile' && 'click' || 'hover', - 'dismissible': _converse.api.settings.get("view_mode") === 'mobile' && true || false, + 'trigger': api.settings.get("view_mode") === 'mobile' && 'click' || 'hover', + 'dismissible': api.settings.get("view_mode") === 'mobile' && true || false, 'container': this.el.parentElement.parentElement.parentElement }) }); @@ -413,8 +414,8 @@ converse.plugins.add('converse-controlbox', { const form = this.el.querySelector('form'); const jid_element = form.querySelector('input[name=jid]'); if (jid_element.value && - !_converse.api.settings.get('locked_domain') && - !_converse.api.settings.get('default_domain') && + !api.settings.get('locked_domain') && + !api.settings.get('default_domain') && !u.isValidJID(jid_element.value)) { jid_element.setCustomValidity(__('Please enter a valid XMPP address')); return false; @@ -427,7 +428,7 @@ converse.plugins.add('converse-controlbox', { /* Authenticate the user based on a form submission event. */ 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); } if (!this.validate()) { return; } @@ -447,14 +448,14 @@ converse.plugins.add('converse-controlbox', { } let jid = form_data.get('jid'); - if (_converse.api.settings.get('locked_domain')) { - const last_part = '@' + _converse.api.settings.get('locked_domain'); + if (api.settings.get('locked_domain')) { + const last_part = '@' + api.settings.get('locked_domain'); if (jid.endsWith(last_part)) { jid = jid.substr(0, jid.length - last_part.length); } jid = Strophe.escapeNode(jid) + last_part; - } else if (_converse.api.settings.get('default_domain') && !jid.includes('@')) { - jid = jid + '@' + _converse.api.settings.get('default_domain'); + } else if (api.settings.get('default_domain') && !jid.includes('@')) { + jid = jid + '@' + api.settings.get('default_domain'); } this.connect(jid, form_data.get('password')); }, @@ -464,7 +465,7 @@ converse.plugins.add('converse-controlbox', { _converse.router.navigate('', {'replace': true}); } _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', { * @type { _converse.ControlBoxPane } * @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', { initialize () { _converse.chatboxviews.insertRowColumn(this.render().el); - _converse.api.waitUntil('initialized') + api.waitUntil('initialized') .then(this.render.bind(this)) .catch(e => log.fatal(e)); }, @@ -509,7 +510,7 @@ converse.plugins.add('converse-controlbox', { // artifacts (i.e. on page load the toggle is shown only to then // seconds later be hidden in favor of the controlbox). 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; }, @@ -532,7 +533,7 @@ converse.plugins.add('converse-controlbox', { if (!controlbox) { controlbox = addControlBox(); } - if (_converse.api.connection.connected()) { + if (api.connection.connected()) { controlbox.save({'closed': false}); } else { controlbox.trigger('show'); @@ -543,7 +544,7 @@ converse.plugins.add('converse-controlbox', { e.preventDefault(); if (u.isVisible(_converse.root.querySelector("#controlbox"))) { const controlbox = _converse.chatboxes.get('controlbox'); - if (_converse.api.connection.connected) { + if (api.connection.connected) { controlbox.save({closed: true}); } else { controlbox.trigger('hide'); @@ -557,7 +558,7 @@ converse.plugins.add('converse-controlbox', { /******************** Event Handlers ********************/ - _converse.api.listen.on('chatBoxViewsInitialized', () => { + api.listen.on('chatBoxViewsInitialized', () => { _converse.chatboxes.on('add', item => { if (item.get('type') === _converse.CONTROLBOX_TYPE) { const views = _converse.chatboxviews; @@ -572,7 +573,7 @@ converse.plugins.add('converse-controlbox', { }); }); - _converse.api.listen.on('clearSession', () => { + api.listen.on('clearSession', () => { const chatboxviews = _converse?.chatboxviews; const view = chatboxviews && chatboxviews.get('controlbox'); if (view) { @@ -585,11 +586,11 @@ converse.plugins.add('converse-controlbox', { }); - _converse.api.waitUntil('chatBoxViewsInitialized') + api.waitUntil('chatBoxViewsInitialized') .then(addControlBox) .catch(e => log.fatal(e)); - _converse.api.listen.on('chatBoxesFetched', () => { + api.listen.on('chatBoxesFetched', () => { const controlbox = _converse.chatboxes.get('controlbox') || addControlBox(); controlbox.save({'connected': true}); }); @@ -603,12 +604,12 @@ converse.plugins.add('converse-controlbox', { view.model.set({'connected': false}); return view; }; - _converse.api.listen.on('disconnected', () => disconnect().renderLoginPanel()); - _converse.api.listen.on('will-reconnect', disconnect); + api.listen.on('disconnected', () => disconnect().renderLoginPanel()); + api.listen.on('will-reconnect', disconnect); /************************ API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * The "controlbox" namespace groups methods pertaining to the * controlbox view @@ -623,9 +624,9 @@ converse.plugins.add('converse-controlbox', { * @returns { Promise<_converse.ControlBox> } */ async open () { - await _converse.api.waitUntil('chatBoxesFetched'); - const model = await _converse.api.chatboxes.get('controlbox') || - _converse.api.chatboxes.create('controlbox', {}, _converse.Controlbox); + await api.waitUntil('chatBoxesFetched'); + const model = await api.chatboxes.get('controlbox') || + api.chatboxes.create('controlbox', {}, _converse.Controlbox); model.trigger('show'); return model; }, diff --git a/src/converse-dragresize.js b/src/converse-dragresize.js index 4e91ecb7d..736b4755a 100644 --- a/src/converse-dragresize.js +++ b/src/converse-dragresize.js @@ -134,8 +134,9 @@ converse.plugins.add('converse-dragresize', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'allow_dragresize': true, }); @@ -252,7 +253,7 @@ converse.plugins.add('converse-dragresize', { }, onStartVerticalResize (ev, trigger=true) { - if (!_converse.api.settings.get('allow_dragresize')) { + if (!api.settings.get('allow_dragresize')) { return true; } // Record element attributes for mouseMove(). @@ -270,12 +271,12 @@ converse.plugins.add('converse-dragresize', { * @event _converse#startVerticalResize * @example _converse.api.listen.on('startVerticalResize', (view) => { ... }); */ - _converse.api.trigger('startVerticalResize', this); + api.trigger('startVerticalResize', this); } }, onStartHorizontalResize (ev, trigger=true) { - if (!_converse.api.settings.get('allow_dragresize')) { + if (!api.settings.get('allow_dragresize')) { return true; } const flyout = this.el.querySelector('.box-flyout'), @@ -292,7 +293,7 @@ converse.plugins.add('converse-dragresize', { * @event _converse#startHorizontalResize * @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', { * @event _converse#startDiagonalResize * @example _converse.api.listen.on('startDiagonalResize', (view) => { ... }); */ - _converse.api.trigger('startDiagonalResize', this); + api.trigger('startDiagonalResize', this); }, }; Object.assign(_converse.ChatBoxView.prototype, dragResizable); @@ -332,7 +333,7 @@ converse.plugins.add('converse-dragresize', { function onMouseMove (ev) { - if (!_converse.resizing || !_converse.api.settings.get('allow_dragresize')) { + if (!_converse.resizing || !api.settings.get('allow_dragresize')) { return true; } ev.preventDefault(); @@ -341,7 +342,7 @@ converse.plugins.add('converse-dragresize', { function onMouseUp (ev) { - if (!_converse.resizing || !_converse.api.settings.get('allow_dragresize')) { + if (!_converse.resizing || !api.settings.get('allow_dragresize')) { return true; } ev.preventDefault(); @@ -353,7 +354,7 @@ converse.plugins.add('converse-dragresize', { _converse.resizing.chatbox.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({'width': width}); } else { @@ -374,9 +375,9 @@ converse.plugins.add('converse-dragresize', { document.removeEventListener('mouseup', onMouseUp); } - _converse.api.listen.on('registeredGlobalEventHandlers', registerGlobalEventHandlers); - _converse.api.listen.on('unregisteredGlobalEventHandlers', unregisterGlobalEventHandlers); - _converse.api.listen.on('beforeShowingChatView', view => view.initDragResize().setDimensions()); + api.listen.on('registeredGlobalEventHandlers', registerGlobalEventHandlers); + api.listen.on('unregisteredGlobalEventHandlers', unregisterGlobalEventHandlers); + api.listen.on('beforeShowingChatView', view => view.initDragResize().setDimensions()); /************************ END Event Handlers ************************/ } }); diff --git a/src/converse-emoji-views.js b/src/converse-emoji-views.js index 06a981deb..9b2fb7e3d 100644 --- a/src/converse-emoji-views.js +++ b/src/converse-emoji-views.js @@ -68,9 +68,10 @@ converse.plugins.add('converse-emoji-views', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; const { __ } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'use_system_emojis': true, 'visible_toolbar_buttons': { 'emoji': true @@ -91,7 +92,7 @@ converse.plugins.add('converse-emoji-views', { }, async createEmojiPicker () { - await _converse.api.emojis.initialize() + await api.emojis.initialize() const id = `converse.emoji-${_converse.bare_jid}-${this.model.get('jid')}`; const emojipicker = new _converse.EmojiPicker({'id': id}); @@ -151,7 +152,7 @@ converse.plugins.add('converse-emoji-views', { Object.assign( this.model.toJSON(), { '_converse': _converse, - 'emoji_categories': _converse.api.settings.get('emoji_categories'), + 'emoji_categories': api.settings.get('emoji_categories'), 'emojis_by_category': _converse.emojis.json, 'onSkintonePicked': ev => this.chooseSkinTone(ev), 'onEmojiPicked': ev => this.insertEmoji(ev), @@ -415,18 +416,18 @@ converse.plugins.add('converse-emoji-views', { /************************ 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 => { - if (_converse.api.settings.get('visible_toolbar_buttons').emoji) { + api.listen.on('renderToolbar', view => { + if (api.settings.get('visible_toolbar_buttons').emoji) { const html = tpl_emoji_button({'tooltip_insert_smiley': __('Insert emojis')}); view.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html); } }); - _converse.api.listen.on('headlinesBoxInitialized', () => _converse.api.emojis.initialize()); - _converse.api.listen.on('chatRoomInitialized', () => _converse.api.emojis.initialize()); - _converse.api.listen.on('chatBoxInitialized', () => _converse.api.emojis.initialize()); + api.listen.on('headlinesBoxInitialized', () => api.emojis.initialize()); + api.listen.on('chatRoomInitialized', () => api.emojis.initialize()); + api.listen.on('chatBoxInitialized', () => api.emojis.initialize()); /************************ END Event Handlers ************************/ } diff --git a/src/converse-headlines-view.js b/src/converse-headlines-view.js index fd9dacb94..b127de355 100644 --- a/src/converse-headlines-view.js +++ b/src/converse-headlines-view.js @@ -48,6 +48,7 @@ converse.plugins.add('converse-headlines-view', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; const viewWithHeadlinesPanel = { @@ -62,7 +63,7 @@ converse.plugins.add('converse-headlines-view', { * @event _converse#headlinesPanelRendered * @example _converse.api.listen.on('headlinesPanelRendered', () => { ... }); */ - _converse.api.trigger('headlinesPanelRendered'); + api.trigger('headlinesPanelRendered'); return this.headlinepanel; } } @@ -150,7 +151,7 @@ converse.plugins.add('converse-headlines-view', { * @type { _converse.HeadlinesBoxView } * @example _converse.api.listen.on('headlinesBoxViewInitialized', view => { ... }); */ - _converse.api.trigger('headlinesBoxViewInitialized', this); + api.trigger('headlinesBoxViewInitialized', this); }, render () { @@ -177,7 +178,7 @@ converse.plugins.add('converse-headlines-view', { /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('chatBoxViewsInitialized', () => { + api.listen.on('chatBoxViewsInitialized', () => { const views = _converse.chatboxviews; _converse.chatboxes.on('add', item => { if (!views.get(item.get('id')) && item.get('type') === _converse.HEADLINES_TYPE) { diff --git a/src/converse-message-view.js b/src/converse-message-view.js index a5ccef687..f0d205ee3 100644 --- a/src/converse-message-view.js +++ b/src/converse-message-view.js @@ -32,6 +32,7 @@ converse.plugins.add('converse-message-view', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; const { __ } = _converse; @@ -65,7 +66,7 @@ converse.plugins.add('converse-message-view', { } - _converse.api.settings.update({ + api.settings.update({ 'show_images_inline': true, 'time_format': 'HH:mm', }); @@ -153,7 +154,7 @@ converse.plugins.add('converse-message-view', { }, fadeOut () { - if (_converse.api.settings.get('animate')) { + if (api.settings.get('animate')) { setTimeout(() => this.remove(), 600); u.addClass('fade-out', this.el); } else { @@ -204,10 +205,10 @@ converse.plugins.add('converse-message-view', { * @param { string } text - The message 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 = 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.addHyperlinks(text); text = u.renderNewLines(text); @@ -220,12 +221,12 @@ converse.plugins.add('converse-message-view', { * @param { string } text - The message 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; }, async renderChatMessage () { - await _converse.api.waitUntil('emojisInitialized'); + await api.waitUntil('emojisInitialized'); const time = dayjs(this.model.get('time')); const role = this.model.vcard ? this.model.vcard.get('role') : null; const roles = role ? role.split(',') : []; @@ -243,7 +244,7 @@ converse.plugins.add('converse-message-view', { 'is_me_message': this.model.isMeCommand(), 'label_show': __('Show more'), '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, 'roles': roles, 'time': time.toISOString(), @@ -259,7 +260,7 @@ converse.plugins.add('converse-message-view', { const msg_content = msg.querySelector('.chat-msg__text'); if (text && text !== url) { 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()); } } diff --git a/src/converse-minimize.js b/src/converse-minimize.js index 677eaab27..44730cf8e 100644 --- a/src/converse-minimize.js +++ b/src/converse-minimize.js @@ -165,8 +165,9 @@ converse.plugins.add('converse-minimize', { */ const { _converse } = this; const { __ } = _converse; + const { api } = _converse; - _converse.api.settings.update({'no_trimming': false}); + api.settings.update({'no_trimming': false}); const minimizableChatBox = { maximize () { @@ -210,7 +211,7 @@ converse.plugins.add('converse-minimize', { * @type { _converse.ChatBoxView } * @example _converse.api.listen.on('chatBoxMaximized', view => { ... }); */ - _converse.api.trigger('chatBoxMaximized', this); + api.trigger('chatBoxMaximized', this); return this; }, @@ -239,7 +240,7 @@ converse.plugins.add('converse-minimize', { * @type { _converse.ChatBoxView } * @example _converse.api.listen.on('chatBoxMinimized', view => { ... }); */ - _converse.api.trigger('chatBoxMinimized', this); + api.trigger('chatBoxMinimized', this); return this; }, @@ -314,7 +315,7 @@ converse.plugins.add('converse-minimize', { * @param { _converse.ChatBoxView|_converse.ChatRoomView|_converse.ControlBoxView|_converse.HeadlinesBoxView } [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; } const shown_chats = this.getShownChats(); @@ -328,7 +329,7 @@ converse.plugins.add('converse-minimize', { // fullscreen. In this case we don't trim. return; } - await _converse.api.waitUntil('minimizedChatsInitialized'); + await api.waitUntil('minimizedChatsInitialized'); const minimized_el = _converse.minimized_chats?.el; if (minimized_el) { while ((this.getMinimizedWidth() + this.getBoxesWidth(newchat)) > body_width) { @@ -369,7 +370,7 @@ converse.plugins.add('converse-minimize', { Object.assign(_converse.ChatBoxViews.prototype, chatTrimmer); - _converse.api.promises.add('minimizedChatsInitialized'); + api.promises.add('minimizedChatsInitialized'); _converse.MinimizedChatBoxView = View.extend({ tagName: 'div', @@ -390,7 +391,7 @@ converse.plugins.add('converse-minimize', { * @type { _converse.MinimizedChatBoxView } * @example _converse.api.listen.on('minimizedChatViewInitialized', view => { ... }); */ - _converse.api.trigger('minimizedChatViewInitialized', this); + api.trigger('minimizedChatViewInitialized', this); }, render () { @@ -413,7 +414,7 @@ converse.plugins.add('converse-minimize', { view.close(); } else { this.model.destroy(); - _converse.api.trigger('chatBoxClosed', this); + api.trigger('chatBoxClosed', this); } return this; }, @@ -562,17 +563,17 @@ converse.plugins.add('converse-minimize', { * @event _converse#minimizedChatsInitialized * @example _converse.api.listen.on('minimizedChatsInitialized', () => { ... }); */ - _converse.api.trigger('minimizedChatsInitialized'); + api.trigger('minimizedChatsInitialized'); } /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('chatBoxViewsInitialized', () => initMinimizedChats()); - _converse.api.listen.on('chatBoxInsertedIntoDOM', view => _converse.chatboxviews.trimChats(view)); - _converse.api.listen.on('controlBoxOpened', view => _converse.chatboxviews.trimChats(view)); + api.listen.on('chatBoxViewsInitialized', () => initMinimizedChats()); + api.listen.on('chatBoxInsertedIntoDOM', view => _converse.chatboxviews.trimChats(view)); + api.listen.on('controlBoxOpened', view => _converse.chatboxviews.trimChats(view)); const debouncedTrimChats = debounce(() => _converse.chatboxviews.trimChats(), 250); - _converse.api.listen.on('registeredGlobalEventHandlers', () => window.addEventListener("resize", debouncedTrimChats)); - _converse.api.listen.on('unregisteredGlobalEventHandlers', () => window.removeEventListener("resize", debouncedTrimChats)); + api.listen.on('registeredGlobalEventHandlers', () => window.addEventListener("resize", debouncedTrimChats)); + api.listen.on('unregisteredGlobalEventHandlers', () => window.removeEventListener("resize", debouncedTrimChats)); /************************ END Event Handlers ************************/ } }); diff --git a/src/converse-muc-views.js b/src/converse-muc-views.js index a2b760584..aa9717954 100644 --- a/src/converse-muc-views.js +++ b/src/converse-muc-views.js @@ -90,14 +90,15 @@ converse.plugins.add('converse-muc-views', { initialize () { const { _converse } = this; + const { api } = _converse; - _converse.api.promises.add(['roomsPanelRendered']); + api.promises.add(['roomsPanelRendered']); // Configuration values for this plugin // ==================================== // Refer to docs/source/configuration.rst for explanations of these // configuration settings. - _converse.api.settings.update({ + api.settings.update({ 'auto_list_rooms': false, 'cache_muc_messages': true, 'locked_muc_nickname': false, @@ -142,7 +143,7 @@ converse.plugins.add('converse-muc-views', { * @event _converse#roomsPanelRendered * @example _converse.api.listen.on('roomsPanelRendered', () => { ... }); */ - _converse.api.trigger('roomsPanelRendered'); + api.trigger('roomsPanelRendered'); return this.roomspanel; }, @@ -216,7 +217,7 @@ converse.plugins.add('converse-muc-views', { parent_el.querySelector('a.room-info').classList.remove('selected'); } else { 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)) .catch(e => log.error(e)); } @@ -449,7 +450,7 @@ converse.plugins.add('converse-muc-views', { const jid = ev.target.getAttribute('data-room-jid'); const name = ev.target.getAttribute('data-room-name'); this.modal.hide(); - _converse.api.rooms.open(jid, {'name': name}); + api.rooms.open(jid, {'name': name}); }, toggleRoomInfo (ev) { @@ -516,7 +517,7 @@ converse.plugins.add('converse-muc-views', { 'from': _converse.connection.jid, 'type': "get" }).c("query", {xmlns: Strophe.NS.DISCO_ITEMS}); - _converse.api.sendIQ(iq) + api.sendIQ(iq) .then(iq => this.onRoomsFound(iq)) .catch(() => this.informNoRoomsFound()) }, @@ -606,7 +607,7 @@ converse.plugins.add('converse-muc-views', { jid = data.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(); ev.target.reset(); }, @@ -735,7 +736,7 @@ converse.plugins.add('converse-muc-views', { * @type { _converse.ChatRoomView } * @example _converse.api.listen.on('chatRoomViewInitialized', view => { ... }); */ - _converse.api.trigger('chatRoomViewInitialized', this); + api.trigger('chatRoomViewInitialized', this); }, render () { @@ -990,7 +991,7 @@ converse.plugins.add('converse-muc-views', { if (_converse.show_retraction_warning) { messages[1] = retraction_warning; } - const result = await _converse.api.confirm(__('Confirm'), messages); + const result = await api.confirm(__('Confirm'), messages); if (result) { this.retractOwnMessage(message); } @@ -1000,7 +1001,7 @@ converse.plugins.add('converse-muc-views', { if (_converse.show_retraction_warning) { messages = [messages[0], retraction_warning, messages[1]] } - if (await _converse.api.confirm(__('Confirm'), messages)) { + if (await api.confirm(__('Confirm'), messages)) { this.retractOtherMessage(message); } } else { @@ -1011,7 +1012,7 @@ converse.plugins.add('converse-muc-views', { if (_converse.show_retraction_warning) { messages = [messages[0], retraction_warning, messages[1]] } - const reason = await _converse.api.prompt( + const reason = await api.prompt( __('Message Retraction'), messages, __('Optional reason') @@ -1022,7 +1023,7 @@ converse.plugins.add('converse-muc-views', { } } else { 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', { const result = await this.model.retractOtherMessage(message, reason); if (result === null) { const err_msg = __(`A timeout occurred while trying to retract the message`); - _converse.api.alert('error', __('Error'), err_msg); - _converse.log(err_msg, Strophe.LogLevel.WARN); + api.alert('error', __('Error'), err_msg); + log(err_msg, Strophe.LogLevel.WARN); } else if (u.isErrorStanza(result)) { const err_msg = __(`Sorry, you're not allowed to retract this message.`); - _converse.api.alert('error', __('Error'), err_msg); - _converse.log(err_msg, Strophe.LogLevel.WARN); - _converse.log(result, Strophe.LogLevel.WARN); + api.alert('error', __('Error'), err_msg); + log(err_msg, Strophe.LogLevel.WARN); + log(result, Strophe.LogLevel.WARN); } }, @@ -1225,17 +1226,17 @@ converse.plugins.add('converse-muc-views', { }); } - if (!_converse.api.settings.get("singleton")) { + if (!api.settings.get("singleton")) { buttons.push({ 'i18n_text': __('Leave'), 'i18n_title': __('Leave and close this groupchat'), 'handler': async ev => { 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); }, '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', 'name': 'signout' }); @@ -1547,7 +1548,7 @@ converse.plugins.add('converse-muc-views', { async destroy (reason, new_jid) { 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()) } }, @@ -1646,7 +1647,7 @@ converse.plugins.add('converse-muc-views', { this.showErrorMessage(__('Your nickname is "%1$s"', this.model.get('nick'))) } else { const jid = Strophe.getBareJidFromJid(this.model.get('jid')); - _converse.api.send($pres({ + api.send($pres({ from: _converse.connection.jid, to: `${jid}/${args}`, id: u.getUniqueId() @@ -1825,7 +1826,7 @@ converse.plugins.add('converse-muc-views', { if (switch_el) { switch_el.addEventListener('click', async ev => { 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); this.model.destroy(); }); @@ -2359,8 +2360,8 @@ converse.plugins.add('converse-muc-views', { }); } } - _converse.api.waitUntil('discoInitialized').then(() => { - _converse.api.listen.on('serviceDiscovered', featureAdded); + api.waitUntil('discoInitialized').then(() => { + api.listen.on('serviceDiscovered', featureAdded); // Features could have been added before the controlbox was // initialized. We're only interested in MUC _converse.disco_entities.each(entity => featureAdded(entity.features.findWhere({'var': Strophe.NS.MUC }))); @@ -2381,11 +2382,11 @@ converse.plugins.add('converse-muc-views', { /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('chatBoxViewsInitialized', () => { + api.listen.on('chatBoxViewsInitialized', () => { function openChatRoomFromURIClicked (ev) { ev.preventDefault(); - _converse.api.rooms.open(ev.target.href); + api.rooms.open(ev.target.href); } _converse.chatboxviews.delegate('click', 'a.open-chatroom', openChatRoomFromURIClicked); @@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc-views', { _converse.chatboxes.on('add', addView); }); - _converse.api.listen.on('clearSession', () => { + api.listen.on('clearSession', () => { const view = _converse.chatboxviews.get('controlbox'); if (view && view.roomspanel) { view.roomspanel.model.destroy(); @@ -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) { return; } @@ -2454,10 +2455,10 @@ converse.plugins.add('converse-muc-views', { */ get (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) } else { - const view = _converse.api.chatviews.get(jids); + const view = api.chatviews.get(jids); if (view.model.get('type') === _converse.CHATROOMS_TYPE) { return view; } else { diff --git a/src/converse-notification.js b/src/converse-notification.js index 6810582e9..cece8e6e0 100644 --- a/src/converse-notification.js +++ b/src/converse-notification.js @@ -20,17 +20,18 @@ converse.plugins.add('converse-notification', { */ const { _converse } = this; const { __ } = _converse; + const { api } = _converse; _converse.supports_html5_notification = "Notification" in window; - _converse.api.settings.update({ + api.settings.update({ notify_all_room_messages: false, show_desktop_notifications: true, show_chat_state_notifications: false, chatstate_notification_blacklist: [], // ^ a list of JIDs to ignore concerning chat state notifications 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_delay: 5000 }); @@ -135,7 +136,7 @@ converse.plugins.add('converse-notification', { const full_from_jid = message.getAttribute('from'), from_jid = Strophe.getBareJidFromJid(full_from_jid); 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); } else { return; @@ -154,7 +155,7 @@ converse.plugins.add('converse-notification', { if (roster_item !== undefined) { title = __("%1$s says", roster_item.getDisplayName()); } else { - if (_converse.api.settings.get("allow_non_roster_messaging")) { + if (api.settings.get("allow_non_roster_messaging")) { title = __("%1$s says", from_jid); } else { return; @@ -262,7 +263,7 @@ converse.plugins.add('converse-notification', { * @type { XMLElement } * @example _converse.api.listen.on('messageNotification', stanza => { ... }); */ - _converse.api.trigger('messageNotification', message); + api.trigger('messageNotification', message); _converse.playSoundNotification(); _converse.showMessageNotification(message); }; @@ -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 // registered, because other plugins might override some of our // handlers. - _converse.api.listen.on('contactRequest', _converse.handleContactRequestNotification); - _converse.api.listen.on('contactPresenceChanged', _converse.handleChatStateNotification); - _converse.api.listen.on('message', _converse.handleMessageNotification); - _converse.api.listen.on('feedback', _converse.handleFeedback); - _converse.api.listen.on('connected', _converse.requestPermission); + api.listen.on('contactRequest', _converse.handleContactRequestNotification); + api.listen.on('contactPresenceChanged', _converse.handleChatStateNotification); + api.listen.on('message', _converse.handleMessageNotification); + api.listen.on('feedback', _converse.handleFeedback); + api.listen.on('connected', _converse.requestPermission); }); } }); diff --git a/src/converse-oauth.js b/src/converse-oauth.js index 4ed96a081..834ab6a33 100644 --- a/src/converse-oauth.js +++ b/src/converse-oauth.js @@ -55,8 +55,9 @@ converse.plugins.add("converse-oauth", { render () { const { _converse } = this.__super__; + const { api } = _converse; 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(); } return result; @@ -68,10 +69,11 @@ converse.plugins.add("converse-oauth", { /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - const { _converse } = this, - { __ } = _converse; + const { _converse } = this; + const { api } = _converse; + const { __ } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'oauth_providers': {}, }); @@ -79,7 +81,7 @@ converse.plugins.add("converse-oauth", { 'sync': function sync () {}, initialize () { - _converse.api.settings.get('oauth_providers').forEach(provider => { + api.settings.get('oauth_providers').forEach(provider => { const item = new Model(Object.assign(provider, { 'login_text': __('Log in with %1$s', provider.name) })); @@ -102,7 +104,7 @@ converse.plugins.add("converse-oauth", { async fetchOAuthProfileDataAndLogin () { const profile = await this.oauth_service.api('me'); const response = this.oauth_service.getAuthResponse(); - _converse.api.user.login( + api.user.login( `${profile.name}@${this.provider.get('host')}`, response.access_token ); diff --git a/src/converse-omemo.js b/src/converse-omemo.js index 5c8d7d6ae..013739b18 100644 --- a/src/converse-omemo.js +++ b/src/converse-omemo.js @@ -242,12 +242,13 @@ converse.plugins.add('converse-omemo', { */ const { _converse } = this; const { __ } = _converse; + const { api } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'omemo_default': false, }); - _converse.api.promises.add(['OMEMOInitialized']); + api.promises.add(['OMEMOInitialized']); _converse.NUM_PREKEYS = 100; // Set here so that tests can override @@ -306,7 +307,7 @@ converse.plugins.add('converse-omemo', { }, reportDecryptionError (e) { - if (_converse.api.settings.get("loglevel") === 'debug') { + if (api.settings.get("loglevel") === 'debug') { const { __ } = _converse; this.createMessage({ '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', { err_msgs.push(__("Unable to send an encrypted message due to an unexpected error.")); err_msgs.push(e.iq.outerHTML); } - _converse.api.alert('error', __('Error'), err_msgs); + api.alert('error', __('Error'), err_msgs); log.error(e); } else if (e.user_facing) { - _converse.api.alert('error', __('Error'), [e.message]); + api.alert('error', __('Error'), [e.message]); log.error(e); } else { throw e; @@ -471,7 +472,7 @@ converse.plugins.add('converse-omemo', { this.model.contact.getDisplayName() )]; } - return _converse.api.alert('error', __('Error'), messages); + return api.alert('error', __('Error'), messages); } ev.preventDefault(); this.model.save({'omemo_active': !this.model.get('omemo_active')}); @@ -500,7 +501,7 @@ converse.plugins.add('converse-omemo', { } async function getDevicesForContact (jid) { - await _converse.api.waitUntil('OMEMOInitialized'); + await api.waitUntil('OMEMOInitialized'); const devicelist = _converse.devicelists.get(jid) || _converse.devicelists.create({'jid': jid}); await devicelist.fetchDevices(); return devicelist.devices; @@ -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()); 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 () { @@ -933,7 +934,7 @@ converse.plugins.add('converse-omemo', { let iq; try { - iq = await _converse.api.sendIQ(stanza) + iq = await api.sendIQ(stanza) } catch (iq) { throw new IQError("Could not fetch bundle", iq); } @@ -1037,7 +1038,7 @@ converse.plugins.add('converse-omemo', { let iq; try { - iq = await _converse.api.sendIQ(stanza); + iq = await api.sendIQ(stanza); } catch (e) { log.error(e); return []; @@ -1054,7 +1055,7 @@ converse.plugins.add('converse-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()); 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) { @@ -1193,7 +1194,7 @@ converse.plugins.add('converse-omemo', { * @event _converse#OMEMOInitialized * @example _converse.api.listen.on('OMEMOInitialized', () => { ... }); */ - _converse.api.trigger('OMEMOInitialized'); + api.trigger('OMEMOInitialized'); } async function onOccupantAdded (chatroom, occupant) { @@ -1216,20 +1217,20 @@ converse.plugins.add('converse-omemo', { async function checkOMEMOSupported (chatbox) { let supported; 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'); } else if (chatbox.get('type') === _converse.PRIVATE_CHAT_TYPE) { supported = await _converse.contactHasOMEMOSupport(chatbox.get('jid')); } 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); } } /******************** Event Handlers ********************/ - _converse.api.waitUntil('chatBoxesInitialized').then(() => + api.waitUntil('chatBoxesInitialized').then(() => _converse.chatboxes.on('add', chatbox => { checkOMEMOSupported(chatbox); if (chatbox.get('type') === _converse.CHATROOMS_TYPE) { @@ -1239,24 +1240,24 @@ converse.plugins.add('converse-omemo', { }) ); - _converse.api.listen.on('connected', registerPEPPushHandler); - _converse.api.listen.on('renderToolbar', view => view.renderOMEMOToolbarButton()); - _converse.api.listen.on('statusInitialized', initOMEMO); - _converse.api.listen.on('addClientFeatures', - () => _converse.api.disco.own.features.add(`${Strophe.NS.OMEMO_DEVICELIST}+notify`)); + api.listen.on('connected', registerPEPPushHandler); + api.listen.on('renderToolbar', view => view.renderOMEMOToolbarButton()); + api.listen.on('statusInitialized', initOMEMO); + api.listen.on('addClientFeatures', + () => 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'); _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.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) { _converse.devicelists.clearStore(); delete _converse.devicelists; diff --git a/src/converse-profile.js b/src/converse-profile.js index 28250ed23..fea9034f8 100644 --- a/src/converse-profile.js +++ b/src/converse-profile.js @@ -27,10 +27,11 @@ converse.plugins.add('converse-profile', { /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - const { _converse } = this, - { __ } = _converse; + const { _converse } = this; + const { api } = _converse; + const { __ } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'show_client_info': true }); @@ -52,7 +53,7 @@ converse.plugins.add('converse-profile', { * @type { _converse.XMPPStatus } * @example _converse.api.listen.on('profileModalInitialized', status => { ... }); */ - _converse.api.trigger('profileModalInitialized', this.model); + api.trigger('profileModalInitialized', this.model); }, toHTML () { @@ -84,11 +85,11 @@ converse.plugins.add('converse-profile', { }, setVCard (data) { - _converse.api.vcard.set(_converse.bare_jid, data) - .then(() => _converse.api.vcard.update(this.model.vcard, true)) + api.vcard.set(_converse.bare_jid, data) + .then(() => api.vcard.update(this.model.vcard, true)) .catch((err) => { log.fatal(err); - _converse.api.show('error', __('Error'), [ + api.show('error', __('Error'), [ __("Sorry, an error happened while trying to save your profile data."), __("You can check your browser's developer console for any error output.") ]); @@ -251,7 +252,7 @@ converse.plugins.add('converse-profile', { ev.preventDefault(); const result = confirm(__("Are you sure you want to log out?")); if (result === true) { - _converse.api.user.logout(); + api.user.logout(); } }, @@ -274,8 +275,8 @@ converse.plugins.add('converse-profile', { /******************** Event Handlers ********************/ - _converse.api.listen.on('controlBoxPaneInitialized', async view => { - await _converse.api.waitUntil('VCardsInitialized'); + api.listen.on('controlBoxPaneInitialized', async view => { + await api.waitUntil('VCardsInitialized'); _converse.xmppstatusview = new _converse.XMPPStatusView({'model': _converse.xmppstatus}); view.el.insertAdjacentElement('afterBegin', _converse.xmppstatusview.render().el); }); diff --git a/src/converse-push.js b/src/converse-push.js index 560a1ff24..9748f19e7 100644 --- a/src/converse-push.js +++ b/src/converse-push.js @@ -22,8 +22,9 @@ converse.plugins.add('converse-push', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'push_app_servers': [], 'enable_muc_push': false }); @@ -32,7 +33,7 @@ converse.plugins.add('converse-push', { if (!push_app_server.jid) { 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.`); return; } @@ -47,7 +48,7 @@ converse.plugins.add('converse-push', { if (push_app_server.node) { stanza.attrs({'node': push_app_server.node}); } - _converse.api.sendIQ(stanza) + api.sendIQ(stanza) .catch(e => { log.error(`Could not disable push app server for ${push_app_server.jid}`); log.error(e); @@ -58,15 +59,15 @@ converse.plugins.add('converse-push', { if (!push_app_server.jid || !push_app_server.node) { 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) { return log.warn( `Not enabling push the service "${push_app_server.jid}", it doesn't have the right disco identtiy.` ); } const result = await Promise.all([ - _converse.api.disco.supports(Strophe.NS.PUSH, push_app_server.jid), - _converse.api.disco.supports(Strophe.NS.PUSH, domain) + api.disco.supports(Strophe.NS.PUSH, push_app_server.jid), + api.disco.supports(Strophe.NS.PUSH, domain) ]); if (!result[0] && !result[1]) { 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', { .c('field', {'var': 'secret'}) .c('value').t(push_app_server.secret); } - return _converse.api.sendIQ(stanza); + return api.sendIQ(stanza); } async function enablePush (domain) { @@ -97,8 +98,8 @@ converse.plugins.add('converse-push', { if (push_enabled.includes(domain)) { return; } - const enabled_services = reject(_converse.api.settings.get('push_app_servers'), 'disable'); - const disabled_services = filter(_converse.api.settings.get('push_app_servers'), 'disable'); + const enabled_services = reject(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 disabled = disabled_services.map(s => disablePushAppServer(domain, s)); try { @@ -111,15 +112,15 @@ converse.plugins.add('converse-push', { } _converse.session.save('push_enabled', push_enabled); } - _converse.api.listen.on('statusInitialized', () => enablePush()); + api.listen.on('statusInitialized', () => enablePush()); function onChatBoxAdded (model) { if (model.get('type') == _converse.CHATROOMS_TYPE) { enablePush(Strophe.getDomainFromJid(model.get('jid'))); } } - if (_converse.api.settings.get('enable_muc_push')) { - _converse.api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded)); + if (api.settings.get('enable_muc_push')) { + api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded)); } } }); diff --git a/src/converse-register.js b/src/converse-register.js index ebfab8575..7ba024ebe 100644 --- a/src/converse-register.js +++ b/src/converse-register.js @@ -7,6 +7,7 @@ * @license Mozilla Public License (MPLv2) */ import "converse-controlbox"; +import { __ } from '@converse/headless/i18n'; import { View } from "skeletor.js/src/view"; import { pick } from "lodash"; import converse from "@converse/headless/converse-core"; @@ -63,15 +64,15 @@ converse.plugins.add('converse-register', { /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - const { _converse } = this, - { __ } = _converse; + const { _converse } = this; + const { api } = _converse; _converse.CONNECTION_STATUS[Strophe.Status.REGIFAIL] = 'REGIFAIL'; _converse.CONNECTION_STATUS[Strophe.Status.REGISTERED] = 'REGISTERED'; _converse.CONNECTION_STATUS[Strophe.Status.CONFLICT] = 'CONFLICT'; _converse.CONNECTION_STATUS[Strophe.Status.NOTACCEPTABLE] = 'NOTACCEPTABLE'; - _converse.api.settings.update({ + api.settings.update({ 'allow_registration': true, '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 @@ -95,7 +96,7 @@ converse.plugins.add('converse-register', { }, renderRegistrationPanel () { - if (_converse.api.settings.get('allow_registration')) { + if (api.settings.get('allow_registration')) { this.registerpanel = new _converse.RegisterPanel({ 'model': this.model }); @@ -113,7 +114,7 @@ converse.plugins.add('converse-register', { function setActiveForm (value) { - _converse.api.waitUntil('controlBoxInitialized').then(() => { + api.waitUntil('controlBoxInitialized').then(() => { const controlbox = _converse.chatboxes.get('controlbox') controlbox.set({'active-form': value}); }).catch(e => log.fatal(e)); @@ -138,22 +139,22 @@ converse.plugins.add('converse-register', { initialize () { this.reset(); - _converse.api.listen.on('connectionInitialized', () => this.registerHooks()); + api.listen.on('connectionInitialized', () => this.registerHooks()); }, render () { this.model.set('registration_form_rendered', false); 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'), 'help_providers': __('Tip: A list of public XMPP providers is available'), 'help_providers_link': __('here'), - 'href_providers': _converse.api.settings.get('providers_link'), - 'domain_placeholder': _converse.api.settings.get('domain_placeholder') + 'href_providers': api.settings.get('providers_link'), + 'domain_placeholder': api.settings.get('domain_placeholder') }); - if (_converse.api.settings.get('registration_domain')) { - this.fetchRegistrationForm(_converse.api.settings.get('registration_domain')); + if (api.settings.get('registration_domain')) { + this.fetchRegistrationForm(api.settings.get('registration_domain')); } return this; }, @@ -324,7 +325,7 @@ converse.plugins.add('converse-register', { 'beforeend', tpl_registration_request({ '__': _converse.__, - 'cancel': _converse.api.settings.get('registration_domain'), + 'cancel': api.settings.get('registration_domain'), }) ); }, @@ -447,11 +448,11 @@ converse.plugins.add('converse-register', { renderRegistrationForm (stanza) { const form = this.el.querySelector('form'); form.innerHTML = tpl_registration_form({ - '__': _converse.__, + '__': __, 'domain': this.domain, 'title': this.title, 'instructions': this.instructions, - 'registration_domain': _converse.api.settings.get('registration_domain') + 'registration_domain': api.settings.get('registration_domain') }); const buttons = form.querySelector('fieldset.buttons'); @@ -522,9 +523,9 @@ converse.plugins.add('converse-register', { _converse.connection._proto._abortAllRequests(); _converse.connection.reset(); 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( - _converse.api.settings.get('registration_domain') + api.settings.get('registration_domain') ); } } else { @@ -645,7 +646,7 @@ converse.plugins.add('converse-register', { }); /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('controlBoxInitialized', view => { + api.listen.on('controlBoxInitialized', view => { view.model.on('change:active-form', view.showLoginOrRegisterForm, view); }); /************************ END Event Handlers ************************/ diff --git a/src/converse-roomslist.js b/src/converse-roomslist.js index 128d848b2..443b55540 100644 --- a/src/converse-roomslist.js +++ b/src/converse-roomslist.js @@ -38,9 +38,10 @@ converse.plugins.add('converse-roomslist', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; // Promises exposed by this plugin - _converse.api.promises.add('roomsListInitialized'); + api.promises.add('roomsListInitialized'); _converse.RoomsList = Model.extend({ @@ -121,8 +122,8 @@ converse.plugins.add('converse-roomslist', { const data = { 'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid } - await _converse.api.rooms.open(jid, data, true); - _converse.api.chatviews.get(jid).maybeFocus(); + await api.rooms.open(jid, data, true); + api.chatviews.get(jid).maybeFocus(); }, closeRoom (ev) { @@ -164,22 +165,22 @@ converse.plugins.add('converse-roomslist', { * @event _converse#roomsListInitialized * @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) { - await _converse.api.waitUntil('bookmarksInitialized'); + await api.waitUntil('bookmarksInitialized'); } else { await Promise.all([ - _converse.api.waitUntil('chatBoxesFetched'), - _converse.api.waitUntil('roomsPanelRendered') + api.waitUntil('chatBoxesFetched'), + api.waitUntil('roomsPanelRendered') ]); } initRoomsListView(); }); - _converse.api.listen.on('reconnected', initRoomsListView); + api.listen.on('reconnected', initRoomsListView); } }); diff --git a/src/converse-rosterview.js b/src/converse-rosterview.js index b5f4de4f7..a656f6fb8 100644 --- a/src/converse-rosterview.js +++ b/src/converse-rosterview.js @@ -33,10 +33,11 @@ converse.plugins.add('converse-rosterview', { /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - const { _converse } = this, - { __ } = _converse; + const { _converse } = this; + const { api } = _converse; + const { __ } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'autocomplete_add_contact': true, 'allow_chat_pending_contacts': true, 'allow_contact_removal': true, @@ -44,7 +45,7 @@ converse.plugins.add('converse-rosterview', { 'roster_groups': true, 'xhr_user_search_url': null, }); - _converse.api.promises.add('rosterViewInitialized'); + api.promises.add('rosterViewInitialized'); const STATUSES = { 'dnd': __('This contact is busy'), @@ -68,7 +69,7 @@ converse.plugins.add('converse-rosterview', { }, 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(), { '_converse': _converse, 'label_nickname': label_nickname, @@ -76,7 +77,7 @@ converse.plugins.add('converse-rosterview', { }, 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(); } else { this.initJIDAutoComplete(); @@ -86,7 +87,7 @@ converse.plugins.add('converse-rosterview', { }, initJIDAutoComplete () { - if (!_converse.api.settings.get('autocomplete_add_contact')) { + if (!api.settings.get('autocomplete_add_contact')) { return; } const el = this.el.querySelector('.suggestion-box__jid').parentElement; @@ -98,7 +99,7 @@ converse.plugins.add('converse-rosterview', { }, initXHRAutoComplete () { - if (!_converse.api.settings.get('autocomplete_add_contact')) { + if (!api.settings.get('autocomplete_add_contact')) { return this.initXHRFetch(); } const el = this.el.querySelector('.suggestion-box__name').parentElement; @@ -119,7 +120,7 @@ converse.plugins.add('converse-rosterview', { }; const input_el = this.el.querySelector('input[name="name"]'); 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() } , 300)); this.name_auto_complete.on('suggestion-box-selectcomplete', ev => { @@ -176,9 +177,9 @@ converse.plugins.add('converse-rosterview', { const data = new FormData(ev.target), 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"]'); - 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() return; } @@ -357,7 +358,7 @@ converse.plugins.add('converse-rosterview', { Object.assign(this.model.toJSON(), { 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) { @@ -368,7 +369,7 @@ converse.plugins.add('converse-rosterview', { 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), - '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)) { @@ -419,7 +420,7 @@ converse.plugins.add('converse-rosterview', { 'desc_status': STATUSES[show], '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), - '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, classes: '' }) @@ -438,7 +439,7 @@ converse.plugins.add('converse-rosterview', { */ mayBeShown () { 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 ((this.model.get('ask') === 'subscribe') || (this.model.get('subscription') === 'from') || @@ -453,12 +454,12 @@ converse.plugins.add('converse-rosterview', { openChat (ev) { if (ev && ev.preventDefault) { ev.preventDefault(); } const attrs = this.model.attributes; - _converse.api.chats.open(attrs.jid, attrs, true); + api.chats.open(attrs.jid, attrs, true); }, async removeContact (ev) { 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; } try { @@ -471,7 +472,7 @@ converse.plugins.add('converse-rosterview', { } } catch (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())] ); } @@ -744,9 +745,9 @@ converse.plugins.add('converse-rosterview', { // just this group's) have been fetched from browser // storage or the XMPP server and once they've been // 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})); this.update(); this.updateFilter(); @@ -892,7 +893,7 @@ converse.plugins.add('converse-rosterview', { addExistingContact (contact, options) { let groups; - if (_converse.api.settings.get('roster_groups')) { + if (api.settings.get('roster_groups')) { groups = contact.get('groups'); groups = (groups.length === 0) ? [_converse.HEADER_UNGROUPED] : groups; } else { @@ -931,7 +932,7 @@ converse.plugins.add('converse-rosterview', { }); /* -------- Event Handlers ----------- */ - _converse.api.listen.on('chatBoxesInitialized', () => { + api.listen.on('chatBoxesInitialized', () => { function highlightRosterItem (chatbox) { const contact = _converse.roster && _converse.roster.findWhere({'jid': chatbox.get('jid')}); if (contact !== undefined) { @@ -943,13 +944,13 @@ converse.plugins.add('converse-rosterview', { }); - _converse.api.listen.on('controlBoxInitialized', (view) => { + api.listen.on('controlBoxInitialized', (view) => { 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; } /* Place the rosterview inside the "Contacts" panel. */ - _converse.api.waitUntil('rosterViewInitialized') + api.waitUntil('rosterViewInitialized') .then(() => view.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el)) .catch(e => log.fatal(e)); } @@ -962,7 +963,7 @@ converse.plugins.add('converse-rosterview', { /* Create an instance of RosterView once the RosterGroups * 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; } _converse.rosterview = new _converse.RosterView({ @@ -974,12 +975,12 @@ converse.plugins.add('converse-rosterview', { * @event _converse#rosterViewInitialized * @example _converse.api.listen.on('rosterViewInitialized', () => { ... }); */ - _converse.api.trigger('rosterViewInitialized'); + api.trigger('rosterViewInitialized'); } - _converse.api.listen.on('rosterInitialized', initRosterView); - _converse.api.listen.on('rosterReadyAfterReconnection', initRosterView); + api.listen.on('rosterInitialized', initRosterView); + api.listen.on('rosterReadyAfterReconnection', initRosterView); - _converse.api.listen.on('afterTearDown', () => { + api.listen.on('afterTearDown', () => { if (converse.rosterview) { converse.rosterview.model.off().reset(); converse.rosterview.each(groupview => groupview.removeAll().remove()); diff --git a/src/headless/converse-bookmarks.js b/src/headless/converse-bookmarks.js index 8aac73fc0..89a2ae050 100644 --- a/src/headless/converse-bookmarks.js +++ b/src/headless/converse-bookmarks.js @@ -60,20 +60,21 @@ converse.plugins.add('converse-bookmarks', { /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - const { _converse } = this, - { __ } = _converse; + const { _converse } = this; + const { api } = _converse; + const { __ } = _converse; // Configuration values for this plugin // ==================================== // Refer to docs/source/configuration.rst for explanations of these // configuration settings. - _converse.api.settings.update({ + api.settings.update({ allow_bookmarks: true, allow_public_bookmarks: false, muc_respect_autojoin: true }); - _converse.api.promises.add('bookmarksInitialized'); + api.promises.add('bookmarksInitialized'); /** * Check if the user has a bookmark with a saved nickanme @@ -82,7 +83,7 @@ converse.plugins.add('converse-bookmarks', { * @method _converse#getNicknameFromBookmark */ _converse.getNicknameFromBookmark = function (jid) { - if (!_converse.bookmarks || !_converse.api.settings.get('allow_bookmarks')) { + if (!_converse.bookmarks || !api.settings.get('allow_bookmarks')) { return null; } const bookmark = _converse.bookmarks.findWhere({'jid': jid}); @@ -116,8 +117,8 @@ converse.plugins.add('converse-bookmarks', { }, async openBookmarkedRoom (bookmark) { - if ( _converse.api.settings.get('muc_respect_autojoin') && bookmark.get('autojoin')) { - const groupchat = await _converse.api.rooms.create(bookmark.get('jid'), bookmark.get('nick')); + if ( api.settings.get('muc_respect_autojoin') && bookmark.get('autojoin')) { + const groupchat = await api.rooms.create(bookmark.get('jid'), bookmark.get('nick')); groupchat.maybeShow(); } return bookmark; @@ -166,13 +167,13 @@ converse.plugins.add('converse-bookmarks', { .c('value').t('true').up().up() .c('field', {'var':'pubsub#access_model'}) .c('value').t('whitelist'); - return _converse.api.sendIQ(stanza); + return api.sendIQ(stanza); }, onBookmarkError (iq, options) { log.error("Error while trying to add bookmark"); log.error(iq); - _converse.api.alert( + api.alert( 'error', __('Error'), [__("Sorry, something went wrong while trying to save your bookmark.")] ); this.findWhere({'jid': options.jid}).destroy(); @@ -184,7 +185,7 @@ converse.plugins.add('converse-bookmarks', { 'type': 'get', }).c('pubsub', {'xmlns': Strophe.NS.PUBSUB}) .c('items', {'node': 'storage:bookmarks'}); - _converse.api.sendIQ(stanza) + api.sendIQ(stanza) .then(iq => this.onBookmarksReceived(deferred, iq)) .catch(iq => this.onBookmarksReceivedError(deferred, iq) ); @@ -231,7 +232,7 @@ converse.plugins.add('converse-bookmarks', { onBookmarksReceivedError (deferred, iq) { if (iq === null) { 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. "+ "You can reload the page to request them again.")] ); @@ -263,16 +264,16 @@ converse.plugins.add('converse-bookmarks', { }); _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) { return !!identity; } 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 () { - if (!_converse.api.settings.get('allow_bookmarks')) { + if (!api.settings.get('allow_bookmarks')) { return; } if (await _converse.checkBookmarksSupport()) { @@ -284,11 +285,11 @@ converse.plugins.add('converse-bookmarks', { * @event _converse#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) { _converse.bookmarks.clearStore({'silent': true}); window.sessionStorage.removeItem(_converse.bookmarks.fetched_flag); @@ -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 _converse.connection.addHandler(message => { 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)) .catch(e => log.fatal(e)); } }, null, 'message', 'headline', null, _converse.bare_jid); - await Promise.all([_converse.api.waitUntil('chatBoxesFetched')]); + await Promise.all([api.waitUntil('chatBoxesFetched')]); initBookmarks(); }); } diff --git a/src/headless/converse-bosh.js b/src/headless/converse-bosh.js index d40e0bc89..3a44ca90a 100644 --- a/src/headless/converse-bosh.js +++ b/src/headless/converse-bosh.js @@ -22,8 +22,9 @@ converse.plugins.add('converse-bosh', { initialize () { const { _converse } = this; + const { api } = _converse; - _converse.api.settings.update({ + api.settings.update({ bosh_service_url: undefined, prebind_url: null }); @@ -51,11 +52,11 @@ converse.plugins.add('converse-bosh', { _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"); } 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.onload = async function () { if (xhr.status >= 200 && xhr.status < 400) { @@ -79,7 +80,7 @@ converse.plugins.add('converse-bosh', { * @type { _converse } * @example _converse.api.listen.on('noResumeableBOSHSession', _converse => { ... }); */ - _converse.api.trigger('noResumeableBOSHSession', _converse); + api.trigger('noResumeableBOSHSession', _converse); }; xhr.send(); } @@ -101,7 +102,7 @@ converse.plugins.add('converse-bosh', { /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('clearSession', () => { + api.listen.on('clearSession', () => { if (_converse.bosh_session === undefined) { // Remove manually, even if we don't have the corresponding // model, to avoid trying to reconnect to a stale BOSH session @@ -114,28 +115,28 @@ converse.plugins.add('converse-bosh', { } }); - _converse.api.listen.on('setUserJID', () => { + api.listen.on('setUserJID', () => { if (_converse.bosh_session !== undefined) { _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 ************************/ /************************ BEGIN API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * This namespace lets you access the BOSH tokens * - * @namespace _converse.api.tokens - * @memberOf _converse.api + * @namespace api.tokens + * @memberOf api */ tokens: { /** - * @method _converse.api.tokens.get + * @method api.tokens.get * @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. * @example _converse.api.tokens.get('rid'); diff --git a/src/headless/converse-chat.js b/src/headless/converse-chat.js index f2fd7e9b1..529662c00 100644 --- a/src/headless/converse-chat.js +++ b/src/headless/converse-chat.js @@ -35,13 +35,14 @@ converse.plugins.add('converse-chat', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; const { __ } = _converse; // Configuration values for this plugin // ==================================== // Refer to docs/source/configuration.rst for explanations of these // configuration settings. - _converse.api.settings.update({ + api.settings.update({ 'allow_message_corrections': 'all', 'allow_message_retraction': 'all', 'auto_join_private_chats': [], @@ -58,7 +59,7 @@ converse.plugins.add('converse-chat', { }, async setRosterContact (jid) { - const contact = await _converse.api.contacts.get(jid); + const contact = await api.contacts.get(jid); if (contact) { this.contact = contact; this.set('nickname', contact.get('nickname')); @@ -103,7 +104,7 @@ converse.plugins.add('converse-chat', { * @type { _converse.Message} * @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(); }, @@ -151,7 +152,7 @@ converse.plugins.add('converse-chat', { */ mayBeRetracted () { 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 () { @@ -212,7 +213,7 @@ converse.plugins.add('converse-chat', { 'size': this.file.size, 'content-type': this.file.type }) - return _converse.api.sendIQ(iq); + return api.sendIQ(iq); }, async getRequestSlotURL () { @@ -306,7 +307,7 @@ converse.plugins.add('converse-chat', { return { 'bookmarked': false, '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', 'nickname': undefined, 'num_unread': 0, @@ -347,7 +348,7 @@ converse.plugins.add('converse-chat', { * @type { _converse.ChatBox} * @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(); }, @@ -361,7 +362,7 @@ converse.plugins.add('converse-chat', { this.messages.browserStorage = _converse.createStore(this.getMessagesCacheKey()); this.listenTo(this.messages, 'change:upload', message => { 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', { * @type {_converse.ChatBox | _converse.ChatRoom} * @example _converse.api.listen.on('afterMessagesFetched', view => { ... }); */ - _converse.api.trigger('afterMessagesFetched', this); + api.trigger('afterMessagesFetched', this); }, fetchMessages () { @@ -453,7 +454,7 @@ converse.plugins.add('converse-chat', { } catch (e) { log.error(e); } finally { - if (_converse.api.settings.get('clear_messages_on_reconnection')) { + if (api.settings.get('clear_messages_on_reconnection')) { await this.clearMessages(); } } @@ -466,11 +467,11 @@ converse.plugins.add('converse-chat', { * @type {_converse.ChatBox | _converse.ChatRoom} * @example _converse.api.listen.on('onChatReconnected', chatbox => { ... }); */ - _converse.api.trigger('chatReconnected', this); + api.trigger('chatReconnected', this); }, async onReconnection () { - if (_converse.api.settings.get('clear_messages_on_reconnection')) { + if (api.settings.get('clear_messages_on_reconnection')) { await this.clearMessages(); } this.announceReconnection(); @@ -481,8 +482,8 @@ converse.plugins.add('converse-chat', { return 'Ignored ChatBox without JID'; } 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); - if (_converse.api.settings.get("singleton") && !auto_join.includes(attrs.jid) && !_converse.auto_join_on_invite) { + const auto_join = api.settings.get('auto_join_private_chats').concat(room_jids); + 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`; log.warn(msg); return msg; @@ -793,7 +794,7 @@ converse.plugins.add('converse-chat', { 'to': to_jid, 'type': 'chat', }).c(type, {'xmlns': Strophe.NS.MARKERS, 'id': id}); - _converse.api.send(stanza); + api.send(stanza); }, handleChatMarker (stanza, from_jid) { @@ -836,7 +837,7 @@ converse.plugins.add('converse-chat', { 'type': 'chat', }).c('received', {'xmlns': Strophe.NS.RECEIPTS, 'id': id}).up() .c('store', {'xmlns': Strophe.NS.HINTS}).up(); - _converse.api.send(receipt_stanza); + api.send(receipt_stanza); }, handleReceipt (stanza, original_stanza, from_jid) { @@ -936,7 +937,7 @@ converse.plugins.add('converse-chat', { /** * 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 * will be editable. Otherwise no messages will be editable. * @method _converse.ChatBox#setEditable @@ -951,9 +952,9 @@ converse.plugins.add('converse-chat', { if (u.isEmptyMessage(attrs) || attrs.sender !== 'me') { 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); - } 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}); const msg = this.messages.findWhere({'editable': true}); if (msg) { @@ -981,7 +982,7 @@ converse.plugins.add('converse-chat', { * @param { String } spoiler_hint - An optional hint, if the message being sent is a spoiler * @returns { _converse.Message } * @example - * const chat = _converse.api.chats.get('buddy1@example.com'); + * const chat = api.chats.get('buddy1@example.com'); * chat.sendMessage('hello world'); */ async sendMessage (text, spoiler_hint) { @@ -1004,7 +1005,7 @@ converse.plugins.add('converse-chat', { this.setEditable(attrs, (new Date()).toISOString()); message = await this.createMessage(attrs); } - _converse.api.send(this.createMessageStanza(message)); + api.send(this.createMessageStanza(message)); return message; }, @@ -1015,12 +1016,12 @@ converse.plugins.add('converse-chat', { * @method _converse.ChatBox#sendChatState */ sendChatState () { - if (_converse.api.settings.get('send_chat_state_notifications') && this.get('chat_state')) { - const allowed = _converse.api.settings.get('send_chat_state_notifications'); + if (api.settings.get('send_chat_state_notifications') && this.get('chat_state')) { + const allowed = api.settings.get('send_chat_state_notifications'); if (Array.isArray(allowed) && !allowed.includes(this.get('chat_state'))) { return; } - _converse.api.send( + api.send( $msg({ 'id': u.getUniqueId(), 'to': this.get('jid'), @@ -1034,7 +1035,7 @@ converse.plugins.add('converse-chat', { 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(); if (!item) { this.createMessage({ @@ -1141,7 +1142,7 @@ converse.plugins.add('converse-chat', { function rejectMessage (stanza, text) { // Reject an incoming message by replying with an error message of type "cancel". - _converse.api.send( + api.send( $msg({ 'to': stanza.getAttribute('from'), 'type': 'error', @@ -1160,7 +1161,7 @@ converse.plugins.add('converse-chat', { if (utils.isSameBareJID(from_jid, _converse.bare_jid)) { return; } - const chatbox = await _converse.api.chatboxes.get(from_jid); + const chatbox = await api.chatboxes.get(from_jid); if (!chatbox) { return; } @@ -1184,7 +1185,7 @@ converse.plugins.add('converse-chat', { let to_jid = stanza.getAttribute('to'); 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}`); } else if (utils.isHeadlineMessage(_converse, stanza)) { // XXX: Prosody sends headline messages with the @@ -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}`); } const contact_jid = is_me ? Strophe.getBareJidFromJid(to_jid) : from_bare_jid; - const contact = await _converse.api.contacts.get(contact_jid); - if (contact === undefined && !_converse.api.settings.get("allow_non_roster_messaging")) { + const contact = await api.contacts.get(contact_jid); + 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.`); return log.error(stanza); } // 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 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); /** * Triggered when a message stanza is been received and processed. @@ -1247,7 +1248,7 @@ converse.plugins.add('converse-chat', { * @property { XMLElement } stanza * @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', { function autoJoinChats () { // Automatically join private chats, based on the // "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) { return; } if (isString(jid)) { - _converse.api.chats.open(jid); + api.chats.open(jid); } else { log.error('Invalid jid criteria specified for "auto_join_private_chats"'); } @@ -1305,7 +1306,7 @@ converse.plugins.add('converse-chat', { * @example _converse.api.listen.on('privateChatsAutoJoined', () => { ... }); * @example _converse.api.waitUntil('privateChatsAutoJoined').then(() => { ... }); */ - _converse.api.trigger('privateChatsAutoJoined'); + api.trigger('privateChatsAutoJoined'); } @@ -1314,17 +1315,17 @@ converse.plugins.add('converse-chat', { if (!utils.isValidJID(jid)) { 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); /************************ END Route Handlers ************************/ /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('chatBoxesFetched', autoJoinChats); - _converse.api.listen.on('presencesInitialized', registerMessageHandlers); + api.listen.on('chatBoxesFetched', autoJoinChats); + api.listen.on('presencesInitialized', registerMessageHandlers); - _converse.api.listen.on('clearSession', () => { + api.listen.on('clearSession', () => { if (_converse.shouldClearCache()) { return Promise.all(_converse.chatboxes.map(c => c.messages && c.messages.clearStore({'silent': true}))); } @@ -1333,26 +1334,26 @@ converse.plugins.add('converse-chat', { /************************ BEGIN API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * The "chats" namespace (used for one-on-one chats) * - * @namespace _converse.api.chats - * @memberOf _converse.api + * @namespace api.chats + * @memberOf api */ chats: { /** - * @method _converse.api.chats.create + * @method api.chats.create * @param {string|string[]} jid|jids An jid or array of jids * @param {object} [attrs] An object containing configuration attributes. */ async create (jids, attrs) { if (isString(jids)) { if (attrs && !attrs?.fullname) { - const contact = await _converse.api.contacts.get(jids); + const contact = await api.contacts.get(jids); attrs.fullname = contact?.attributes?.fullname; } - const chatbox = _converse.api.chats.get(jids, attrs, true); + const chatbox = api.chats.get(jids, attrs, true); if (!chatbox) { log.error("Could not open chatbox for JID: "+jids); return; @@ -1361,9 +1362,9 @@ converse.plugins.add('converse-chat', { } if (Array.isArray(jids)) { 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; - 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"); @@ -1373,7 +1374,7 @@ converse.plugins.add('converse-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 {Object} [attrs] - Attributes to be set on the _converse.ChatBox model. * @param {Boolean} [attrs.minimized] - Should the chat be created in minimized state. @@ -1392,7 +1393,7 @@ converse.plugins.add('converse-chat', { * initialize: function() { * const _converse = this._converse; * // 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 * }); * } @@ -1404,7 +1405,7 @@ converse.plugins.add('converse-chat', { * initialize: function () { * const _converse = this._converse; * // 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 * }); * } @@ -1412,14 +1413,14 @@ converse.plugins.add('converse-chat', { */ async open (jids, attrs, force) { if (isString(jids)) { - const chat = await _converse.api.chats.get(jids, attrs, true); + const chat = await api.chats.get(jids, attrs, true); if (chat) { return chat.maybeShow(force); } return chat; } else if (Array.isArray(jids)) { 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) ); } @@ -1431,7 +1432,7 @@ converse.plugins.add('converse-chat', { /** * 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 {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. @@ -1439,22 +1440,22 @@ converse.plugins.add('converse-chat', { * * @example * // 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 * // 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 * // 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 function _get (jid) { - let model = await _converse.api.chatboxes.get(jid); + let model = await api.chatboxes.get(jid); if (!model && create) { - model = await _converse.api.chatboxes.create(jid, attrs, _converse.ChatBox); + model = await api.chatboxes.create(jid, attrs, _converse.ChatBox); } else { model = (model && model.get('type') === _converse.PRIVATE_CHAT_TYPE) ? model : null; if (model && Object.keys(attrs).length) { @@ -1464,7 +1465,7 @@ converse.plugins.add('converse-chat', { return model; } 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)); } else if (isString(jids)) { return _get(jids); diff --git a/src/headless/converse-chatboxes.js b/src/headless/converse-chatboxes.js index b55568ff3..75545c9d6 100644 --- a/src/headless/converse-chatboxes.js +++ b/src/headless/converse-chatboxes.js @@ -26,8 +26,9 @@ converse.plugins.add('converse-chatboxes', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; - _converse.api.promises.add([ + api.promises.add([ 'chatBoxesFetched', 'chatBoxesInitialized', 'privateChatsAutoJoined' @@ -78,7 +79,7 @@ converse.plugins.add('converse-chatboxes', { * @example _converse.api.listen.on('message', obj => { ... }); * @example _converse.api.waitUntil('chatBoxesFetched').then(() => { ... }); */ - _converse.api.trigger('chatBoxesFetched'); + api.trigger('chatBoxesFetched'); }, onConnected (reconnecting) { @@ -114,13 +115,13 @@ converse.plugins.add('converse-chatboxes', { /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('addClientFeatures', () => { - _converse.api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT); - _converse.api.disco.own.features.add(Strophe.NS.HTTPUPLOAD); - _converse.api.disco.own.features.add(Strophe.NS.OUTOFBAND); + api.listen.on('addClientFeatures', () => { + api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT); + api.disco.own.features.add(Strophe.NS.HTTPUPLOAD); + api.disco.own.features.add(Strophe.NS.OUTOFBAND); }); - _converse.api.listen.on('pluginsInitialized', () => { + api.listen.on('pluginsInitialized', () => { _converse.chatboxes = new _converse.ChatBoxes(); /** * Triggered once the _converse.ChatBoxes collection has been initialized. @@ -128,32 +129,32 @@ converse.plugins.add('converse-chatboxes', { * @example _converse.api.listen.on('chatBoxesInitialized', () => { ... }); * @example _converse.api.waitUntil('chatBoxesInitialized').then(() => { ... }); */ - _converse.api.trigger('chatBoxesInitialized'); + api.trigger('chatBoxesInitialized'); }); - _converse.api.listen.on('presencesInitialized', (reconnecting) => _converse.chatboxes.onConnected(reconnecting)); - _converse.api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection())); - _converse.api.listen.on('windowStateChanged', d => (d.state === 'visible') && _converse.clearMsgCounter()); + api.listen.on('presencesInitialized', (reconnecting) => _converse.chatboxes.onConnected(reconnecting)); + api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection())); + api.listen.on('windowStateChanged', d => (d.state === 'visible') && _converse.clearMsgCounter()); /************************ END Event Handlers ************************/ /************************ BEGIN API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * The "chatboxes" namespace. * - * @namespace _converse.api.chatboxes - * @memberOf _converse.api + * @namespace api.chatboxes + * @memberOf api */ chatboxes: { /** - * @method _converse.api.chats.create + * @method api.chats.create * @param { String|String[] } jids - A JID or array of JIDs * @param { Object } [attrs] An object containing configuration attributes * @param { Model } model - The type of chatbox that should be created */ async create (jids=[], attrs={}, model) { - await _converse.api.waitUntil('chatBoxesFetched'); + await api.waitUntil('chatBoxesFetched'); if (isString(jids)) { return createChatBox(jids, attrs, model); } else { @@ -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 */ async get (jids) { - await _converse.api.waitUntil('chatBoxesFetched'); + await api.waitUntil('chatBoxesFetched'); if (jids === undefined) { return _converse.chatboxes.models; } else if (isString(jids)) { diff --git a/src/headless/converse-disco.js b/src/headless/converse-disco.js index 3fded79a9..dc83560b1 100644 --- a/src/headless/converse-disco.js +++ b/src/headless/converse-disco.js @@ -20,10 +20,11 @@ converse.plugins.add('converse-disco', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; // Promises exposed by this plugin - _converse.api.promises.add('discoInitialized'); - _converse.api.promises.add('streamFeaturesAdded'); + api.promises.add('discoInitialized'); + api.promises.add('streamFeaturesAdded'); /** @@ -106,7 +107,7 @@ converse.plugins.add('converse-disco', { * @type { Model } * @example _converse.api.listen.on('featuresDiscovered', feature => { ... }); */ - _converse.api.trigger('serviceDiscovered', feature); + api.trigger('serviceDiscovered', feature); }, onFieldAdded (field) { @@ -117,7 +118,7 @@ converse.plugins.add('converse-disco', { * @event _converse#discoExtensionFieldDiscovered * @example _converse.api.listen.on('discoExtensionFieldDiscovered', () => { ... }); */ - _converse.api.trigger('discoExtensionFieldDiscovered', field); + api.trigger('discoExtensionFieldDiscovered', field); }, async fetchFeatures (options) { @@ -144,7 +145,7 @@ converse.plugins.add('converse-disco', { async queryInfo () { let stanza; try { - stanza = await _converse.api.disco.info(this.get('jid'), null); + stanza = await api.disco.info(this.get('jid'), null); } catch (iq) { log.error(iq); this.waitUntilFeaturesDiscovered.resolve(this); @@ -178,7 +179,7 @@ converse.plugins.add('converse-disco', { // server or a conference component. return; } - const stanza = await _converse.api.disco.items(this.get('jid')); + const stanza = await api.disco.items(this.get('jid')); this.onDiscoItems(stanza); }, @@ -246,13 +247,13 @@ converse.plugins.add('converse-disco', { function addClientFeatures () { // 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); - _converse.api.disco.own.features.add(Strophe.NS.DISCO_INFO); - _converse.api.disco.own.features.add(Strophe.NS.ROSTERX); // Limited support - if (_converse.api.settings.get("message_carbons")) { - _converse.api.disco.own.features.add(Strophe.NS.CARBONS); + api.disco.own.features.add(Strophe.NS.CHATSTATES); + api.disco.own.features.add(Strophe.NS.DISCO_INFO); + api.disco.own.features.add(Strophe.NS.ROSTERX); // Limited support + if (api.settings.get("message_carbons")) { + api.disco.own.features.add(Strophe.NS.CARBONS); } /** * Triggered in converse-disco once the core disco features of @@ -260,7 +261,7 @@ converse.plugins.add('converse-disco', { * @event _converse#addClientFeatures * @example _converse.api.listen.on('addClientFeatures', () => { ... }); */ - _converse.api.trigger('addClientFeatures'); + api.trigger('addClientFeatures'); return this; } @@ -274,7 +275,7 @@ converse.plugins.add('converse-disco', { if (!_converse.stream_features) { const bare_jid = Strophe.getBareJidFromJid(_converse.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.browserStorage = _converse.createStore(id, "session"); } @@ -306,7 +307,7 @@ converse.plugins.add('converse-disco', { * @event _converse#streamFeaturesAdded * @example _converse.api.listen.on('streamFeaturesAdded', () => { ... }); */ - _converse.api.trigger('streamFeaturesAdded'); + api.trigger('streamFeaturesAdded'); } @@ -339,7 +340,7 @@ converse.plugins.add('converse-disco', { iqresult.c('identity', attrs).up(); }); plugin._features.forEach(feature => iqresult.c('feature', {'var': feature}).up()); - _converse.api.send(iqresult.tree()); + api.send(iqresult.tree()); return true; } @@ -364,12 +365,12 @@ converse.plugins.add('converse-disco', { * @event _converse#discoInitialized * @example _converse.api.listen.on('discoInitialized', () => { ... }); */ - _converse.api.trigger('discoInitialized'); + api.trigger('discoInitialized'); } /******************** Event Handlers ********************/ - _converse.api.listen.on('userSessionInitialized', async () => { + api.listen.on('userSessionInitialized', async () => { initStreamFeatures(); if (_converse.connfeedback.get('connection_status') === Strophe.Status.ATTACHED) { // When re-attaching to a BOSH session, we fetch the stream features from the cache. @@ -377,20 +378,20 @@ converse.plugins.add('converse-disco', { notifyStreamFeaturesAdded(); } }); - _converse.api.listen.on('beforeResourceBinding', populateStreamFeatures); + api.listen.on('beforeResourceBinding', populateStreamFeatures); - _converse.api.listen.on('reconnected', initializeDisco); - _converse.api.listen.on('connected', initializeDisco); + api.listen.on('reconnected', initializeDisco); + api.listen.on('connected', initializeDisco); - _converse.api.listen.on('beforeTearDown', async () => { - _converse.api.promises.add('streamFeaturesAdded') + api.listen.on('beforeTearDown', async () => { + api.promises.add('streamFeaturesAdded') if (_converse.stream_features) { await _converse.stream_features.clearStore(); delete _converse.stream_features; } }); - _converse.api.listen.on('clearSession', () => { + api.listen.on('clearSession', () => { 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.identities.clearStore()); @@ -404,34 +405,34 @@ converse.plugins.add('converse-disco', { /************************ API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * The XEP-0030 service discovery API * * This API lets you discover information about entities on the * XMPP network. * - * @namespace _converse.api.disco - * @memberOf _converse.api + * @namespace api.disco + * @memberOf api */ disco: { /** - * @namespace _converse.api.disco.stream - * @memberOf _converse.api.disco + * @namespace api.disco.stream + * @memberOf api.disco */ stream: { /** - * @method _converse.api.disco.stream.getFeature + * @method api.disco.stream.getFeature * @param {String} name The feature name * @param {String} xmlns The XML namespace * @example _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver') */ async getFeature (name, xmlns) { - await _converse.api.waitUntil('streamFeaturesAdded'); + await api.waitUntil('streamFeaturesAdded'); if (!name || !xmlns) { 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. const msg = `Tried to get feature ${name} ${xmlns} but _converse.stream_features has been torn down`; log.warn(msg); @@ -442,18 +443,18 @@ converse.plugins.add('converse-disco', { }, /** - * @namespace _converse.api.disco.own - * @memberOf _converse.api.disco + * @namespace api.disco.own + * @memberOf api.disco */ own: { /** - * @namespace _converse.api.disco.own.identities - * @memberOf _converse.api.disco.own + * @namespace api.disco.own.identities + * @memberOf api.disco.own */ identities: { /** * 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} type - phone, pc, web, etc. @@ -475,7 +476,7 @@ converse.plugins.add('converse-disco', { }, /** * 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(); */ clear () { @@ -484,8 +485,8 @@ converse.plugins.add('converse-disco', { /** * Returns all of the identities registered for this client * (i.e. instance of Converse). - * @method _converse.api.disco.identities.get - * @example const identities = _converse.api.disco.own.identities.get(); + * @method api.disco.identities.get + * @example const identities = api.disco.own.identities.get(); */ get () { return plugin._identities; @@ -493,13 +494,13 @@ converse.plugins.add('converse-disco', { }, /** - * @namespace _converse.api.disco.own.features - * @memberOf _converse.api.disco.own + * @namespace api.disco.own.features + * @memberOf api.disco.own */ features: { /** * 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 * @example _converse.api.disco.own.features.add("http://jabber.org/protocol/caps"); */ @@ -511,7 +512,7 @@ converse.plugins.add('converse-disco', { }, /** * 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(); */ clear () { @@ -519,8 +520,8 @@ converse.plugins.add('converse-disco', { }, /** * Returns all of the features registered for this client (i.e. instance of Converse). - * @method _converse.api.disco.own.features.get - * @example const features = _converse.api.disco.own.features.get(); + * @method api.disco.own.features.get + * @example const features = api.disco.own.features.get(); */ get () { return plugin._features; @@ -531,7 +532,7 @@ converse.plugins.add('converse-disco', { /** * 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} [node] A specific node identifier associated with the JID * @returns {promise} Promise which resolves once we have a result from the server. @@ -546,13 +547,13 @@ converse.plugins.add('converse-disco', { 'to':jid, 'type':'get' }).c('query', attrs); - return _converse.api.sendIQ(info); + return api.sendIQ(info); }, /** * 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} [node] A specific node identifier associated with the JID * @returns {promise} Promise which resolves once we have a result from the server. @@ -562,7 +563,7 @@ converse.plugins.add('converse-disco', { if (node) { attrs.node = node; } - return _converse.api.sendIQ( + return api.sendIQ( $iq({ 'from': _converse.connection.jid, 'to':jid, @@ -574,24 +575,24 @@ converse.plugins.add('converse-disco', { /** * Namespace for methods associated with disco entities * - * @namespace _converse.api.disco.entities - * @memberOf _converse.api.disco + * @namespace api.disco.entities + * @memberOf api.disco */ entities: { /** * 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 {boolean} [create] Whether the entity should be created if it doesn't exist. * @example _converse.api.disco.entities.get(jid); */ async get (jid, create=false) { - await _converse.api.waitUntil('discoInitialized'); + await api.waitUntil('discoInitialized'); if (!jid) { 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. const msg = `Tried to look up entity ${jid} but _converse.disco_entities has been torn down`; log.warn(msg); @@ -601,7 +602,7 @@ converse.plugins.add('converse-disco', { if (entity || !create) { return entity; } - return _converse.api.disco.entities.create(jid); + return api.disco.entities.create(jid); }, /** @@ -612,7 +613,7 @@ converse.plugins.add('converse-disco', { * Fetching from cache can be disabled by passing in * `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 {object} [options] Additional options * @param {boolean} [options.ignore_cache] @@ -625,14 +626,14 @@ converse.plugins.add('converse-disco', { }, /** - * @namespace _converse.api.disco.features - * @memberOf _converse.api.disco + * @namespace api.disco.features + * @memberOf api.disco */ features: { /** * 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 * supported. In the XML stanza, this is the `var` * attribute of the `` element. For @@ -644,16 +645,16 @@ converse.plugins.add('converse-disco', { * itself or those items associated with the entity if * they support the given feature. * @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) { if (!jid) { throw new TypeError('You need to provide an entity JID'); } - await _converse.api.waitUntil('discoInitialized'); - let entity = await _converse.api.disco.entities.get(jid, true); + await api.waitUntil('discoInitialized'); + 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. const msg = `Tried to get feature ${feature} for ${jid} but _converse.disco_entities has been torn down`; log.warn(msg); @@ -669,7 +670,7 @@ converse.plugins.add('converse-disco', { /** * 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 * supported. In the XML stanza, this is the `var` * attribute of the `` element. For @@ -678,32 +679,32 @@ converse.plugins.add('converse-disco', { * (and its associated items) which should be queried * @returns {promise} A promise which resolves with `true` or `false`. * @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 * } else { * // The feature is not supported * } */ 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; }, /** * Refresh the features, fields and identities associated with a * 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. * @returns {promise} A promise which resolves once the features have been refreshed * @example - * await _converse.api.disco.refresh('room@conference.example.org'); + * await api.disco.refresh('room@conference.example.org'); */ async refresh (jid) { if (!jid) { throw new TypeError('api.disco.refresh: You need to provide an entity JID'); } - await _converse.api.waitUntil('discoInitialized'); - let entity = await _converse.api.disco.entities.get(jid); + await api.waitUntil('discoInitialized'); + let entity = await api.disco.entities.get(jid); if (entity) { entity.features.reset(); entity.fields.reset(); @@ -714,34 +715,34 @@ converse.plugins.add('converse-disco', { entity.queryInfo(); } else { // 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; }, /** - * @deprecated Use {@link _converse.api.disco.refresh} instead. - * @method _converse.api.disco.refreshFeatures + * @deprecated Use {@link api.disco.refresh} instead. + * @method api.disco.refreshFeatures */ refreshFeatures (jid) { - return _converse.api.refresh(jid); + return api.refresh(jid); }, /** * 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. * @returns {promise} A promise which resolves with the returned features * @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) { if (!jid) { throw new TypeError('api.disco.getFeatures: You need to provide an entity JID'); } - await _converse.api.waitUntil('discoInitialized'); - let entity = await _converse.api.disco.entities.get(jid, true); + await api.waitUntil('discoInitialized'); + let entity = await api.disco.entities.get(jid, true); entity = await entity.waitUntilFeaturesDiscovered; return entity.features; }, @@ -752,17 +753,17 @@ converse.plugins.add('converse-disco', { * * 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. * @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) { if (!jid) { throw new TypeError('api.disco.getFields: You need to provide an entity JID'); } - await _converse.api.waitUntil('discoInitialized'); - let entity = await _converse.api.disco.entities.get(jid, true); + await api.waitUntil('discoInitialized'); + let entity = await api.disco.entities.get(jid, true); entity = await entity.waitUntilFeaturesDiscovered; return entity.fields; }, @@ -775,7 +776,7 @@ converse.plugins.add('converse-disco', { * `category='pubsub'` and `type='pep'` as explained in this section of * XEP-0163: https://xmpp.org/extensions/xep-0163.html#support * - * @method _converse.api.disco.getIdentity + * @method api.disco.getIdentity * @param {string} The identity category. * In the XML stanza, this is the `category` * attribute of the `` element. @@ -788,7 +789,7 @@ converse.plugins.add('converse-disco', { * @returns {promise} A promise which resolves with a map indicating * whether an identity with a given type is provided by the entity. * @example - * _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then( + * api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then( * function (identity) { * if (identity) { * // The entity DOES have this identity @@ -799,8 +800,8 @@ converse.plugins.add('converse-disco', { * ).catch(e => log.error(e)); */ async getIdentity (category, type, jid) { - const e = await _converse.api.disco.entities.get(jid, true); - if (e === undefined && !_converse.api.connection.connected()) { + const e = await api.disco.entities.get(jid, true); + if (e === undefined && !api.connection.connected()) { // 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`; log.warn(msg); diff --git a/src/headless/converse-emoji.js b/src/headless/converse-emoji.js index f40c05f44..de3762746 100644 --- a/src/headless/converse-emoji.js +++ b/src/headless/converse-emoji.js @@ -61,9 +61,10 @@ converse.plugins.add('converse-emoji', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; const { ___ } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'emoji_image_path': twemoji.default.base, 'emoji_categories': { "smileys": ":grinning:", @@ -98,8 +99,8 @@ converse.plugins.add('converse-emoji', { }); _converse.emojis = {}; - _converse.api.promises.add('emojisInitialized', false); - twemoji.default.base = _converse.api.settings.get('emoji_image_path'); + api.promises.add('emojisInitialized', false); + twemoji.default.base = api.settings.get('emoji_image_path'); /** @@ -162,7 +163,7 @@ converse.plugins.add('converse-emoji', { } }; 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', { /************************ BEGIN API ************************/ // 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 * (aka groupchats). * - * @namespace _converse.api.rooms - * @memberOf _converse.api + * @namespace api.rooms + * @memberOf api */ emojis: { /** * Initializes Emoji support by downloading the emojis JSON (and any applicable images). - * @method _converse.api.emojis.initialize + * @method api.emojis.initialize * @returns {Promise} */ async initialize () { @@ -300,7 +301,7 @@ converse.plugins.add('converse-emoji', { * fetched and its save to start calling emoji utility methods. * @event _converse#emojisInitialized */ - _converse.api.trigger('emojisInitialized'); + api.trigger('emojisInitialized'); } } }); diff --git a/src/headless/converse-headlines.js b/src/headless/converse-headlines.js index 8685a9788..7d3cf0a87 100644 --- a/src/headless/converse-headlines.js +++ b/src/headless/converse-headlines.js @@ -47,6 +47,7 @@ converse.plugins.add('converse-headlines', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; /** * Shows headline messages @@ -58,7 +59,7 @@ converse.plugins.add('converse-headlines', { defaults () { return { 'bookmarked': false, - 'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")), + 'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")), 'message_type': 'headline', 'num_unread': 0, 'time_opened': this.get('time_opened') || (new Date()).getTime(), @@ -75,7 +76,7 @@ converse.plugins.add('converse-headlines', { * @type { _converse.HeadlinesBox } * @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', { const from_jid = message.getAttribute('from'); if (from_jid.includes('@') && !_converse.roster.get(from_jid) && - !_converse.api.settings.get("allow_non_roster_messaging")) { + !api.settings.get("allow_non_roster_messaging")) { return; } if (message.querySelector('body') === null) { @@ -100,7 +101,7 @@ converse.plugins.add('converse-headlines', { }); const attrs = await chatbox.getMessageAttributesFromStanza(message, message); 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', { return true }, null, 'message'); } - _converse.api.listen.on('connected', registerHeadlineHandler); - _converse.api.listen.on('reconnected', registerHeadlineHandler); + api.listen.on('connected', registerHeadlineHandler); + api.listen.on('reconnected', registerHeadlineHandler); /************************ END Event Handlers ************************/ /************************ BEGIN API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * The "headlines" namespace, which is used for headline-channels * which are read-only channels containing messages of type * "headline". * - * @namespace _converse.api.headlines - * @memberOf _converse.api + * @namespace api.headlines + * @memberOf api */ headlines: { /** * 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 {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. @@ -139,9 +140,9 @@ converse.plugins.add('converse-headlines', { */ async get (jids, attrs={}, create=false) { async function _get (jid) { - let model = await _converse.api.chatboxes.get(jid); + let model = await api.chatboxes.get(jid); if (!model && create) { - model = await _converse.api.chatboxes.create(jid, attrs, _converse.HeadlinesBox); + model = await api.chatboxes.create(jid, attrs, _converse.HeadlinesBox); } else { model = (model && model.get('type') === _converse.HEADLINES_TYPE) ? model : null; if (model && Object.keys(attrs).length) { @@ -151,7 +152,7 @@ converse.plugins.add('converse-headlines', { return model; } 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)); } else if (isString(jids)) { return _get(jids); diff --git a/src/headless/converse-mam.js b/src/headless/converse-mam.js index 0b0708c61..8dbee332d 100644 --- a/src/headless/converse-mam.js +++ b/src/headless/converse-mam.js @@ -28,8 +28,9 @@ converse.plugins.add('converse-mam', { * loaded by Converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; - _converse.api.settings.update({ + api.settings.update({ archived_messages_page_size: '50', 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 @@ -85,18 +86,18 @@ converse.plugins.add('converse-mam', { } const is_groupchat = this.get('type') === _converse.CHATROOMS_TYPE; 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; } const msg_handler = is_groupchat ? s => this.queueMessage(s) : s => _converse.handleMessageStanza(s); const query = Object.assign({ 'groupchat': is_groupchat, - 'max': _converse.api.settings.get('archived_messages_page_size'), + 'max': api.settings.get('archived_messages_page_size'), 'with': this.get('jid'), }, options); - const result = await _converse.api.archive.query(query); + const result = await api.archive.query(query); /* eslint-disable no-await-in-loop */ for (const message of result.messages) { try { @@ -113,9 +114,9 @@ converse.plugins.add('converse-mam', { if (page && result.rsm) { 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') { - 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); } else { @@ -150,32 +151,32 @@ converse.plugins.add('converse-mam', { */ const preference = sizzle(`prefs[xmlns="${Strophe.NS.MAM}"]`, iq).pop(); 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'}) .c('prefs', { '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()); // XXX: Strictly speaking, the server should respond with the updated prefs // (see example 18: https://xmpp.org/extensions/xep-0313.html#config) // but Prosody doesn't do this, so we don't rely on it. - _converse.api.sendIQ(stanza) - .then(() => feature.save({'preferences': {'default':_converse.api.settings.get('message_archiving')}})) + api.sendIQ(stanza) + .then(() => feature.save({'preferences': {'default':api.settings.get('message_archiving')}})) .catch(_converse.onMAMError); } else { - feature.save({'preferences': {'default':_converse.api.settings.get('message_archiving')}}); + feature.save({'preferences': {'default':api.settings.get('message_archiving')}}); } }; function getMAMPrefsFromFeature (feature) { 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; } - if (prefs['default'] !== _converse.api.settings.get('message_archiving')) { - _converse.api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM})) + if (prefs['default'] !== api.settings.get('message_archiving')) { + api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM})) .then(iq => _converse.onMAMPreferences(iq, feature)) .catch(_converse.onMAMError); } @@ -193,26 +194,26 @@ converse.plugins.add('converse-mam', { } /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.MAM)); - _converse.api.listen.on('serviceDiscovered', getMAMPrefsFromFeature); - _converse.api.listen.on('chatRoomViewInitialized', view => { + api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.MAM)); + api.listen.on('serviceDiscovered', getMAMPrefsFromFeature); + api.listen.on('chatRoomViewInitialized', view => { if (_converse.muc_show_logs_before_join) { // 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. 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 if (chat.get('type') === _converse.PRIVATE_CHAT_TYPE) { 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 // since it's not necessary when the chat is restored from cache. // (given that BOSH or SMACKS will ensure that you get messages @@ -226,7 +227,7 @@ converse.plugins.add('converse-mam', { /************************ BEGIN API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * The [XEP-0313](https://xmpp.org/extensions/xep-0313.html) Message Archive Management API * @@ -236,8 +237,8 @@ converse.plugins.add('converse-mam', { * option in the configuration settings section, which you'll * usually want to use in conjunction with this API. * - * @namespace _converse.api.archive - * @memberOf _converse.api + * @namespace api.archive + * @memberOf api */ 'archive': { /** @@ -246,7 +247,7 @@ converse.plugins.add('converse-mam', { * The options parameter can also be an instance of * _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 * MAM-specific or also for Result Set Management. * Can be either an object or an instance of _converse.RSM. @@ -276,7 +277,7 @@ converse.plugins.add('converse-mam', { * * let result; * try { - * result = await _converse.api.archive.query(); + * result = await api.archive.query(); * } catch (e) { * // The query was not successful, perhaps inform the user? * // The IQ stanza returned by the XMPP server is passed in, so that you @@ -296,7 +297,7 @@ converse.plugins.add('converse-mam', { * // For a particular user * let result; * try { - * result = await _converse.api.archive.query({'with': 'john@doe.net'}); + * result = await api.archive.query({'with': 'john@doe.net'}); * } catch (e) { * // The query was not successful * } @@ -304,7 +305,7 @@ converse.plugins.add('converse-mam', { * // For a particular room * let result; * 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) { * // The query was not successful * } @@ -324,7 +325,7 @@ converse.plugins.add('converse-mam', { * }; * let result; * try { - * result = await _converse.api.archive.query(options); + * result = await api.archive.query(options); * } catch (e) { * // The query was not successful * } @@ -339,7 +340,7 @@ converse.plugins.add('converse-mam', { * // Return maximum 10 archived messages * let result; * 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) { * // The query was not successful * } @@ -363,7 +364,7 @@ converse.plugins.add('converse-mam', { * * let result; * 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) { * // The query was not successful * } @@ -372,7 +373,7 @@ converse.plugins.add('converse-mam', { * * while (result.rsm) { * try { - * result = await _converse.api.archive.query(rsm.next(10)); + * result = await api.archive.query(rsm.next(10)); * } catch (e) { * // The query was not successful * } @@ -391,7 +392,7 @@ converse.plugins.add('converse-mam', { * * let result; * try { - * result = await _converse.api.archive.query({'before': '', 'max':5}); + * result = await api.archive.query({'before': '', 'max':5}); * } catch (e) { * // The query was not successful * } @@ -400,7 +401,7 @@ converse.plugins.add('converse-mam', { * * // Now we query again, to get the previous batch. * try { - * result = await _converse.api.archive.query(rsm.previous(5);); + * result = await api.archive.query(rsm.previous(5);); * } catch (e) { * // The query was not successful * } @@ -409,7 +410,7 @@ converse.plugins.add('converse-mam', { * */ 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'); } const attrs = {'type':'set'}; @@ -423,7 +424,7 @@ converse.plugins.add('converse-mam', { } 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) { log.warn(`Did not fetch MAM archive for ${jid} because it doesn't support ${Strophe.NS.MAM}`); return {'messages': []}; @@ -479,7 +480,7 @@ converse.plugins.add('converse-mam', { }, Strophe.NS.MAM); 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) { const err_msg = "Timeout while trying to fetch archived messages."; log.error(err_msg); diff --git a/src/headless/converse-muc.js b/src/headless/converse-muc.js index 7c9517e15..ab9d03cd6 100644 --- a/src/headless/converse-muc.js +++ b/src/headless/converse-muc.js @@ -102,13 +102,14 @@ converse.plugins.add('converse-muc', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; const { __, ___ } = _converse; // Configuration values for this plugin // ==================================== // Refer to docs/source/configuration.rst for explanations of these // configuration settings. - _converse.api.settings.update({ + api.settings.update({ 'allow_muc': true, 'allow_muc_invitations': true, 'auto_join_on_invite': false, @@ -122,9 +123,9 @@ converse.plugins.add('converse-muc', { 'muc_nickname_from_jid': 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 "+ "to true when muc_domain is not set"); } @@ -188,11 +189,11 @@ converse.plugins.add('converse-muc', { if (!u.isValidMUCJID(jid)) { return log.warn(`invalid jid "${jid}" provided in url fragment`); } - await _converse.api.waitUntil('roomsAutoJoined'); + await api.waitUntil('roomsAutoJoined'); 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); @@ -207,7 +208,7 @@ converse.plugins.add('converse-muc', { const nick = _converse.xmppstatus.getNickname(); if (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)); } } @@ -219,7 +220,7 @@ converse.plugins.add('converse-muc', { */ settings.type = _converse.CHATROOMS_TYPE; 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); return chatbox; } @@ -247,7 +248,7 @@ converse.plugins.add('converse-muc', { * @type { _converse.ChatRoomMessages} * @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', { * @returns { Boolean } */ 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(); }, @@ -351,7 +352,7 @@ converse.plugins.add('converse-muc', { 'num_unread_general': 0, 'bookmarked': false, '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', 'name': '', 'num_unread': 0, @@ -386,7 +387,7 @@ converse.plugins.add('converse-muc', { * @type { _converse.ChatRoom } * @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(); }, @@ -427,7 +428,7 @@ converse.plugins.add('converse-muc', { nick = await this.getAndPersistNickname(nick); if (!nick) { 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(); } return this; @@ -436,13 +437,13 @@ converse.plugins.add('converse-muc', { 'from': _converse.connection.jid, 'to': this.getRoomJIDAndNick() }).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) { stanza.cnode(Strophe.xmlElement("password", [], password)); } this.session.save('connection_status', converse.ROOMSTATUS.CONNECTING); - _converse.api.send(stanza); + api.send(stanza); return this; }, @@ -491,10 +492,10 @@ converse.plugins.add('converse-muc', { * @type { _converse.ChatRoom} * @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') && - await _converse.api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid'))) { + if (api.settings.get('auto_register_muc_nickname') && + await api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid'))) { this.registerNickname() } } @@ -618,7 +619,7 @@ converse.plugins.add('converse-muc', { }, invitesAllowed () { - return _converse.api.settings.get('allow_muc_invitations') && + return api.settings.get('allow_muc_invitations') && (this.features.get('open') || this.getOwnAffiliation() === "owner" ); @@ -628,7 +629,7 @@ converse.plugins.add('converse-muc', { const name = this.get('name'); if (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')); } else { return this.get('jid'); @@ -671,7 +672,7 @@ converse.plugins.add('converse-muc', { promise.reject(stanza); } }, null, 'message', ['error', 'groupchat'], id); - _converse.api.send(el) + api.send(el) return promise; }, @@ -771,7 +772,7 @@ converse.plugins.add('converse-muc', { }).c('moderate', {xmlns: Strophe.NS.MODERATE}) .c('retract', {xmlns: Strophe.NS.RETRACT}).up() .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', { if (reason && reason.length > 0) { iq.c("reason", reason); } - return _converse.api.sendIQ(iq); + return api.sendIQ(iq); }, /** @@ -813,7 +814,7 @@ converse.plugins.add('converse-muc', { await new Promise((success, error) => disco_entity.destroy({success, error})); } } - if (_converse.api.connection.connected()) { + if (api.connection.connected()) { this.sendUnavailablePresence(exit_msg); } u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED}); @@ -836,7 +837,7 @@ converse.plugins.add('converse-muc', { canModerateMessages () { 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) { @@ -986,7 +987,7 @@ converse.plugins.add('converse-muc', { // is not applicable within MUC context return; } - _converse.api.send( + api.send( $msg({'to':this.get('jid'), 'type': 'groupchat'}) .c(chat_state, {'xmlns': Strophe.NS.CHATSTATES}).up() .c('no-store', {'xmlns': Strophe.NS.HINTS}).up() @@ -1020,7 +1021,7 @@ converse.plugins.add('converse-muc', { 'to': recipient, 'id': u.getUniqueId() }).c('x', attrs); - _converse.api.send(invitation); + api.send(invitation); /** * After the user has sent out a direct invitation (as per XEP-0249), * to a roster contact, asking them to join a room. @@ -1031,7 +1032,7 @@ converse.plugins.add('converse-muc', { * @property {string} reason - The original reason for the invitation * @example _converse.api.listen.on('chatBoxMaximized', view => { ... }); */ - _converse.api.trigger('roomInviteSent', { + api.trigger('roomInviteSent', { 'room': this, 'recipient': recipient, 'reason': reason @@ -1046,7 +1047,7 @@ converse.plugins.add('converse-muc', { * @returns {Promise} */ refreshDiscoInfo () { - return _converse.api.disco.refresh(this.get('jid')) + return api.disco.refresh(this.get('jid')) .then(() => this.getDiscoInfo()) .catch(e => log.error(e)); }, @@ -1059,7 +1060,7 @@ converse.plugins.add('converse-muc', { * @returns {Promise} */ 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(() => this.getDiscoInfoFields()) .then(() => this.getDiscoInfoFeatures()) @@ -1075,7 +1076,7 @@ converse.plugins.add('converse-muc', { * @returns {Promise} */ 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 name = f.get('var'); if (name && name.startsWith('muc#roominfo_')) { @@ -1095,7 +1096,7 @@ converse.plugins.add('converse-muc', { * @returns {Promise} */ 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( zipObject(converse.ROOM_FEATURES, converse.ROOM_FEATURES.map(() => false)), {'fetched': (new Date()).toISOString()} @@ -1194,7 +1195,7 @@ converse.plugins.add('converse-muc', { * @returns { Promise } */ fetchRoomConfiguration () { - return _converse.api.sendIQ( + return api.sendIQ( $iq({'to': this.get('jid'), 'type': "get"}) .c("query", {xmlns: Strophe.NS.MUC_OWNER}) ); @@ -1213,7 +1214,7 @@ converse.plugins.add('converse-muc', { .c("query", {xmlns: Strophe.NS.MUC_OWNER}) .c("x", {xmlns: Strophe.NS.XFORM, type: "submit"}); 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', { if (member.reason !== undefined) { iq.c("reason", member.reason); } - return _converse.api.sendIQ(iq); + return api.sendIQ(iq); }, /** @@ -1309,7 +1310,7 @@ converse.plugins.add('converse-muc', { if (reason !== null) { 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', { const iq = $iq({to: this.get('jid'), type: "get"}) .c("query", {xmlns: Strophe.NS.MUC_ADMIN}) .c("item", {'affiliation': affiliation}); - const result = await _converse.api.sendIQ(iq, null, false); + const result = await api.sendIQ(iq, null, false); if (result === null) { const err_msg = `Error: timeout while fetching ${affiliation} list for MUC ${this.get('jid')}`; const err = new Error(err_msg); @@ -1466,7 +1467,7 @@ converse.plugins.add('converse-muc', { 'xmlns': Strophe.NS.DISCO_INFO, '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)) { throw result; } @@ -1480,7 +1481,7 @@ converse.plugins.add('converse-muc', { const jid = this.get('jid'); let iq, err_msg; try { - iq = await _converse.api.sendIQ( + iq = await api.sendIQ( $iq({ 'to': jid, 'from': _converse.connection.jid, @@ -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`); } try { - await _converse.api.sendIQ($iq({ + await api.sendIQ($iq({ 'to': jid, 'from': _converse.connection.jid, 'type': 'set' @@ -1675,7 +1676,7 @@ converse.plugins.add('converse-muc', { * @param { String } value */ setSubject(value='') { - _converse.api.send( + api.send( $msg({ to: this.get('jid'), from: _converse.connection.jid, @@ -1749,7 +1750,7 @@ converse.plugins.add('converse-muc', { 'type': "get" }).c("ping", {'xmlns': Strophe.NS.PING}); try { - await _converse.api.sendIQ(ping); + await api.sendIQ(ping); } catch (e) { if (e === null) { log.error(`Timeout error while checking whether we're joined to MUC: ${this.get('jid')}`); @@ -1950,14 +1951,14 @@ converse.plugins.add('converse-muc', { this.updateMessage(message, original_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) || await this.handleModeration(attrs) || this.subjectChangeHandled(attrs) || this.ignorableCSN(attrs)) { - return _converse.api.trigger('message', {'stanza': original_stanza}); + return api.trigger('message', {'stanza': original_stanza}); } this.setEditable(attrs, attrs.time); @@ -1968,7 +1969,7 @@ converse.plugins.add('converse-muc', { const msg = this.handleCorrection(attrs) || await this.createMessage(attrs); this.incrementUnreadMsgCounter(msg); } - _converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': this}); + api.trigger('message', {'stanza': original_stanza, 'chatbox': this}); }, handleModifyError(pres) { @@ -2089,7 +2090,7 @@ converse.plugins.add('converse-muc', { 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]; if (nick === _converse.getDefaultMUCNickname()) { this.join(nick + '-2'); @@ -2216,7 +2217,7 @@ converse.plugins.add('converse-muc', { if (locked_room) { if (this.get('auto_configure')) { 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 this.sendConfiguration().then(() => this.refreshDiscoInfo()); } else { @@ -2320,7 +2321,7 @@ converse.plugins.add('converse-muc', { vcards.filter(v => v).forEach(vcard => { 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', { }, 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'] : []); }, @@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc', { * @event _converse#membersFetched * @example _converse.api.listen.on('membersFetched', () => { ... }); */ - _converse.api.trigger('membersFetched'); + api.trigger('membersFetched'); }, findOccupant (data) { @@ -2426,13 +2427,13 @@ converse.plugins.add('converse-muc', { _converse.RoomsPanelModel = Model.extend({ defaults: function () { return { - 'muc_domain': _converse.api.settings.get('muc_domain'), + 'muc_domain': api.settings.get('muc_domain'), 'nick': _converse.getDefaultMUCNickname() } }, setDomain (jid) { - if (!_converse.api.settings.get('locked_muc_domain')) { + if (!api.settings.get('locked_muc_domain')) { this.save('muc_domain', Strophe.getDomainFromJid(jid)); } } @@ -2453,7 +2454,7 @@ converse.plugins.add('converse-muc', { reason = x_el.getAttribute('reason'); let result; - if (_converse.api.settings.get('auto_join_on_invite')) { + if (api.settings.get('auto_join_on_invite')) { result = true; } else { // Invite request might come from someone not your roster list @@ -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 () { _converse.connection.addHandler( (message) => { @@ -2486,15 +2487,15 @@ converse.plugins.add('converse-muc', { return true; }, 'jabber:x:conference', 'message'); }; - _converse.api.listen.on('connected', registerDirectInvitationHandler); - _converse.api.listen.on('reconnected', registerDirectInvitationHandler); + api.listen.on('connected', registerDirectInvitationHandler); + api.listen.on('reconnected', registerDirectInvitationHandler); } const createChatRoom = function (jid, attrs) { if (jid.startsWith('xmpp:') && jid.endsWith('?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', { * settings). */ function autoJoinRooms () { - _converse.api.settings.get('auto_join_rooms').forEach(groupchat => { + api.settings.get('auto_join_rooms').forEach(groupchat => { if (isString(groupchat)) { if (_converse.chatboxes.where({'jid': groupchat}).length) { return; } - _converse.api.rooms.open(groupchat); + api.rooms.open(groupchat); } else if (isObject(groupchat)) { - _converse.api.rooms.open(groupchat.jid, clone(groupchat)); + api.rooms.open(groupchat.jid, clone(groupchat)); } else { log.error('Invalid groupchat criteria specified for "auto_join_rooms"'); } @@ -2523,40 +2524,40 @@ converse.plugins.add('converse-muc', { * @example _converse.api.listen.on('roomsAutoJoined', () => { ... }); * @example _converse.api.waitUntil('roomsAutoJoined').then(() => { ... }); */ - _converse.api.trigger('roomsAutoJoined'); + api.trigger('roomsAutoJoined'); } async function onWindowStateChanged (data) { - if (data.state === 'visible' && _converse.api.connection.connected()) { - const rooms = await _converse.api.rooms.get(); + if (data.state === 'visible' && api.connection.connected()) { + const rooms = await api.rooms.get(); rooms.forEach(room => room.rejoinIfNecessary()); } } /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('beforeTearDown', () => { + api.listen.on('beforeTearDown', () => { const groupchats = _converse.chatboxes.where({'type': _converse.CHATROOMS_TYPE}); 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', () => { - if (_converse.api.settings.get('allow_muc')) { - _converse.api.disco.own.features.add(Strophe.NS.MUC); + api.listen.on('addClientFeatures', () => { + if (api.settings.get('allow_muc')) { + api.disco.own.features.add(Strophe.NS.MUC); } - if (_converse.api.settings.get('allow_muc_invitations')) { - _converse.api.disco.own.features.add('jabber:x:conference'); // Invites + if (api.settings.get('allow_muc_invitations')) { + 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 => { const muc_jid = Strophe.getBareJidFromJid(stanza.getAttribute('from')); if (!_converse.chatboxes.get(muc_jid)) { - _converse.api.waitUntil('chatBoxesFetched') + api.waitUntil('chatBoxesFetched') .then(async () => { const muc = _converse.chatboxes.get(muc_jid); if (muc) { @@ -2580,11 +2581,11 @@ converse.plugins.add('converse-muc', { .filter(m => (m.get('type') === _converse.CHATROOMS_TYPE)) .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, () => { - const using_websocket = _converse.api.connection.isType('websocket'); + const using_websocket = api.connection.isType('websocket'); if (using_websocket && (!_converse.enable_smacks || !_converse.session.get('smacks_stream_id'))) { // For non-SMACKS websocket connections, or non-resumeable @@ -2601,22 +2602,22 @@ converse.plugins.add('converse-muc', { converse.env.muc_utils = muc_utils; // 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 * (aka groupchats). * - * @namespace _converse.api.rooms - * @memberOf _converse.api + * @namespace api.rooms + * @memberOf api */ rooms: { /** * 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). * - * @method _converse.api.rooms.create + * @method api.rooms.create * @param {(string[]|string)} jid|jids The JID or array of * JIDs of the chatroom(s) to create * @param {object} [attrs] attrs The room attributes @@ -2624,7 +2625,7 @@ converse.plugins.add('converse-muc', { */ create (jids, 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); } if (jids === undefined) { @@ -2638,9 +2639,9 @@ converse.plugins.add('converse-muc', { /** * 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 * currently open rooms will be returned). * @param {string} attrs A map containing any extra room attributes. @@ -2667,19 +2668,19 @@ converse.plugins.add('converse-muc', { * @returns {Promise} Promise which resolves with the Model representing the chat. * * @example - * this._converse.api.rooms.open('group@muc.example.com') + * this.api.rooms.open('group@muc.example.com') * * @example * // 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 * // 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 * // For example, opening a room with a specific default configuration: - * _converse.api.rooms.open( + * api.rooms.open( * 'myroom@conference.example.org', * { 'nick': 'coolguy69', * 'auto_configure': true, @@ -2695,17 +2696,17 @@ converse.plugins.add('converse-muc', { * ); */ async open (jids, attrs, force=false) { - await _converse.api.waitUntil('chatBoxesFetched'); + await api.waitUntil('chatBoxesFetched'); if (jids === undefined) { const err_msg = 'rooms.open: You need to provide at least one JID'; log.error(err_msg); throw(new TypeError(err_msg)); } 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); return room; } 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)); return rooms; } @@ -2714,7 +2715,7 @@ converse.plugins.add('converse-muc', { /** * 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 {object} attrs A map containing any extra room attributes For example, if you want * to specify the nickname, use `{'nick': 'bloodninja'}`. Previously (before @@ -2726,9 +2727,9 @@ converse.plugins.add('converse-muc', { * if not found (default: `false`) * @returns { Promise<_converse.ChatRoom> } * @example - * _converse.api.waitUntil('roomsAutoJoined').then(() => { + * api.waitUntil('roomsAutoJoined').then(() => { * const create_if_not_found = true; - * _converse.api.rooms.get( + * api.rooms.get( * 'group@muc.example.com', * {'nick': 'dread-pirate-roberts'}, * create_if_not_found @@ -2737,9 +2738,9 @@ converse.plugins.add('converse-muc', { */ async get (jids, attrs={}, create=false) { async function _get (jid) { - let model = await _converse.api.chatboxes.get(jid); + let model = await api.chatboxes.get(jid); if (!model && create) { - model = await _converse.api.chatboxes.create(jid, attrs, _converse.ChatRoom); + model = await api.chatboxes.create(jid, attrs, _converse.ChatRoom); } else { model = (model && model.get('type') === _converse.CHATROOMS_TYPE) ? model : null; if (model && Object.keys(attrs).length) { @@ -2749,7 +2750,7 @@ converse.plugins.add('converse-muc', { return model; } 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)); } else if (isString(jids)) { return _get(jids); diff --git a/src/headless/converse-ping.js b/src/headless/converse-ping.js index 99b2ee610..f2df5afed 100644 --- a/src/headless/converse-ping.js +++ b/src/headless/converse-ping.js @@ -22,9 +22,11 @@ converse.plugins.add('converse-ping', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; + let lastStanzaDate; - _converse.api.settings.update({ + api.settings.update({ ping_interval: 60 //in seconds }); @@ -39,14 +41,14 @@ converse.plugins.add('converse-ping', { function registerPongHandler () { 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"); } function registerPingHandler () { _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 // in order to ping only when needed. lastStanzaDate = new Date(); @@ -56,13 +58,13 @@ converse.plugins.add('converse-ping', { } setTimeout(() => { - if (_converse.api.settings.get('ping_interval') > 0) { + if (api.settings.get('ping_interval') > 0) { const now = new Date(); if (!lastStanzaDate) { lastStanzaDate = now; } - if ((now - lastStanzaDate)/1000 > _converse.api.settings.get('ping_interval')) { - return _converse.api.ping(); + if ((now - lastStanzaDate)/1000 > api.settings.get('ping_interval')) { + return api.ping(); } return true; } @@ -75,25 +77,25 @@ converse.plugins.add('converse-ping', { registerPongHandler(); registerPingHandler(); }; - _converse.api.listen.on('connected', onConnected); - _converse.api.listen.on('reconnected', onConnected); + api.listen.on('connected', onConnected); + api.listen.on('reconnected', onConnected); function onWindowStateChanged (data) { - if (data.state === 'visible' && _converse.api.connection.connected()) { - _converse.api.ping(null, 5000); + if (data.state === 'visible' && api.connection.connected()) { + api.ping(null, 5000); } } - _converse.api.listen.on('windowStateChanged', onWindowStateChanged); + api.listen.on('windowStateChanged', onWindowStateChanged); /************************ END Event Handlers ************************/ /************************ BEGIN API ************************/ - Object.assign(_converse.api, { + Object.assign(api, { /** * Pings the service represented by the passed in JID by sending an IQ stanza. * @private - * @method _converse.api.ping + * @method api.ping * @param { String } [jid] - The JID of the service to ping * @param { Integer } [timeout] - The amount of time in * milliseconds to wait for a response. The default is 10000; @@ -112,11 +114,11 @@ converse.plugins.add('converse-ping', { 'id': u.getUniqueId('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) { log.warn(`Timeout while pinging ${jid}`); if (jid === Strophe.getDomainFromJid(_converse.bare_jid)) { - _converse.api.connection.reconnect(); + api.connection.reconnect(); } } else if (u.isErrorStanza(result)) { log.error(`Error while pinging ${jid}`); diff --git a/src/headless/converse-pubsub.js b/src/headless/converse-pubsub.js index 8d035a3f2..4c83d3c94 100644 --- a/src/headless/converse-pubsub.js +++ b/src/headless/converse-pubsub.js @@ -21,6 +21,7 @@ converse.plugins.add('converse-pubsub', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; /************************ BEGIN API ************************/ @@ -58,7 +59,7 @@ converse.plugins.add('converse-pubsub', { if (options) { 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') .c('x', {'xmlns': Strophe.NS.XFORM, 'type': 'submit'}) .c('field', {'var': 'FORM_TYPE', 'type': 'hidden'}) @@ -71,7 +72,7 @@ converse.plugins.add('converse-pubsub', { } } try { - _converse.api.sendIQ(stanza); + api.sendIQ(stanza); } catch (iq) { if (iq instanceof Element && strict_options && @@ -82,7 +83,7 @@ converse.plugins.add('converse-pubsub', { const el = stanza.nodeTree; el.querySelector('publish-options').outerHTML = ''; log.warn(`PubSub: Republishing without publish options. ${el.outerHTML}`); - _converse.api.sendIQ(el); + api.sendIQ(el); } else { throw iq; } diff --git a/src/headless/converse-roster.js b/src/headless/converse-roster.js index 26b2215ad..b25b1ea88 100644 --- a/src/headless/converse-roster.js +++ b/src/headless/converse-roster.js @@ -22,16 +22,17 @@ converse.plugins.add('converse-roster', { /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - const { _converse } = this, - { __ } = _converse; + const { _converse } = this; + const { api } = _converse; + const { __ } = _converse; - _converse.api.settings.update({ + api.settings.update({ 'allow_contact_requests': true, 'auto_subscribe': false, 'synchronize_availability': true, }); - _converse.api.promises.add([ + api.promises.add([ 'cachedRoster', 'roster', 'rosterContactsFetched', @@ -73,7 +74,7 @@ converse.plugins.add('converse-roster', { _converse.rejectPresenceSubscription = function (jid, message) { const pres = $pres({to: jid, type: "unsubscribed"}); if (message && message !== "") { pres.c("status").t(message); } - _converse.api.send(pres); + api.send(pres); }; @@ -107,9 +108,9 @@ converse.plugins.add('converse-roster', { * @example _converse.api.listen.on('rosterGroupsFetched', () => { ... }); * @example _converse.api.waitUntil('rosterGroupsFetched').then(() => { ... }); */ - _converse.api.trigger('rosterGroupsFetched'); + api.trigger('rosterGroupsFetched'); await _converse.roster.fetchRosterContacts(); - _converse.api.trigger('rosterContactsFetched'); + api.trigger('rosterContactsFetched'); } catch (reason) { log.error(reason); } finally { @@ -231,14 +232,14 @@ converse.plugins.add('converse-roster', { * @type { _converse.RosterContact } * @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')); /** * Synchronous event which provides a hook for further initializing a RosterContact * @event _converse#rosterContactInitialized * @param { _converse.RosterContact } contact */ - await _converse.api.trigger('rosterContactInitialized', this, {'Synchronous': true}); + await api.trigger('rosterContactInitialized', this, {'Synchronous': true}); this.initialized.resolve(); }, @@ -277,7 +278,7 @@ converse.plugins.add('converse-roster', { if (nick) { 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. return this; }, @@ -291,7 +292,7 @@ converse.plugins.add('converse-roster', { * @method _converse.RosterContacts#ackSubscribe */ ackSubscribe () { - _converse.api.send($pres({ + api.send($pres({ 'type': 'subscribe', 'to': this.get('jid') })); @@ -308,7 +309,7 @@ converse.plugins.add('converse-roster', { * @param { String } jid - The Jabber ID of the user who is unsubscribing */ ackUnsubscribe () { - _converse.api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')})); + api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')})); this.removeFromRoster(); this.destroy(); }, @@ -335,7 +336,7 @@ converse.plugins.add('converse-roster', { if (message && message !== "") { pres.c("status").t(message); } - _converse.api.send(pres); + api.send(pres); return this; }, @@ -349,7 +350,7 @@ converse.plugins.add('converse-roster', { const iq = $iq({type: 'set'}) .c('query', {xmlns: Strophe.NS.ROSTER}) .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', { * @example _converse.api.listen.on('cachedRoster', (items) => { ... }); * @example _converse.api.waitUntil('cachedRoster').then(items => { ... }); */ - _converse.api.trigger('cachedRoster', result); + api.trigger('cachedRoster', result); } else { _converse.send_initial_presence = true; return _converse.roster.fetchFromServer(); @@ -498,7 +499,7 @@ converse.plugins.add('converse-roster', { .c('query', {'xmlns': Strophe.NS.ROSTER}) .c('item', { jid, name }); 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', { * @param { Object } attributes - Any additional attributes to be stored on the user's model. */ async addContactToRoster (jid, name, groups, attributes) { - await _converse.api.waitUntil('rosterContactsFetched'); + await api.waitUntil('rosterContactsFetched'); groups = groups || []; try { await this.sendContactAddIQ(jid, name, groups); @@ -573,7 +574,7 @@ converse.plugins.add('converse-roster', { ); 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(); this.data.save('version', query.getAttribute('ver')); @@ -595,12 +596,12 @@ converse.plugins.add('converse-roster', { * @type { XMLElement } * @example _converse.api.listen.on('rosterPush', iq => { ... }); */ - _converse.api.trigger('rosterPush', iq); + api.trigger('rosterPush', iq); return; }, 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', { if (this.rosterVersioningSupported()) { 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') { const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop(); if (query) { @@ -641,7 +642,7 @@ converse.plugins.add('converse-roster', { * @example _converse.api.listen.on('roster', 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 @@ -701,7 +702,7 @@ converse.plugins.add('converse-roster', { * @type { _converse.RosterContact } * @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', { bare_jid = Strophe.getBareJidFromJid(jid), contact = this.get(bare_jid); - if (!_converse.api.settings.get('allow_contact_requests')) { + if (!api.settings.get('allow_contact_requests')) { _converse.rejectPresenceSubscription( jid, __("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')) { this.subscribeBack(bare_jid, presence); } else { @@ -742,8 +743,8 @@ converse.plugins.add('converse-roster', { if ((_converse.connection.jid !== jid) && (presence_type !== 'unavailable') && - (_converse.api.settings.get('synchronize_availability') === true || - _converse.api.settings.get('synchronize_availability') === resource)) { + (api.settings.get('synchronize_availability') === true || + api.settings.get('synchronize_availability') === resource)) { // Another resource has changed its status and // synchronize_availability option set to update, // we'll update ours as well. @@ -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('add', chatbox => { @@ -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) => { /* When a new contact is added, check if we already have a * chatbox open for it, and if so attach it to the chatbox. @@ -917,9 +918,9 @@ converse.plugins.add('converse-roster', { _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(); if (_converse.shouldClearCache()) { if (_converse.rostergroups) { @@ -934,7 +935,7 @@ converse.plugins.add('converse-roster', { } }); - _converse.api.listen.on('statusInitialized', async reconnecting => { + api.listen.on('statusInitialized', async reconnecting => { if (reconnecting) { // When reconnecting and not resuming a previous session, // we clear all cached presence data, since it might be stale @@ -957,14 +958,14 @@ converse.plugins.add('converse-roster', { * @type { bool } * @example _converse.api.listen.on('presencesInitialized', reconnecting => { ... }); */ - _converse.api.trigger('presencesInitialized', reconnecting); + api.trigger('presencesInitialized', reconnecting); }); async function initRoster () { // Initialize the Bakcbone collections that represent the contats // roster and the roster groups. - await _converse.api.waitUntil('VCardsInitialized'); + await api.waitUntil('VCardsInitialized'); _converse.roster = new _converse.RosterContacts(); let id = `converse.contacts-${_converse.bare_jid}`; _converse.roster.browserStorage = _converse.createStore(id); @@ -986,10 +987,10 @@ converse.plugins.add('converse-roster', { * @example _converse.api.listen.on('rosterInitialized', () => { ... }); * @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) { /** * Similar to `rosterInitialized`, but instead pertaining to reconnection. @@ -998,7 +999,7 @@ converse.plugins.add('converse-roster', { * @event _converse#rosterReadyAfterReconnection * @example _converse.api.listen.on('rosterReadyAfterReconnection', () => { ... }); */ - _converse.api.trigger('rosterReadyAfterReconnection'); + api.trigger('rosterReadyAfterReconnection'); } else { await initRoster(); } @@ -1050,7 +1051,7 @@ converse.plugins.add('converse-roster', { * }); */ async get (jids) { - await _converse.api.waitUntil('rosterContactsFetched'); + await api.waitUntil('rosterContactsFetched'); const _getter = jid => _converse.roster.get(Strophe.getBareJidFromJid(jid)); if (jids === undefined) { jids = _converse.roster.pluck('jid'); @@ -1073,7 +1074,7 @@ converse.plugins.add('converse-roster', { * _converse.api.contacts.add('buddy@example.com', 'Buddy') */ async add (jid, name) { - await _converse.api.waitUntil('rosterContactsFetched'); + await api.waitUntil('rosterContactsFetched'); if (!isString(jid) || !jid.includes('@')) { throw new TypeError('contacts.add: invalid jid'); } diff --git a/src/headless/converse-smacks.js b/src/headless/converse-smacks.js index 537e0deac..43584a28e 100644 --- a/src/headless/converse-smacks.js +++ b/src/headless/converse-smacks.js @@ -18,21 +18,22 @@ converse.plugins.add('converse-smacks', { initialize () { const { _converse } = this; + const { api } = _converse; // Configuration values for this plugin // ==================================== // Refer to docs/source/configuration.rst for explanations of these // configuration settings. - _converse.api.settings.update({ + api.settings.update({ 'enable_smacks': true, 'smacks_max_unacked_stanzas': 5, }); function isStreamManagementSupported () { - if (_converse.api.connection.isType('bosh') && !_converse.isTestEnv()) { + if (api.connection.isType('bosh') && !_converse.isTestEnv()) { return false; } - return _converse.api.disco.stream.getFeature('sm', Strophe.NS.SM); + return api.disco.stream.getFeature('sm', Strophe.NS.SM); } function handleAck (el) { @@ -69,7 +70,7 @@ converse.plugins.add('converse-smacks', { if (_converse.session.get('smacks_enabled')) { const h = _converse.session.get('num_stanzas_handled'); const stanza = u.toStanza(``); - _converse.api.send(stanza); + api.send(stanza); } return true; } @@ -132,7 +133,7 @@ converse.plugins.add('converse-smacks', { * Triggered when the XEP-0198 stream could not be resumed. * @event _converse#streamResumptionFailed */ - _converse.api.trigger('streamResumptionFailed'); + api.trigger('streamResumptionFailed'); return true; } @@ -158,7 +159,7 @@ converse.plugins.add('converse-smacks', { // service worker or handling IQ[type="result"] stanzas // differently, more like push stanzas, so that they don't need // explicit handlers. - stanzas.forEach(s => _converse.api.send(s)); + stanzas.forEach(s => api.send(s)); } function onResumedStanza (el) { @@ -179,13 +180,13 @@ converse.plugins.add('converse-smacks', { const previous_id = _converse.session.get('smacks_stream_id'); const h = _converse.session.get('num_stanzas_handled'); const stanza = u.toStanza(``); - _converse.api.send(stanza); + api.send(stanza); _converse.connection.flush(); await promise; } 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; } if (await isStreamManagementSupported()) { @@ -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(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(``); - _converse.api.send(stanza); + api.send(stanza); _converse.connection.flush(); await promise; } } async function enableStreamManagement () { - if (!_converse.api.settings.get('enable_smacks')) { + if (!api.settings.get('enable_smacks')) { return; } if (!(await isStreamManagementSupported())) { @@ -235,21 +236,21 @@ converse.plugins.add('converse-smacks', { 'unacked_stanzas', (_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) { const num = _converse.session.get('num_stanzas_since_last_ack') + 1; if (num % max_unacked === 0) { // Request confirmation of sent stanzas - _converse.api.send(u.toStanza(``)); + api.send(u.toStanza(``)); } _converse.session.save({'num_stanzas_since_last_ack': num}); } } } - _converse.api.listen.on('userSessionInitialized', initSessionData); - _converse.api.listen.on('beforeResourceBinding', enableStreamManagement); - _converse.api.listen.on('afterResourceBinding', sendEnableStanza); - _converse.api.listen.on('send', onStanzaSent); + api.listen.on('userSessionInitialized', initSessionData); + api.listen.on('beforeResourceBinding', enableStreamManagement); + api.listen.on('afterResourceBinding', sendEnableStanza); + api.listen.on('send', onStanzaSent); } }); diff --git a/src/headless/converse-status.js b/src/headless/converse-status.js index 984019837..c924b2662 100644 --- a/src/headless/converse-status.js +++ b/src/headless/converse-status.js @@ -14,8 +14,9 @@ converse.plugins.add('converse-status', { initialize () { 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_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. @@ -25,7 +26,7 @@ converse.plugins.add('converse-status', { _converse.XMPPStatus = Model.extend({ defaults () { - return {"status": _converse.api.settings.get("default_state")} + return {"status": api.settings.get("default_state")} }, initialize () { @@ -50,7 +51,7 @@ converse.plugins.add('converse-status', { constructPresence (type, status_message) { 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'); // Most of these presence types are actually not explicitly sent, // but I add all of them here for reference and future proofing. @@ -73,7 +74,7 @@ converse.plugins.add('converse-status', { 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(); if (_converse.idle) { const idle_since = new Date(); @@ -84,7 +85,7 @@ converse.plugins.add('converse-status', { }, 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', { * @param { String } stat - The user's chat status */ _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; }; @@ -123,7 +124,7 @@ converse.plugins.add('converse-status', { _converse.auto_changed_status = false; // XXX: we should really remember the original state here, and // 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', { } const stat = _converse.xmppstatus.get('status'); _converse.idle_seconds++; - if (_converse.api.settings.get("csi_waiting_time") > 0 && - _converse.idle_seconds > _converse.api.settings.get("csi_waiting_time") && + if (api.settings.get("csi_waiting_time") > 0 && + _converse.idle_seconds > api.settings.get("csi_waiting_time") && !_converse.inactive) { _converse.sendCSI(_converse.INACTIVE); } - if (_converse.api.settings.get("idle_presence_timeout") > 0 && - _converse.idle_seconds > _converse.api.settings.get("idle_presence_timeout") && + if (api.settings.get("idle_presence_timeout") > 0 && + _converse.idle_seconds > api.settings.get("idle_presence_timeout") && !_converse.idle) { _converse.idle = true; _converse.xmppstatus.sendPresence(); } - if (_converse.api.settings.get("auto_away") > 0 && - _converse.idle_seconds > _converse.api.settings.get("auto_away") && + if (api.settings.get("auto_away") > 0 && + _converse.idle_seconds > api.settings.get("auto_away") && stat !== 'away' && stat !== 'xa' && stat !== 'dnd') { _converse.auto_changed_status = true; _converse.xmppstatus.set('status', 'away'); - } else if (_converse.api.settings.get("auto_xa") > 0 && - _converse.idle_seconds > _converse.api.settings.get("auto_xa") && + } else if (api.settings.get("auto_xa") > 0 && + _converse.idle_seconds > api.settings.get("auto_xa") && stat !== 'xa' && stat !== 'dnd') { _converse.auto_changed_status = true; _converse.xmppstatus.set('status', 'xa'); @@ -167,10 +168,10 @@ converse.plugins.add('converse-status', { * Required for the auto_away, auto_xa and csi_waiting_time features. */ if ( - _converse.api.settings.get("auto_away") < 1 && - _converse.api.settings.get("auto_xa") < 1 && - _converse.api.settings.get("csi_waiting_time") < 1 && - _converse.api.settings.get("idle_presence_timeout") < 1 + api.settings.get("auto_away") < 1 && + api.settings.get("auto_xa") < 1 && + api.settings.get("csi_waiting_time") < 1 && + api.settings.get("idle_presence_timeout") < 1 ) { // Waiting time of less then one second means features aren't used. return; @@ -192,7 +193,7 @@ converse.plugins.add('converse-status', { }; - _converse.api.listen.on('presencesInitialized', (reconnecting) => { + api.listen.on('presencesInitialized', (reconnecting) => { if (!reconnecting) { _converse.registerIntervalHandler(); } @@ -206,7 +207,7 @@ converse.plugins.add('converse-status', { * @example _converse.api.listen.on('statusInitialized', status => { ... }); * @example _converse.api.waitUntil('statusInitialized').then(() => { ... }); */ - _converse.api.trigger('statusInitialized', reconnecting); + api.trigger('statusInitialized', reconnecting); } @@ -230,15 +231,15 @@ converse.plugins.add('converse-status', { /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('clearSession', () => { + api.listen.on('clearSession', () => { if (_converse.shouldClearCache() && _converse.xmppstatus) { _converse.xmppstatus.destroy(); delete _converse.xmppstatus; } }); - _converse.api.listen.on('connected', () => initStatus(false)); - _converse.api.listen.on('reconnected', () => initStatus(true)); + api.listen.on('connected', () => initStatus(false)); + api.listen.on('reconnected', () => initStatus(true)); /************************ END Event Handlers ************************/ diff --git a/src/headless/converse-vcard.js b/src/headless/converse-vcard.js index 9206696af..c6f6c58a9 100644 --- a/src/headless/converse-vcard.js +++ b/src/headless/converse-vcard.js @@ -65,8 +65,9 @@ converse.plugins.add('converse-vcard', { * loaded by converse.js's plugin machinery. */ const { _converse } = this; + const { api } = _converse; - _converse.api.promises.add('VCardsInitialized'); + api.promises.add('VCardsInitialized'); _converse.VCard = Model.extend({ @@ -105,7 +106,7 @@ converse.plugins.add('converse-vcard', { initialize () { this.on('add', vcard => { - _converse.api.vcard.update(vcard); + api.vcard.update(vcard); }); } }); @@ -152,7 +153,7 @@ converse.plugins.add('converse-vcard', { const to = Strophe.getBareJidFromJid(jid) === _converse.bare_jid ? null : jid; let iq; try { - iq = await _converse.api.sendIQ(createStanza("get", to)) + iq = await api.sendIQ(createStanza("get", to)) } catch (iq) { return { 'stanza': iq, @@ -174,7 +175,7 @@ converse.plugins.add('converse-vcard', { } else { jid = model.get('jid'); } - await _converse.api.waitUntil('VCardsInitialized'); + await api.waitUntil('VCardsInitialized'); model.vcard = _converse.vcards.findWhere({'jid': jid}); if (!model.vcard) { model.vcard = _converse.vcards.create({'jid': jid}); @@ -202,7 +203,7 @@ converse.plugins.add('converse-vcard', { async function setVCardOnMUCMessage (message) { - await _converse.api.waitUntil('VCardsInitialized'); + await api.waitUntil('VCardsInitialized'); if (['error', 'info'].includes(message.get('type'))) { return; } else { @@ -229,13 +230,13 @@ converse.plugins.add('converse-vcard', { * Triggered as soon as the `_converse.vcards` collection has been initialized and populated from cache. * @event _converse#VCardsInitialized */ - _converse.api.trigger('VCardsInitialized'); + api.trigger('VCardsInitialized'); } function clearVCardsSession () { if (_converse.shouldClearCache()) { - _converse.api.promises.add('VCardsInitialized'); + api.promises.add('VCardsInitialized'); if (_converse.vcards) { _converse.vcards.clearStore(); delete _converse.vcards; @@ -246,14 +247,14 @@ converse.plugins.add('converse-vcard', { /************************ BEGIN Event Handlers ************************/ - _converse.api.listen.on('chatBoxInitialized', m => setVCardOnModel(m)); - _converse.api.listen.on('chatRoomInitialized', m => setVCardOnModel(m)); - _converse.api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m)); - _converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.VCARD)); - _converse.api.listen.on('clearSession', () => clearVCardsSession()); - _converse.api.listen.on('messageInitialized', m => setVCardOnModel(m)); - _converse.api.listen.on('rosterContactInitialized', m => setVCardOnModel(m)); - _converse.api.listen.on('statusInitialized', _converse.initVCardCollection); + api.listen.on('chatBoxInitialized', m => setVCardOnModel(m)); + api.listen.on('chatRoomInitialized', m => setVCardOnModel(m)); + api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m)); + api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.VCARD)); + api.listen.on('clearSession', () => clearVCardsSession()); + api.listen.on('messageInitialized', m => setVCardOnModel(m)); + api.listen.on('rosterContactInitialized', m => setVCardOnModel(m)); + api.listen.on('statusInitialized', _converse.initVCardCollection); /************************ BEGIN API ************************/ @@ -289,7 +290,7 @@ converse.plugins.add('converse-vcard', { throw Error("No jid provided for the VCard data"); } 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)); }, /**