Bugfix. Don't create view for chat which fails validation

Use-case is when an invalid MUC gets opened in singleton mode.
Without this fix a new chat with spinner appears, even though it
shouldn't.
This commit is contained in:
JC Brand 2019-06-05 14:43:59 +02:00
parent a656750459
commit 789b47ddb3
3 changed files with 34 additions and 12 deletions

View File

@ -2152,6 +2152,7 @@ converse.plugins.add('converse-muc-views', {
} }
} }
/************************ BEGIN Event Handlers ************************/ /************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxViewsInitialized', () => { _converse.api.listen.on('chatBoxViewsInitialized', () => {
@ -2161,12 +2162,16 @@ converse.plugins.add('converse-muc-views', {
} }
_converse.chatboxviews.delegate('click', 'a.open-chatroom', openChatRoomFromURIClicked); _converse.chatboxviews.delegate('click', 'a.open-chatroom', openChatRoomFromURIClicked);
const that = _converse.chatboxviews; function addView (model) {
_converse.chatboxes.on('add', item => { const views = _converse.chatboxviews;
if (!that.get(item.get('id')) && item.get('type') === _converse.CHATROOMS_TYPE) { if (!views.get(model.get('id')) &&
return that.add(item.get('id'), new _converse.ChatRoomView({'model': item})); model.get('type') === _converse.CHATROOMS_TYPE &&
model.isValid()
) {
return views.add(model.get('id'), new _converse.ChatRoomView({'model': model}));
} }
}); }
_converse.chatboxes.on('add', addView);
}); });
_converse.api.listen.on('clearSession', () => { _converse.api.listen.on('clearSession', () => {

View File

@ -372,9 +372,12 @@ converse.plugins.add('converse-chatboxes', {
if (!attrs.jid) { if (!attrs.jid) {
return 'Ignored ChatBox without JID'; return 'Ignored ChatBox without JID';
} }
const auto_join = _converse.auto_join_private_chats.concat(_converse.auto_join_rooms); const room_jids = _converse.auto_join_rooms.map(s => _.isObject(s) ? s.jid : s);
const auto_join = _converse.auto_join_private_chats.concat(room_jids);
if (_converse.singleton && !_.includes(auto_join, attrs.jid)) { if (_converse.singleton && !_.includes(auto_join, attrs.jid)) {
return "Ignored ChatBox that's not being auto joined in singleton mode"; const msg = `${attrs.jid} is not allowed because singleton is true and it's not being auto_joined`;
_converse.log(msg, Strophe.LogLevel.WARN);
return msg;
} }
}, },
@ -1119,6 +1122,10 @@ converse.plugins.add('converse-chatboxes', {
_converse.log(response.responseText); _converse.log(response.responseText);
} }
}); });
if (!chatbox.isValid()) {
chatbox.destroy();
return null;
}
} }
return chatbox; return chatbox;
} }
@ -1269,9 +1276,15 @@ converse.plugins.add('converse-chatboxes', {
if (_.isString(jids)) { if (_.isString(jids)) {
const chat = await _converse.api.chats.create(jids, attrs); const chat = await _converse.api.chats.create(jids, attrs);
return chat.maybeShow(force); if (chat) {
return chat.maybeShow(force);
}
return chat;
} else if (Array.isArray(jids)) { } else if (Array.isArray(jids)) {
return Promise.all(jids.map(j => _converse.api.chats.create(j, attrs).then(c => c.maybeShow(force)))); return Promise.all(
jids.map(j => _converse.api.chats.create(j, attrs).then(c => c ? c.maybeShow(force) : null))
.filter(c => c)
);
} }
const err_msg = "chats.open: You need to provide at least one JID"; const err_msg = "chats.open: You need to provide at least one JID";
_converse.log(err_msg, Strophe.LogLevel.ERROR); _converse.log(err_msg, Strophe.LogLevel.ERROR);

View File

@ -1837,14 +1837,18 @@ converse.plugins.add('converse-muc', {
* } * }
* ); * );
*/ */
'open': async function (jids, attrs, force=false) { async open (jids, attrs, force=false) {
await _converse.api.waitUntil('chatBoxesFetched'); await _converse.api.waitUntil('chatBoxesFetched');
if (_.isUndefined(jids)) { if (_.isUndefined(jids)) {
const err_msg = 'rooms.open: You need to provide at least one JID'; const err_msg = 'rooms.open: You need to provide at least one JID';
_converse.log(err_msg, Strophe.LogLevel.ERROR); _converse.log(err_msg, Strophe.LogLevel.ERROR);
throw(new TypeError(err_msg)); throw(new TypeError(err_msg));
} else if (_.isString(jids)) { } else if (_.isString(jids)) {
return _converse.api.rooms.create(jids, attrs).maybeShow(force); const room = _converse.api.rooms.create(jids, attrs);
if (room) {
room.maybeShow(force);
}
return room;
} else { } else {
return _.map(jids, jid => _converse.api.rooms.create(jid, attrs).maybeShow(force)); return _.map(jids, jid => _converse.api.rooms.create(jid, attrs).maybeShow(force));
} }
@ -1873,7 +1877,7 @@ converse.plugins.add('converse-muc', {
* ) * )
* }); * });
*/ */
'get' (jids, attrs, create) { get (jids, attrs, create) {
if (_.isString(attrs)) { if (_.isString(attrs)) {
attrs = {'nick': attrs}; attrs = {'nick': attrs};
} else if (_.isUndefined(attrs)) { } else if (_.isUndefined(attrs)) {