ソースを参照

Merge branch 'master' into bootstrap4

JC Brand 7 年 前
コミット
224e1eee29
6 ファイル変更71 行追加50 行削除
  1. 2 0
      CHANGES.md
  2. 27 31
      src/converse-bookmarks.js
  3. 3 0
      src/converse-core.js
  4. 0 6
      src/converse-minimize.js
  5. 17 13
      src/converse-roomslist.js
  6. 22 0
      src/utils.js

+ 2 - 0
CHANGES.md

@@ -12,6 +12,8 @@
 
 - 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)

+ 27 - 31
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));
                     }
                 },
@@ -533,41 +532,38 @@
                 }
             });
 
+            _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.bookmarks.fetchBookmarks().then(() => {
-                        _converse.bookmarksview = new _converse.BookmarksView(
-                            {'model': _converse.bookmarks}
-                        );
-                    }).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR))
-                      .then(() => {
-                          _converse.emit('bookmarksInitialized');
-                      });
-                }).catch((e) => {
-                    _converse.log(e, Strophe.LogLevel.ERROR);
-                    _converse.emit('bookmarksInitialized');
                 });
-            };
+            }
 
-            Promise.all([
-                _converse.api.waitUntil('chatBoxesFetched'),
-                _converse.api.waitUntil('roomsPanelRendered')
-            ]).then(initBookmarks)
-              .catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
+            u.onMultipleEvents([
+                    {'object': _converse, 'event': 'chatBoxesFetched'},
+                    {'object': _converse, 'event': 'roomsPanelRendered'}
+                ], initBookmarks);
 
             _converse.on('reconnected', initBookmarks);
 

+ 3 - 0
src/converse-core.js

@@ -658,6 +658,9 @@
             } else {
                 _converse._tearDown();
             }
+            // Recreate all the promises
+            _.each(_.keys(_converse.promises), addPromise);
+
             _converse.emit('logout');
         };
 

+ 0 - 6
src/converse-minimize.js

@@ -522,7 +522,6 @@
                 const new_html = tpl_chatbox_minimize(
                     {info_minimize: __('Minimize this chat box')}
                 );
-
                 const el = view.el.querySelector('.toggle-chatbox-button');
                 if (el) {
                     el.outerHTML = new_html;
@@ -539,11 +538,6 @@
                     _converse.chatboxviews.trimChats(chatbox);
                 }
             });
-
-            const logOut = function () {
-                _converse.minimized_chats.remove();
-            };
-            _converse.on('logout', logOut);
         }
     });
 }));

+ 17 - 13
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'),
@@ -248,18 +252,18 @@
                 );
             };
 
-            Promise.all([
-                _converse.api.waitUntil('chatBoxesFetched'),
-                _converse.api.waitUntil('roomsPanelRendered')
-            ]).then(() => {
-                if (_converse.allow_bookmarks) {
-                    _converse.api.waitUntil('bookmarksInitialized').then(
-                        initRoomsListView
-                    );
-                } else {
-                    initRoomsListView();
-                }
-            });
+            if (_converse.allow_bookmarks) {
+                u.onMultipleEvents([
+                        {'object': _converse, 'event': 'chatBoxesFetched'},
+                        {'object': _converse, 'event': 'roomsPanelRendered'},
+                        {'object': _converse, 'event': 'bookmarksInitialized'}
+                    ], initRoomsListView);
+            } else {
+                u.onMultipleEvents([
+                        {'object': _converse, 'event': 'chatBoxesFetched'},
+                        {'object': _converse, 'event': 'roomsPanelRendered'}
+                    ], initRoomsListView);
+            }
 
             _converse.api.listen.on('reconnected', initRoomsListView);
         }

+ 22 - 0
src/utils.js

@@ -662,6 +662,28 @@
             });
     };
 
+    u.onMultipleEvents = function (events=[], callback) {
+        /* Call the callback once all the events have been triggered
+         *
+         * Parameters:
+         *  (Array) events: An array of objects, with keys `object` and
+         *      `event`, representing the event name and the object it's
+         *      triggered upon.
+         *  (Function) callback: The function to call once all events have
+         *      been triggered.
+         */
+        let triggered = [];
+
+        function handler (result) {
+            triggered.push(result)
+            if (events.length === triggered.length) {
+                callback(triggered);
+                triggered = [];
+            }
+        }
+        _.each(events, (map) => map.object.on(map.event, handler));
+    };
+
     u.safeSave = function (model, attributes) {
         if (u.isPersistableModel(model)) {
             model.save(attributes);