Commit dffcc13d authored by JC Brand's avatar JC Brand

Fixes #1140 Add support for destroyed chatrooms

parent 7cc59b9e
...@@ -5,6 +5,7 @@ ...@@ -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
......
This diff is collapsed.
...@@ -1245,6 +1245,39 @@ ...@@ -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'], {},
......
...@@ -14,6 +14,7 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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'))) {
......
<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>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment