From 9d0cfe8f43ded91d7a328280f4354a8969b8dc57 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Sat, 10 Nov 2018 18:53:22 +0100 Subject: [PATCH] Presence subscription bugfixes. * Return the promise, so that we can wait. * `sendContactAddIQ` now returns a promise and doesn't take a callback * Don't call `destroy` on a contact that's already been removed. --- dist/converse.js | 68 +++++++++++++++++---------------- src/converse-rosterview.js | 38 ++++++++++-------- src/headless/converse-roster.js | 35 +++++++++-------- 3 files changed, 75 insertions(+), 66 deletions(-) diff --git a/dist/converse.js b/dist/converse.js index 704425d9d..52637bb04 100644 --- a/dist/converse.js +++ b/dist/converse.js @@ -68616,7 +68616,7 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_5__["default"].plugins _converse.api.chats.open(attrs.jid, attrs); }, - removeContact(ev) { + async removeContact(ev) { if (ev && ev.preventDefault) { ev.preventDefault(); } @@ -68625,28 +68625,35 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_5__["default"].plugins return; } - const result = confirm(__("Are you sure you want to remove this contact?")); + if (!confirm(__("Are you sure you want to remove this contact?"))) { + return; + } - if (result === true) { - this.model.removeFromRoster(iq => { + let iq; + + try { + iq = await this.model.removeFromRoster(); + this.remove(); + + if (this.model.collection) { + // The model might have already been removed as + // result of a roster push. this.model.destroy(); - this.remove(); - }, function (err) { - alert(__('Sorry, there was an error while trying to remove %1$s as a contact.', name)); + } + } catch (e) { + _converse.log(e, Strophe.LogLevel.ERROR); - _converse.log(err, Strophe.LogLevel.ERROR); - }); + _converse.api.alert.show(Strophe.LogLevel.ERROR, __('Sorry, there was an error while trying to remove %1$s as a contact.', name)); } }, - acceptRequest(ev) { + async acceptRequest(ev) { if (ev && ev.preventDefault) { ev.preventDefault(); } - _converse.roster.sendContactAddIQ(this.model.get('jid'), this.model.getFullname(), [], () => { - this.model.authorize().subscribe(); - }); + await _converse.roster.sendContactAddIQ(this.model.get('jid'), this.model.getFullname(), []); + this.model.authorize().subscribe(); }, declineRequest(ev) { @@ -77112,13 +77119,13 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins ackUnsubscribe() { /* Upon receiving the presence stanza of type "unsubscribed", - * the user SHOULD acknowledge receipt of that subscription state - * notification by sending a presence stanza of type "unsubscribe" - * this step lets the user's server know that it MUST no longer - * send notification of the subscription state change to the user. - * Parameters: - * (String) jid - The Jabber ID of the user who is unsubscribing - */ + * the user SHOULD acknowledge receipt of that subscription state + * notification by sending a presence stanza of type "unsubscribe" + * this step lets the user's server know that it MUST no longer + * send notification of the subscription state change to the user. + * Parameters: + * (String) jid - The Jabber ID of the user who is unsubscribing + */ _converse.api.send($pres({ 'type': 'unsubscribe', 'to': this.get('jid') @@ -77140,9 +77147,9 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins authorize(message) { /* Authorize presence subscription - * Parameters: - * (String) message - Optional message to send to the person being authorized - */ + * Parameters: + * (String) message - Optional message to send to the person being authorized + */ const pres = $pres({ 'to': this.get('jid'), 'type': "subscribed" @@ -77157,11 +77164,11 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins return this; }, - removeFromRoster(callback, errback) { + removeFromRoster() { /* Instruct the XMPP server to remove this contact from our roster - * Parameters: - * (Function) callback - */ + * Parameters: + * (Function) callback + */ const iq = $iq({ type: 'set' }).c('query', { @@ -77170,10 +77177,7 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins jid: this.get('jid'), subscription: "remove" }); - - _converse.api.sendIQ(iq).then(callback).catch(errback); - - return this; + return _converse.api.sendIQ(iq); } }); @@ -77319,7 +77323,7 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins _.each(groups, group => iq.c('group').t(group).up()); - _converse.api.sendIQ(iq); + return _converse.api.sendIQ(iq); }, async addContactToRoster(jid, name, groups, attributes) { diff --git a/src/converse-rosterview.js b/src/converse-rosterview.js index 44ca14a40..03ae7e5c6 100644 --- a/src/converse-rosterview.js +++ b/src/converse-rosterview.js @@ -513,32 +513,38 @@ converse.plugins.add('converse-rosterview', { _converse.api.chats.open(attrs.jid, attrs); }, - removeContact (ev) { + async removeContact (ev) { if (ev && ev.preventDefault) { ev.preventDefault(); } if (!_converse.allow_contact_removal) { return; } - const result = confirm(__("Are you sure you want to remove this contact?")); - if (result === true) { - this.model.removeFromRoster( - (iq) => { - this.model.destroy(); - this.remove(); - }, - function (err) { - alert(__('Sorry, there was an error while trying to remove %1$s as a contact.', name)); - _converse.log(err, Strophe.LogLevel.ERROR); - } + if (!confirm(__("Are you sure you want to remove this contact?"))) { return; } + + let iq; + try { + iq = await this.model.removeFromRoster(); + this.remove(); + if (this.model.collection) { + // The model might have already been removed as + // result of a roster push. + this.model.destroy(); + } + } catch (e) { + _converse.log(e, Strophe.LogLevel.ERROR); + _converse.api.alert.show( + Strophe.LogLevel.ERROR, + __('Sorry, there was an error while trying to remove %1$s as a contact.', name) ); } }, - acceptRequest (ev) { + async acceptRequest (ev) { if (ev && ev.preventDefault) { ev.preventDefault(); } - _converse.roster.sendContactAddIQ( + + await _converse.roster.sendContactAddIQ( this.model.get('jid'), this.model.getFullname(), - [], - () => { this.model.authorize().subscribe(); } + [] ); + this.model.authorize().subscribe(); }, declineRequest (ev) { diff --git a/src/headless/converse-roster.js b/src/headless/converse-roster.js index e3e25fef4..16690a4a7 100644 --- a/src/headless/converse-roster.js +++ b/src/headless/converse-roster.js @@ -288,13 +288,13 @@ converse.plugins.add('converse-roster', { ackUnsubscribe () { /* Upon receiving the presence stanza of type "unsubscribed", - * the user SHOULD acknowledge receipt of that subscription state - * notification by sending a presence stanza of type "unsubscribe" - * this step lets the user's server know that it MUST no longer - * send notification of the subscription state change to the user. - * Parameters: - * (String) jid - The Jabber ID of the user who is unsubscribing - */ + * the user SHOULD acknowledge receipt of that subscription state + * notification by sending a presence stanza of type "unsubscribe" + * this step lets the user's server know that it MUST no longer + * send notification of the subscription state change to the user. + * Parameters: + * (String) jid - The Jabber ID of the user who is unsubscribing + */ _converse.api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')})); this.removeFromRoster(); this.destroy(); @@ -311,9 +311,9 @@ converse.plugins.add('converse-roster', { authorize (message) { /* Authorize presence subscription - * Parameters: - * (String) message - Optional message to send to the person being authorized - */ + * Parameters: + * (String) message - Optional message to send to the person being authorized + */ const pres = $pres({'to': this.get('jid'), 'type': "subscribed"}); if (message && message !== "") { pres.c("status").t(message); @@ -322,16 +322,15 @@ converse.plugins.add('converse-roster', { return this; }, - removeFromRoster (callback, errback) { + removeFromRoster () { /* Instruct the XMPP server to remove this contact from our roster - * Parameters: - * (Function) callback - */ + * Parameters: + * (Function) callback + */ const iq = $iq({type: 'set'}) .c('query', {xmlns: Strophe.NS.ROSTER}) .c('item', {jid: this.get('jid'), subscription: "remove"}); - _converse.api.sendIQ(iq).then(callback).catch(errback); - return this; + return _converse.api.sendIQ(iq); } }); @@ -365,7 +364,7 @@ converse.plugins.add('converse-roster', { /* Register a handler for roster IQ "set" stanzas, which update * roster contacts. */ - _converse.connection.addHandler((iq) => { + _converse.connection.addHandler(iq => { _converse.roster.onRosterPush(iq); return true; }, Strophe.NS.ROSTER, 'iq', "set"); @@ -470,7 +469,7 @@ converse.plugins.add('converse-roster', { .c('query', {'xmlns': Strophe.NS.ROSTER}) .c('item', { jid, name }); _.each(groups, group => iq.c('group').t(group).up()); - _converse.api.sendIQ(iq); + return _converse.api.sendIQ(iq); }, async addContactToRoster (jid, name, groups, attributes) {