Avoid showing notification messages twice
For example `This groupchat is not anonymous`
This commit is contained in:
parent
f5686a5093
commit
d77802da86
|
@ -4,6 +4,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
|
||||||
|
- Don't show duplicate notification messages
|
||||||
- #537 Render `xmpp:` URI as link
|
- #537 Render `xmpp:` URI as link
|
||||||
- #1062 Collapse multiple join/leave messages into one
|
- #1062 Collapse multiple join/leave messages into one
|
||||||
- #1063 URLs in the topic / subject are not clickable
|
- #1063 URLs in the topic / subject are not clickable
|
||||||
|
|
20
dist/converse.js
vendored
20
dist/converse.js
vendored
|
@ -69899,6 +69899,24 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getNotificationWithMessage(message) {
|
||||||
|
let el = this.content.lastElementChild;
|
||||||
|
|
||||||
|
while (!_.isNil(el)) {
|
||||||
|
const data = _.get(el, 'dataset', {});
|
||||||
|
|
||||||
|
if (!_.includes(_.get(el, 'classList', []), 'chat-info')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (el.textContent === message) {
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
|
||||||
|
el = el.previousElementSibling;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
parseXUserElement(x, stanza, is_self) {
|
parseXUserElement(x, stanza, is_self) {
|
||||||
/* Parse the passed-in <x xmlns='http://jabber.org/protocol/muc#user'>
|
/* Parse the passed-in <x xmlns='http://jabber.org/protocol/muc#user'>
|
||||||
* element and construct a map containing relevant
|
* element and construct a map containing relevant
|
||||||
|
@ -69911,7 +69929,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
|
||||||
|
|
||||||
const notification = {};
|
const notification = {};
|
||||||
|
|
||||||
const messages = _.reject(_.map(statuses, mapper), _.isUndefined);
|
const messages = _.reject(_.reject(_.map(statuses, mapper), _.isUndefined), message => this.getNotificationWithMessage(message));
|
||||||
|
|
||||||
if (messages.length) {
|
if (messages.length) {
|
||||||
notification.messages = messages;
|
notification.messages = messages;
|
||||||
|
|
|
@ -411,6 +411,67 @@
|
||||||
|
|
||||||
describe("A Groupchat", function () {
|
describe("A Groupchat", function () {
|
||||||
|
|
||||||
|
it("shows a notification if its not anonymous",
|
||||||
|
mock.initConverseWithPromises(
|
||||||
|
null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
|
||||||
|
function (done, _converse) {
|
||||||
|
|
||||||
|
test_utils.openChatRoom(_converse, "coven", 'chat.shakespeare.lit', 'some1')
|
||||||
|
.then(() => {
|
||||||
|
const view = _converse.chatboxviews.get('coven@chat.shakespeare.lit');
|
||||||
|
const chat_content = view.el.querySelector('.chat-content');
|
||||||
|
/* <presence to="dummy@localhost/_converse.js-29092160"
|
||||||
|
* from="coven@chat.shakespeare.lit/some1">
|
||||||
|
* <x xmlns="http://jabber.org/protocol/muc#user">
|
||||||
|
* <item affiliation="owner" jid="dummy@localhost/_converse.js-29092160" role="moderator"/>
|
||||||
|
* <status code="110"/>
|
||||||
|
* <status code="100"/>
|
||||||
|
* </x>
|
||||||
|
* </presence></body>
|
||||||
|
*/
|
||||||
|
let presence = $pres({
|
||||||
|
to: 'dummy@localhost/resource',
|
||||||
|
from: 'coven@chat.shakespeare.lit/some1'
|
||||||
|
}).c('x', {xmlns: Strophe.NS.MUC_USER})
|
||||||
|
.c('item', {
|
||||||
|
'affiliation': 'owner',
|
||||||
|
'jid': 'dummy@localhost/_converse.js-29092160',
|
||||||
|
'role': 'moderator'
|
||||||
|
}).up()
|
||||||
|
.c('status', {code: '110'}).up()
|
||||||
|
.c('status', {code: '100'});
|
||||||
|
|
||||||
|
_converse.connection._dataRecv(test_utils.createRequest(presence));
|
||||||
|
expect(chat_content.querySelectorAll('.chat-info').length).toBe(2);
|
||||||
|
expect(sizzle('div.chat-info:first', chat_content).pop().textContent)
|
||||||
|
.toBe("This groupchat is not anonymous");
|
||||||
|
expect(sizzle('div.chat-info:last', chat_content).pop().textContent)
|
||||||
|
.toBe("some1 has entered the groupchat");
|
||||||
|
|
||||||
|
// Check that we don't show the notification twice
|
||||||
|
presence = $pres({
|
||||||
|
to: 'dummy@localhost/resource',
|
||||||
|
from: 'coven@chat.shakespeare.lit/some1'
|
||||||
|
}).c('x', {xmlns: Strophe.NS.MUC_USER})
|
||||||
|
.c('item', {
|
||||||
|
'affiliation': 'owner',
|
||||||
|
'jid': 'dummy@localhost/_converse.js-29092160',
|
||||||
|
'role': 'moderator'
|
||||||
|
}).up()
|
||||||
|
.c('status', {code: '110'}).up()
|
||||||
|
.c('status', {code: '100'});
|
||||||
|
_converse.connection._dataRecv(test_utils.createRequest(presence));
|
||||||
|
expect(chat_content.querySelectorAll('.chat-info').length).toBe(2);
|
||||||
|
expect(sizzle('div.chat-info:first', chat_content).pop().textContent)
|
||||||
|
.toBe("This groupchat is not anonymous");
|
||||||
|
expect(sizzle('div.chat-info:last', chat_content).pop().textContent)
|
||||||
|
.toBe("some1 has entered the groupchat");
|
||||||
|
|
||||||
|
done();
|
||||||
|
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL))
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
it("shows join/leave messages when users enter or exit a groupchat",
|
it("shows join/leave messages when users enter or exit a groupchat",
|
||||||
mock.initConverseWithPromises(
|
mock.initConverseWithPromises(
|
||||||
null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
|
null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
|
||||||
|
|
|
@ -1400,6 +1400,20 @@
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getNotificationWithMessage (message) {
|
||||||
|
let el = this.content.lastElementChild;
|
||||||
|
while (!_.isNil(el)) {
|
||||||
|
const data = _.get(el, 'dataset', {});
|
||||||
|
if (!_.includes(_.get(el, 'classList', []), 'chat-info')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (el.textContent === message) {
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
el = el.previousElementSibling;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
parseXUserElement (x, stanza, is_self) {
|
parseXUserElement (x, stanza, is_self) {
|
||||||
/* Parse the passed-in <x xmlns='http://jabber.org/protocol/muc#user'>
|
/* Parse the passed-in <x xmlns='http://jabber.org/protocol/muc#user'>
|
||||||
* element and construct a map containing relevant
|
* element and construct a map containing relevant
|
||||||
|
@ -1409,7 +1423,10 @@
|
||||||
const statuses = x.querySelectorAll('status');
|
const statuses = x.querySelectorAll('status');
|
||||||
const mapper = _.partial(this.getMessageFromStatus, _, stanza, is_self);
|
const mapper = _.partial(this.getMessageFromStatus, _, stanza, is_self);
|
||||||
const notification = {};
|
const notification = {};
|
||||||
const messages = _.reject(_.map(statuses, mapper), _.isUndefined);
|
const messages = _.reject(
|
||||||
|
_.reject(_.map(statuses, mapper), _.isUndefined),
|
||||||
|
message => this.getNotificationWithMessage(message)
|
||||||
|
);
|
||||||
if (messages.length) {
|
if (messages.length) {
|
||||||
notification.messages = messages;
|
notification.messages = messages;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user