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

View File

@ -372,9 +372,12 @@ converse.plugins.add('converse-chatboxes', {
if (!attrs.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)) {
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);
}
});
if (!chatbox.isValid()) {
chatbox.destroy();
return null;
}
}
return chatbox;
}
@ -1269,9 +1276,15 @@ converse.plugins.add('converse-chatboxes', {
if (_.isString(jids)) {
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)) {
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";
_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');
if (_.isUndefined(jids)) {
const err_msg = 'rooms.open: You need to provide at least one JID';
_converse.log(err_msg, Strophe.LogLevel.ERROR);
throw(new TypeError(err_msg));
} 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 {
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)) {
attrs = {'nick': attrs};
} else if (_.isUndefined(attrs)) {