2020-12-04 22:05:43 +01:00
|
|
|
import tpl_controlbox from './templates/controlbox.js';
|
2020-12-08 12:54:14 +01:00
|
|
|
import { ElementView } from '@converse/skeletor/src/element.js';
|
2020-12-04 22:05:43 +01:00
|
|
|
import { _converse, api, converse } from '@converse/headless/core';
|
2020-12-08 12:54:14 +01:00
|
|
|
import { render } from 'lit-html';
|
2020-12-04 22:05:43 +01:00
|
|
|
|
|
|
|
const u = converse.env.utils;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The ControlBox is the section of the chat that contains the open groupchats,
|
|
|
|
* bookmarks and roster.
|
|
|
|
*
|
|
|
|
* In `overlayed` `view_mode` it's a box like the chat boxes, in `fullscreen`
|
|
|
|
* `view_mode` it's a left-aligned sidebar.
|
|
|
|
*/
|
2020-12-08 12:54:14 +01:00
|
|
|
class ControlBoxView extends ElementView {
|
|
|
|
events = {
|
2020-12-04 22:05:43 +01:00
|
|
|
'click a.close-chatbox-button': 'close'
|
2020-12-08 12:54:14 +01:00
|
|
|
}
|
2020-12-04 22:05:43 +01:00
|
|
|
|
|
|
|
initialize () {
|
2021-01-25 16:07:42 +01:00
|
|
|
this.setModel();
|
2020-12-04 22:05:43 +01:00
|
|
|
this.render();
|
2021-01-22 15:31:59 +01:00
|
|
|
_converse.chatboxviews.add('controlbox', this);
|
2020-12-04 22:05:43 +01:00
|
|
|
/**
|
|
|
|
* Triggered when the _converse.ControlBoxView has been initialized and therefore
|
|
|
|
* exists. The controlbox contains the login and register forms when the user is
|
|
|
|
* logged out and a list of the user's contacts and group chats when logged in.
|
|
|
|
* @event _converse#controlBoxInitialized
|
|
|
|
* @type { _converse.ControlBoxView }
|
|
|
|
* @example _converse.api.listen.on('controlBoxInitialized', view => { ... });
|
|
|
|
*/
|
|
|
|
api.trigger('controlBoxInitialized', this);
|
2020-12-08 12:54:14 +01:00
|
|
|
}
|
2020-12-04 22:05:43 +01:00
|
|
|
|
2021-01-25 16:07:42 +01:00
|
|
|
setModel () {
|
|
|
|
this.model = _converse.chatboxes.get('controlbox');
|
|
|
|
this.initEventHandlers();
|
|
|
|
}
|
|
|
|
|
|
|
|
initEventHandlers () {
|
|
|
|
// Keep event handler registration in a separate method so that it can
|
|
|
|
// be called when a new controlbox is created and assigned to this
|
|
|
|
// element.
|
|
|
|
this.listenTo(this.model, 'change:active-form', this.render);
|
|
|
|
this.listenTo(this.model, 'change:connected', this.render);
|
|
|
|
this.listenTo(this.model, 'show', this.show);
|
|
|
|
}
|
|
|
|
|
2020-12-04 22:05:43 +01:00
|
|
|
render () {
|
2021-01-22 15:31:59 +01:00
|
|
|
if (this.model.get('connected') && this.model.get('closed') === undefined) {
|
|
|
|
this.model.set('closed', !api.settings.get('show_controlbox_by_default'));
|
2020-12-04 22:05:43 +01:00
|
|
|
}
|
|
|
|
|
2021-01-22 15:31:59 +01:00
|
|
|
render(tpl_controlbox({
|
2020-12-04 22:05:43 +01:00
|
|
|
'sticky_controlbox': api.settings.get('sticky_controlbox'),
|
|
|
|
...this.model.toJSON()
|
2021-01-22 15:31:59 +01:00
|
|
|
}), this);
|
2020-12-04 22:05:43 +01:00
|
|
|
|
2021-01-22 15:31:59 +01:00
|
|
|
const connection = _converse?.connection;
|
|
|
|
if (!connection?.connected || !connection?.authenticated || connection?.disconnecting) {
|
|
|
|
this.classList.add('logged-out');
|
2020-12-04 22:05:43 +01:00
|
|
|
}
|
2020-12-08 12:54:14 +01:00
|
|
|
}
|
2020-12-04 22:05:43 +01:00
|
|
|
|
|
|
|
async close (ev) {
|
|
|
|
if (ev && ev.preventDefault) {
|
|
|
|
ev.preventDefault();
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
ev?.name === 'closeAllChatBoxes' &&
|
|
|
|
(_converse.disconnection_cause !== _converse.LOGOUT ||
|
|
|
|
api.settings.get('show_controlbox_by_default'))
|
|
|
|
) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (api.settings.get('sticky_controlbox')) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const connection = _converse?.connection || {};
|
|
|
|
if (connection.connected && !connection.disconnecting) {
|
|
|
|
await new Promise((resolve, reject) => {
|
|
|
|
return this.model.save(
|
|
|
|
{ 'closed': true },
|
|
|
|
{ 'success': resolve, 'error': reject, 'wait': true }
|
|
|
|
);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
this.model.trigger('hide');
|
|
|
|
}
|
|
|
|
api.trigger('controlBoxClosed', this);
|
|
|
|
return this;
|
2020-12-08 12:54:14 +01:00
|
|
|
}
|
2020-12-04 22:05:43 +01:00
|
|
|
|
2021-01-22 16:20:58 +01:00
|
|
|
hide () {
|
2020-12-04 22:05:43 +01:00
|
|
|
if (api.settings.get('sticky_controlbox')) {
|
|
|
|
return;
|
|
|
|
}
|
2020-12-08 12:54:14 +01:00
|
|
|
u.addClass('hidden', this);
|
2020-12-04 22:05:43 +01:00
|
|
|
api.trigger('chatBoxClosed', this);
|
|
|
|
return this;
|
2020-12-08 12:54:14 +01:00
|
|
|
}
|
2020-12-04 22:05:43 +01:00
|
|
|
|
2021-01-22 16:20:58 +01:00
|
|
|
show () {
|
2020-12-04 22:05:43 +01:00
|
|
|
this.model.set('closed', false);
|
2020-12-08 12:54:14 +01:00
|
|
|
this.classList.remove('hidden');
|
2020-12-04 22:05:43 +01:00
|
|
|
/**
|
|
|
|
* Triggered once the controlbox has been opened
|
|
|
|
* @event _converse#controlBoxOpened
|
|
|
|
* @type {_converse.ControlBox}
|
|
|
|
*/
|
|
|
|
api.trigger('controlBoxOpened', this);
|
|
|
|
return this;
|
2020-12-08 12:54:14 +01:00
|
|
|
}
|
2020-12-04 22:05:43 +01:00
|
|
|
|
2020-12-08 12:54:14 +01:00
|
|
|
showHelpMessages () { // eslint-disable-line class-methods-use-this
|
2020-12-04 22:05:43 +01:00
|
|
|
return;
|
|
|
|
}
|
2020-12-08 12:54:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
api.elements.define('converse-controlbox', ControlBoxView);
|
2020-12-04 22:05:43 +01:00
|
|
|
|
2020-12-08 12:54:14 +01:00
|
|
|
export default ControlBoxView;
|