Browse Source

Don't show bookmark toggles when PEP bookmarking not supported by the XMPP server

JC Brand 7 years ago
parent
commit
1e5b6243be
3 changed files with 28 additions and 19 deletions
  1. 1 0
      CHANGES.md
  2. 22 18
      src/converse-bookmarks.js
  3. 5 1
      src/converse-roomslist.js

+ 1 - 0
CHANGES.md

@@ -5,6 +5,7 @@
 - Avoid `eval` (via `_.template` from lodash).
 - Bugfix. Avatars weren't being shown.
 - Bugfix. Bookmarks list and open rooms list weren't recreated after logging in for a 2nd time (without reloading the browser).
+- Don't show bookmark toggles when PEP bookmarking not supported by the XMPP server.
 - Add LibreJS support
 
 ## 3.3.3 (2018-02-14)

+ 22 - 18
src/converse-bookmarks.js

@@ -87,11 +87,10 @@
                     this.__super__.renderHeading.apply(this, arguments);
                     const { _converse } = this.__super__;
                     if (_converse.allow_bookmarks) {
-                        _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then((identity) => {
-                            if (_.isNil(identity)) {
-                                return;
+                        _converse.checkBookmarksSupport().then((supported) => {
+                            if (supported) {
+                                this.renderBookmarkToggle();
                             }
-                            this.renderBookmarkToggle();
                         }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
                     }
                 },
@@ -530,26 +529,31 @@
                 }
             });
 
+            _converse.checkBookmarksSupport = function () {
+                return new Promise((resolve, reject) => {
+                    Promise.all([
+                        _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid),
+                        _converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid)
+                    ]).then((args) => {
+                        resolve(args[0] && (args[1].supported || _converse.allow_public_bookmarks));
+                    });
+                });
+            }
+
             const initBookmarks = function () {
                 if (!_converse.allow_bookmarks) {
                     return;
                 }
-                Promise.all([
-                    _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid),
-                    _converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid)
-                ]).then((args) => {
-                    const identity = args[0],
-                          options_support = args[1];
-
-                    if (_.isNil(identity) || (!options_support.supported && !_converse.allow_public_bookmarks)) {
+                _converse.checkBookmarksSupport().then((supported) => {
+                    if (supported) {
+                        _converse.bookmarks = new _converse.Bookmarks();
+                        _converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks});
+                        _converse.bookmarks.fetchBookmarks()
+                            .catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL))
+                            .then(() => _converse.emit('bookmarksInitialized'));
+                    } else {
                         _converse.emit('bookmarksInitialized');
-                        return;
                     }
-                    _converse.bookmarks = new _converse.Bookmarks();
-                    _converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks});
-                    _converse.bookmarks.fetchBookmarks()
-                        .catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL))
-                        .then(() => _converse.emit('bookmarksInitialized'));
                 });
             }
 

+ 5 - 1
src/converse-roomslist.js

@@ -118,7 +118,11 @@
                 toHTML () {
                     return tpl_rooms_list_item(
                         _.extend(this.model.toJSON(), {
-                            'allow_bookmarks': _converse.allow_bookmarks,
+                            // XXX: By the time this renders, the _converse.bookmarks
+                            // collection should already exist if bookmarks are
+                            // supported by the XMPP server. So we can use it
+                            // as a check for support (other ways of checking are async).
+                            'allow_bookmarks': _converse.allow_bookmarks && _converse.bookmarks,
                             'info_leave_room': __('Leave this room'),
                             'info_remove_bookmark': __('Unbookmark this room'),
                             'info_add_bookmark': __('Bookmark this room'),