Forráskód Böngészése

Fixes #1140 Add support for destroyed chatrooms

JC Brand 6 éve
szülő
commit
dffcc13dea

+ 1 - 0
CHANGES.md

@@ -5,6 +5,7 @@
 - Bugfix. Handler not triggered when submitting MUC password form 2nd time
 - Bugfix. Handler not triggered when submitting MUC password form 2nd time
 - Bugfix. MUC features weren't being refreshed when saving the config form
 - Bugfix. MUC features weren't being refreshed when saving the config form
 - #1063 URLs in the topic / subject are not clickable
 - #1063 URLs in the topic / subject are not clickable
+- #1140 Add support for destroyed chatrooms
 - #1190 MUC Participants column disappears in certain viewport widths
 - #1190 MUC Participants column disappears in certain viewport widths
 - #1199 Can't get back from to login screen from registration screen
 - #1199 Can't get back from to login screen from registration screen
 - #1204 Link encoding issue
 - #1204 Link encoding issue

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/converse.js


+ 33 - 0
spec/chatroom.js

@@ -1245,6 +1245,39 @@
                 }).catch(_.partial(console.error, _));
                 }).catch(_.partial(console.error, _));
             }));
             }));
 
 
+            it("properly handles notification that a room has been destroyed",
+                mock.initConverseWithPromises(
+                    null, ['rosterGroupsFetched'], {},
+                    function (done, _converse) {
+
+                test_utils.openChatRoomViaModal(_converse, 'problematic@muc.localhost', 'dummy')
+                .then(function () {
+                    const presence = $pres().attrs({
+                        from:'problematic@muc.localhost',
+                        id:'n13mt3l',
+                        to:'dummy@localhost/pda',
+                        type:'error'})
+                    .c('error').attrs({'type':'cancel'})
+                        .c('gone').attrs({'xmlns':'urn:ietf:params:xml:ns:xmpp-stanzas'})
+                            .t('xmpp:other-room@chat.jabberfr.org?join').up()
+                        .c('text').attrs({'xmlns':'urn:ietf:params:xml:ns:xmpp-stanzas'})
+                            .t("We didn't like the name").nodeTree;
+
+                    const view = _converse.chatboxviews.get('problematic@muc.localhost');
+                    spyOn(view, 'showErrorMessage').and.callThrough();
+                    _converse.connection._dataRecv(test_utils.createRequest(presence));
+                    expect(view.el.querySelector('.chatroom-body .disconnect-msg').textContent)
+                        .toBe('This room no longer exists');
+                    expect(view.el.querySelector('.chatroom-body .destroyed-reason').textContent)
+                        .toBe(`"We didn't like the name"`);
+                    expect(view.el.querySelector('.chatroom-body .moved-label').textContent.trim())
+                        .toBe('The conversation has moved. Click below to enter.');
+                    expect(view.el.querySelector('.chatroom-body .moved-link').textContent.trim())
+                        .toBe(`other-room@chat.jabberfr.org`);
+                    done();
+                }).catch(_.partial(console.error, _));
+            }));
+
             it("will use the user's reserved nickname, if it exists",
             it("will use the user's reserved nickname, if it exists",
                     mock.initConverseWithPromises(
                     mock.initConverseWithPromises(
                         null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                         null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},

+ 42 - 0
src/converse-muc-views.js

@@ -14,6 +14,7 @@
         "templates/chatarea.html",
         "templates/chatarea.html",
         "templates/chatroom.html",
         "templates/chatroom.html",
         "templates/chatroom_details_modal.html",
         "templates/chatroom_details_modal.html",
+        "templates/chatroom_destroyed.html",
         "templates/chatroom_disconnect.html",
         "templates/chatroom_disconnect.html",
         "templates/chatroom_features.html",
         "templates/chatroom_features.html",
         "templates/chatroom_form.html",
         "templates/chatroom_form.html",
@@ -42,6 +43,7 @@
     tpl_chatarea,
     tpl_chatarea,
     tpl_chatroom,
     tpl_chatroom,
     tpl_chatroom_details_modal,
     tpl_chatroom_details_modal,
+    tpl_chatroom_destroyed,
     tpl_chatroom_disconnect,
     tpl_chatroom_disconnect,
     tpl_chatroom_features,
     tpl_chatroom_features,
     tpl_chatroom_form,
     tpl_chatroom_form,
@@ -530,6 +532,7 @@
 
 
                     this.model.on('change:affiliation', this.renderHeading, this);
                     this.model.on('change:affiliation', this.renderHeading, this);
                     this.model.on('change:connection_status', this.afterConnected, this);
                     this.model.on('change:connection_status', this.afterConnected, this);
+                    this.model.on('change:jid', this.renderHeading, this);
                     this.model.on('change:name', this.renderHeading, this);
                     this.model.on('change:name', this.renderHeading, this);
                     this.model.on('change:subject', this.renderHeading, this);
                     this.model.on('change:subject', this.renderHeading, this);
                     this.model.on('change:subject', this.setChatRoomSubject, this);
                     this.model.on('change:subject', this.setChatRoomSubject, this);
@@ -547,7 +550,11 @@
                     this.createOccupantsView();
                     this.createOccupantsView();
                     this.render().insertIntoDOM();
                     this.render().insertIntoDOM();
                     this.registerHandlers();
                     this.registerHandlers();
+                    this.enterRoom();
+                },
 
 
+                enterRoom (ev) {
+                    if (ev) { ev.preventDefault(); }
                     if (this.model.get('connection_status') !==  converse.ROOMSTATUS.ENTERED) {
                     if (this.model.get('connection_status') !==  converse.ROOMSTATUS.ENTERED) {
                         const handler = () => {
                         const handler = () => {
                             if (!u.isPersistableModel(this.model)) {
                             if (!u.isPersistableModel(this.model)) {
@@ -1316,6 +1323,39 @@
                         .addEventListener('submit', ev => this.submitPassword(ev), false);
                         .addEventListener('submit', ev => this.submitPassword(ev), false);
                 },
                 },
 
 
+                showDestroyedMessage (error) {
+                    u.hideElement(this.el.querySelector('.chat-area'));
+                    u.hideElement(this.el.querySelector('.occupants'));
+                    _.each(this.el.querySelectorAll('.spinner'), u.removeElement);
+                    const container = this.el.querySelector('.disconnect-container');
+                    const moved_jid = _.get(
+                            sizzle('gone[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]', error).pop(),
+                            'textContent'
+                        ).replace(/^xmpp:/, '').replace(/\?join$/, '');
+                    const reason = _.get(
+                            sizzle('text[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]', error).pop(),
+                            'textContent'
+                        );
+                    container.innerHTML = tpl_chatroom_destroyed({
+                        '_': _,
+                        '__':__,
+                        'jid': moved_jid,
+                        'reason': reason ? `"${reason}"` : null
+                    });
+
+                    const switch_el = container.querySelector('a.switch-chat');
+                    if (switch_el) {
+                        switch_el.addEventListener('click', ev => {
+                            ev.preventDefault();
+                            this.model.save('jid', moved_jid);
+                            container.innerHTML = '';
+                            this.showSpinner();
+                            this.enterRoom();
+                        });
+                    }
+                    u.showElement(container);
+                },
+
                 showDisconnectMessages (msgs) {
                 showDisconnectMessages (msgs) {
                     if (_.isString(msgs)) {
                     if (_.isString(msgs)) {
                         msgs = [msgs];
                         msgs = [msgs];
@@ -1585,6 +1625,8 @@
                             this.showDisconnectMessages(__('You are not allowed to create new groupchats.'));
                             this.showDisconnectMessages(__('You are not allowed to create new groupchats.'));
                         } else if (!_.isNull(error.querySelector('not-acceptable'))) {
                         } else if (!_.isNull(error.querySelector('not-acceptable'))) {
                             this.showDisconnectMessages(__("Your nickname doesn't conform to this groupchat's policies."));
                             this.showDisconnectMessages(__("Your nickname doesn't conform to this groupchat's policies."));
+                        } else if (sizzle('gone[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]', error).length) {
+                            this.showDestroyedMessage(error);
                         } else if (!_.isNull(error.querySelector('conflict'))) {
                         } else if (!_.isNull(error.querySelector('conflict'))) {
                             this.onNicknameClash(presence);
                             this.onNicknameClash(presence);
                         } else if (!_.isNull(error.querySelector('item-not-found'))) {
                         } else if (!_.isNull(error.querySelector('item-not-found'))) {

+ 12 - 0
src/templates/chatroom_destroyed.html

@@ -0,0 +1,12 @@
+<div class="alert alert-danger">
+    <h3 class="alert-heading disconnect-msg">{{{o.__('This room no longer exists')}}}</h3>
+
+    <p class="destroyed-reason">{{{o.reason}}}</p>
+
+    {[ if (o.jid) { ]}
+    <p class="moved-label">
+        {{{o.__('The conversation has moved. Click below to enter.') }}}
+    </p>
+    <p class="moved-link"><a class="switch-chat" href="#">{{{o.jid}}}</a></p>
+    {[ } ]}
+</div>

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott