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.
This commit is contained in:
JC Brand 2018-02-22 11:06:30 +01:00
parent 5968eec783
commit 1ce46a84ae
4 changed files with 37 additions and 73 deletions

View File

@ -41,12 +41,6 @@
const { _converse } = this.__super__;
_converse.chatboxviews.closeAllChatBoxes();
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 @@
_converse.chatboxes.remove(); // Don't call off(), events won't get re-registered upon reconnect.
delete _converse.chatboxes.browserStorage;
});
_converse.api.listen.on('statusInitialized', () => _converse.chatboxes.onConnected());
/************************ END Event Handlers ************************/

View File

@ -221,14 +221,13 @@
const LABEL_CONTACTS = __('Contacts');
_converse.addControlBox = () => {
_converse.addControlBox = () =>
_converse.chatboxes.add({
id: 'controlbox',
box_id: 'controlbox',
type: 'controlbox',
closed: !_converse.show_controlbox_by_default
})
};
_converse.ControlBoxView = _converse.ChatBoxView.extend({
tagName: 'div',
@ -291,7 +290,6 @@
_converse.api.waitUntil('rosterViewInitialized')
.then(this.insertRoster.bind(this))
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
this.model.save();
}
},
@ -350,11 +348,13 @@
this.el.classList.add("col-xl-2");
this.el.classList.add("col-md-3");
this.controlbox_pane = new _converse.ControlBoxPane();
this.el.querySelector('.controlbox-panes').insertAdjacentElement(
'afterBegin',
this.controlbox_pane.el
)
if (!this.controlbox_pane) {
this.controlbox_pane = new _converse.ControlBoxPane();
this.el.querySelector('.controlbox-panes').insertAdjacentElement(
'afterBegin',
this.controlbox_pane.el
)
}
},
close (ev) {
@ -706,34 +706,23 @@
Promise.all([
_converse.api.waitUntil('connectionInitialized'),
_converse.api.waitUntil('chatBoxesInitialized')
]).then(() => {
_converse.addControlBox();
_converse.chatboxes.get('controlbox').save({connected:true});
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
]).then(_converse.addControlBox).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
_converse.on('chatBoxesFetched', () => {
const controlbox = _converse.chatboxes.get('controlbox') || _converse.addControlBox();
controlbox.save({connected:true});
});
const disconnect = function () {
/* Upon disconnection, set connected to `false`, so that if
* we reconnect,
* "onConnected" will be called, to fetch the roster again and
* to send out a presence stanza.
* we reconnect, "onConnected" will be called,
* to fetch the roster again and to send out a presence stanza.
*/
const view = _converse.chatboxviews.get('controlbox');
view.model.set({connected:false});
view.renderLoginPanel();
};
_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);
}
});
}));

View File

@ -614,19 +614,24 @@
}
};
this.initStatus = () =>
new Promise((resolve, reject) => {
const promise = new u.getResolveablePromise();
this.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(reconnecting);
} else {
this.xmppstatus = new this.XMPPStatus();
const id = b64_sha1(`converse.xmppstatus-${_converse.bare_jid}`);
this.xmppstatus.id = id; // Appears to be necessary for backbone.browserStorage
this.xmppstatus.browserStorage = new Backbone.BrowserStorage[_converse.storage](id);
this.xmppstatus.fetch({
success: resolve,
error: resolve
success: _.partial(_converse.onStatusInitialized, reconnecting),
error: _.partial(_converse.onStatusInitialized, reconnecting)
});
_converse.emit('statusInitialized');
});
}
}
this.initSession = function () {
_converse.session = new Backbone.Model();
@ -808,6 +813,7 @@
* populating the roster etc.) necessary once the connection has
* been established.
*/
_converse.emit('statusInitialized');
if (reconnecting) {
// No need to recreate the roster, otherwise we lose our
// cached data. However we still emit an event, to give
@ -821,9 +827,12 @@
_converse.roster.onConnected();
_converse.populateRoster(reconnecting);
_converse.registerPresenceHandler();
if (!reconnecting) {
if (reconnecting) {
_converse.emit('reconnected');
} else {
init_promise.resolve();
_converse.emit('initialized');
_converse.emit('connected');
}
};
@ -838,28 +847,11 @@
/* Called as soon as a new connection has been established, either
* by logging in or by attaching to an existing BOSH session.
*/
// Solves problem of returned PubSub BOSH response not received
// by browser.
_converse.connection.flush();
_converse.connection.flush(); // Solves problem of returned PubSub BOSH response not received by browser
_converse.setUserJid();
_converse.initSession();
_converse.enableCarbons();
// 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');
}
_converse.initStatus(reconnecting)
};
this.RosterContact = Backbone.Model.extend({

View File

@ -1,13 +0,0 @@
<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>