diff --git a/converse.js b/converse.js index 5a17a9ad8..e7c8008f2 100644 --- a/converse.js +++ b/converse.js @@ -3606,6 +3606,8 @@ initialize: function () { this.model.contacts.on("add", this.addContact, this); + this.model.contacts.on("change:subscription", this.onContactSubscriptionChange, this); + this.model.contacts.on("change:requesting", this.onContactRequestChange, this); this.model.contacts.on("change:chat_status", function (contact) { // This might be optimized by instead of first sorting, // finding the correct position in positionContact @@ -3727,13 +3729,26 @@ var cid = contact.get('id'); var in_this_overview = !this.get(cid); if (in_this_group && !in_this_overview) { - this.remove(cid); // Contact has been added to this group + this.model.contacts.remove(cid); } else if (!in_this_group && in_this_overview) { - this.addContact(contact); // Contact has been removed from this group + this.addContact(contact); + } + }, + + onContactSubscriptionChange: function (contact) { + if ((this.model.get('name') === HEADER_PENDING_CONTACTS) && contact.get('subscription') !== 'from') { + this.model.contacts.remove(contact.get('id')); + } + }, + + onContactRequestChange: function (contact) { + if ((this.model.get('name') === HEADER_REQUESTING_CONTACTS) && !contact.get('requesting')) { + this.model.contacts.remove(contact.get('id')); } }, onRemove: function (contact) { + this.remove(contact.get('id')); if (this.model.contacts.length === 0) { this.$el.hide(); } @@ -3931,9 +3946,21 @@ onContactChange: function (contact) { this.updateChatBox(contact).update(); + if (_.has(contact.changed, 'subscription')) { + if (contact.changed.subscription == 'from') { + this.addContactToGroup(contact, HEADER_PENDING_CONTACTS); + } else if (contact.get('subscription') === 'both') { + this.addExistingContact(contact); + } + } + if (_.has(contact.changed, 'subscription')) { + if (contact.changed.requesting == 'true') { + this.addContactToGroup(contact, HEADER_REQUESTING_CONTACTS); + } + } }, - updateChatBox: function (contact, changed) { + updateChatBox: function (contact) { var chatbox = converse.chatboxes.get(contact.get('jid')), changes = {}; if (!chatbox) { @@ -4035,7 +4062,6 @@ if (contact.get('subscription') === 'both' || contact.get('subscription') === 'to') { this.addExistingContact(contact); } else { - (new converse.RosterContactView({model: contact})).render(); if ((contact.get('ask') === 'subscribe') || (contact.get('subscription') === 'from')) { this.addContactToGroup(contact, HEADER_PENDING_CONTACTS); } else if (contact.get('requesting') === true) {