Commit 1ce46a84 authored by JC Brand's avatar JC Brand

Make sure that `statusInitialized` is always called

regardless of wether it's a connection or reconnection event.

We can then only listen for `statusInitialized` to handle both cases.
parent 5968eec7
...@@ -41,12 +41,6 @@ ...@@ -41,12 +41,6 @@
const { _converse } = this.__super__; const { _converse } = this.__super__;
_converse.chatboxviews.closeAllChatBoxes(); _converse.chatboxviews.closeAllChatBoxes();
return this.__super__.initStatus.apply(this, arguments); return this.__super__.initStatus.apply(this, arguments);
},
onStatusInitialized: function () {
const { _converse } = this.__super__;
_converse.chatboxes.onConnected();
return this.__super__.onStatusInitialized.apply(this, arguments);
} }
}, },
...@@ -482,6 +476,8 @@ ...@@ -482,6 +476,8 @@
_converse.chatboxes.remove(); // Don't call off(), events won't get re-registered upon reconnect. _converse.chatboxes.remove(); // Don't call off(), events won't get re-registered upon reconnect.
delete _converse.chatboxes.browserStorage; delete _converse.chatboxes.browserStorage;
}); });
_converse.api.listen.on('statusInitialized', () => _converse.chatboxes.onConnected());
/************************ END Event Handlers ************************/ /************************ END Event Handlers ************************/
......
...@@ -221,14 +221,13 @@ ...@@ -221,14 +221,13 @@
const LABEL_CONTACTS = __('Contacts'); const LABEL_CONTACTS = __('Contacts');
_converse.addControlBox = () => { _converse.addControlBox = () =>
_converse.chatboxes.add({ _converse.chatboxes.add({
id: 'controlbox', id: 'controlbox',
box_id: 'controlbox', box_id: 'controlbox',
type: 'controlbox', type: 'controlbox',
closed: !_converse.show_controlbox_by_default closed: !_converse.show_controlbox_by_default
}) })
};
_converse.ControlBoxView = _converse.ChatBoxView.extend({ _converse.ControlBoxView = _converse.ChatBoxView.extend({
tagName: 'div', tagName: 'div',
...@@ -291,7 +290,6 @@ ...@@ -291,7 +290,6 @@
_converse.api.waitUntil('rosterViewInitialized') _converse.api.waitUntil('rosterViewInitialized')
.then(this.insertRoster.bind(this)) .then(this.insertRoster.bind(this))
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); .catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
this.model.save();
} }
}, },
...@@ -350,11 +348,13 @@ ...@@ -350,11 +348,13 @@
this.el.classList.add("col-xl-2"); this.el.classList.add("col-xl-2");
this.el.classList.add("col-md-3"); this.el.classList.add("col-md-3");
this.controlbox_pane = new _converse.ControlBoxPane(); if (!this.controlbox_pane) {
this.el.querySelector('.controlbox-panes').insertAdjacentElement( this.controlbox_pane = new _converse.ControlBoxPane();
'afterBegin', this.el.querySelector('.controlbox-panes').insertAdjacentElement(
this.controlbox_pane.el 'afterBegin',
) this.controlbox_pane.el
)
}
}, },
close (ev) { close (ev) {
...@@ -706,34 +706,23 @@ ...@@ -706,34 +706,23 @@
Promise.all([ Promise.all([
_converse.api.waitUntil('connectionInitialized'), _converse.api.waitUntil('connectionInitialized'),
_converse.api.waitUntil('chatBoxesInitialized') _converse.api.waitUntil('chatBoxesInitialized')
]).then(() => { ]).then(_converse.addControlBox).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
_converse.addControlBox();
_converse.chatboxes.get('controlbox').save({connected:true}); _converse.on('chatBoxesFetched', () => {
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); const controlbox = _converse.chatboxes.get('controlbox') || _converse.addControlBox();
controlbox.save({connected:true});
});
const disconnect = function () { const disconnect = function () {
/* Upon disconnection, set connected to `false`, so that if /* Upon disconnection, set connected to `false`, so that if
* we reconnect, * we reconnect, "onConnected" will be called,
* "onConnected" will be called, to fetch the roster again and * to fetch the roster again and to send out a presence stanza.
* to send out a presence stanza.
*/ */
const view = _converse.chatboxviews.get('controlbox'); const view = _converse.chatboxviews.get('controlbox');
view.model.set({connected:false}); view.model.set({connected:false});
view.renderLoginPanel(); view.renderLoginPanel();
}; };
_converse.on('disconnected', disconnect); _converse.on('disconnected', disconnect);
const afterReconnected = function () {
/* After reconnection makes sure the controlbox is aware.
*/
const view = _converse.chatboxviews.get('controlbox');
if (view.model.get('connected')) {
_converse.chatboxviews.get("controlbox").onConnected();
} else {
view.model.set({connected:true});
}
};
_converse.on('reconnected', afterReconnected);
} }
}); });
})); }));
...@@ -614,19 +614,24 @@ ...@@ -614,19 +614,24 @@
} }
}; };
this.initStatus = () => this.initStatus = (reconnecting) => {
new Promise((resolve, reject) => {
const promise = new u.getResolveablePromise(); // If there's no xmppstatus obj, then we were never connected to
// begin with, so we set reconnecting to false.
reconnecting = _.isUndefined(_converse.xmppstatus) ? false : reconnecting;
if (reconnecting) {
_converse.onStatusInitialized(reconnecting);
} else {
this.xmppstatus = new this.XMPPStatus(); this.xmppstatus = new this.XMPPStatus();
const id = b64_sha1(`converse.xmppstatus-${_converse.bare_jid}`); const id = b64_sha1(`converse.xmppstatus-${_converse.bare_jid}`);
this.xmppstatus.id = id; // Appears to be necessary for backbone.browserStorage this.xmppstatus.id = id; // Appears to be necessary for backbone.browserStorage
this.xmppstatus.browserStorage = new Backbone.BrowserStorage[_converse.storage](id); this.xmppstatus.browserStorage = new Backbone.BrowserStorage[_converse.storage](id);
this.xmppstatus.fetch({ this.xmppstatus.fetch({
success: resolve, success: _.partial(_converse.onStatusInitialized, reconnecting),
error: resolve error: _.partial(_converse.onStatusInitialized, reconnecting)
}); });
_converse.emit('statusInitialized'); }
}); }
this.initSession = function () { this.initSession = function () {
_converse.session = new Backbone.Model(); _converse.session = new Backbone.Model();
...@@ -808,6 +813,7 @@ ...@@ -808,6 +813,7 @@
* populating the roster etc.) necessary once the connection has * populating the roster etc.) necessary once the connection has
* been established. * been established.
*/ */
_converse.emit('statusInitialized');
if (reconnecting) { if (reconnecting) {
// No need to recreate the roster, otherwise we lose our // No need to recreate the roster, otherwise we lose our
// cached data. However we still emit an event, to give // cached data. However we still emit an event, to give
...@@ -821,9 +827,12 @@ ...@@ -821,9 +827,12 @@
_converse.roster.onConnected(); _converse.roster.onConnected();
_converse.populateRoster(reconnecting); _converse.populateRoster(reconnecting);
_converse.registerPresenceHandler(); _converse.registerPresenceHandler();
if (!reconnecting) { if (reconnecting) {
_converse.emit('reconnected');
} else {
init_promise.resolve(); init_promise.resolve();
_converse.emit('initialized'); _converse.emit('initialized');
_converse.emit('connected');
} }
}; };
...@@ -838,28 +847,11 @@ ...@@ -838,28 +847,11 @@
/* Called as soon as a new connection has been established, either /* Called as soon as a new connection has been established, either
* by logging in or by attaching to an existing BOSH session. * by logging in or by attaching to an existing BOSH session.
*/ */
// Solves problem of returned PubSub BOSH response not received _converse.connection.flush(); // Solves problem of returned PubSub BOSH response not received by browser
// by browser.
_converse.connection.flush();
_converse.setUserJid(); _converse.setUserJid();
_converse.initSession(); _converse.initSession();
_converse.enableCarbons(); _converse.enableCarbons();
_converse.initStatus(reconnecting)
// If there's no xmppstatus obj, then we were never connected to
// begin with, so we set reconnecting to false.
reconnecting = _.isUndefined(_converse.xmppstatus) ? false : reconnecting;
if (reconnecting) {
_converse.onStatusInitialized(true);
_converse.emit('reconnected');
} else {
_converse.initStatus()
.then(
_.partial(_converse.onStatusInitialized, false),
_.partial(_converse.onStatusInitialized, false))
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
_converse.emit('connected');
}
}; };
this.RosterContact = Backbone.Model.extend({ this.RosterContact = Backbone.Model.extend({
......
<form class="pure-form set-xmpp-status" id="set-xmpp-status" action="" method="post">
<select id="select-xmpp-status">
<option value="online">{{{o.label_online}}}</option>
<option value="dnd">{{{o.label_busy}}}</option>
<option value="away">{{{o.label_away}}}</option>
{[ if (o.include_offline_state) { ]}
<option value="offline">{{{o.label_offline}}}</option>
{[ } ]}
{[ if (o.allow_logout) { ]}
<option value="logout">{{{o.label_logout}}}</option>
{[ } ]}
</select>
</form>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment