diff --git a/package.json b/package.json index 08bdf6371..ab40c8d4f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "converse.js", - "version": "5.0.4", + "version": "6.0.0", "description": "Browser based XMPP chat client", "browser": "dist/converse.js", "module": "src/converse.js", diff --git a/src/converse-message-view.js b/src/converse-message-view.js index f85d8c9f0..edcd56026 100644 --- a/src/converse-message-view.js +++ b/src/converse-message-view.js @@ -247,7 +247,7 @@ converse.plugins.add('converse-message-view', { const is_own_message = this.model.get('sender') === 'me'; const chatbox = this.model.collection.chatbox; const may_retract_own_message = is_own_message && ['all', 'own'].includes(_converse.allow_message_retraction); - const may_moderate_message = is_groupchat && + const may_moderate_message = !is_own_message && is_groupchat && ['all', 'moderator'].includes(_converse.allow_message_retraction) && await chatbox.canRetractMessages(); @@ -306,22 +306,19 @@ converse.plugins.add('converse-message-view', { }, getRetractionText () { - const username = this.model.getDisplayName(); - let retraction_text = __('%1$s has retracted this message', username); - if (this.model.get('type') === 'groupchat') { + if (this.model.get('type') === 'groupchat' && this.model.get('moderated_by')) { const retracted_by_mod = this.model.get('moderated_by'); - if (retracted_by_mod) { - const chatbox = this.model.collection.chatbox; - if (!this.model.mod) { - this.model.mod = - chatbox.occupants.findOccupant({'jid': retracted_by_mod}) || - chatbox.occupants.findOccupant({'nick': Strophe.getResourceFromJid(retracted_by_mod)}); - } - const modname = this.model.mod ? this.model.mod.getDisplayName() : 'A moderator'; - retraction_text = __('%1$s has retracted this message from %2$s', modname , username); + const chatbox = this.model.collection.chatbox; + if (!this.model.mod) { + this.model.mod = + chatbox.occupants.findOccupant({'jid': retracted_by_mod}) || + chatbox.occupants.findOccupant({'nick': Strophe.getResourceFromJid(retracted_by_mod)}); } + const modname = this.model.mod ? this.model.mod.getDisplayName() : 'A moderator'; + return __('%1$s has retracted this message', modname); + } else { + return __('%1$s has retracted this message', this.model.getDisplayName()); } - return retraction_text; }, renderErrorMessage () { diff --git a/src/headless/converse-chat.js b/src/headless/converse-chat.js index 8b421e2ff..17205b2d5 100644 --- a/src/headless/converse-chat.js +++ b/src/headless/converse-chat.js @@ -582,7 +582,7 @@ converse.plugins.add('converse-chat', { * whether a message was retracted or not. */ handleRetraction (attrs) { - const RETRACTION_ATTRIBUTES = ['retracted', 'retracted_id']; + const RETRACTION_ATTRIBUTES = ['retracted', 'retracted_id', 'editable']; if (attrs.retracted) { if (attrs.is_tombstone) { return false; @@ -877,7 +877,7 @@ converse.plugins.add('converse-chat', { return; } if (_converse.allow_message_corrections === 'all') { - attrs.editable = !(attrs.file || 'oob_url' in attrs); + attrs.editable = !(attrs.file || attrs.retracted || 'oob_url' in attrs); } else if ((_converse.allow_message_corrections === 'last') && (send_time > this.get('time_sent'))) { this.set({'time_sent': send_time}); @@ -885,7 +885,7 @@ converse.plugins.add('converse-chat', { if (msg) { msg.save({'editable': false}); } - attrs.editable = !(attrs.file || 'oob_url' in attrs); + attrs.editable = !(attrs.file || attrs.retracted || 'oob_url' in attrs); } }, diff --git a/src/headless/converse-muc.js b/src/headless/converse-muc.js index 5026949f4..ea5685aeb 100644 --- a/src/headless/converse-muc.js +++ b/src/headless/converse-muc.js @@ -9,6 +9,7 @@ * @description * Implements the non-view logic for XEP-0045 Multi-User Chat */ +import "./converse-chat"; import "./converse-disco"; import "./converse-emoji"; import { clone, get, intersection, invoke, isElement, isObject, isString, pick, uniq, zipObject } from "lodash"; diff --git a/src/headless/utils/stanza.js b/src/headless/utils/stanza.js index 5a6c11fbd..6429929ca 100644 --- a/src/headless/utils/stanza.js +++ b/src/headless/utils/stanza.js @@ -130,6 +130,7 @@ const stanza_utils = { const delay = sizzle(`delay[xmlns="${Strophe.NS.DELAY}"]`, original_stanza).pop(); const time = delay ? dayjs(delay.getAttribute('stamp')).toISOString() : (new Date()).toISOString(); return { + 'editable': false, 'retracted': time, 'retracted_id': applies_to_id } @@ -138,8 +139,9 @@ const stanza_utils = { const tombstone = sizzle(`> retracted[xmlns="${Strophe.NS.RETRACT}"]`, stanza).pop(); if (tombstone) { return { - 'retracted': tombstone.getAttribute('stamp'), - 'is_tombstone': true + 'editable': false, + 'is_tombstone': true, + 'retracted': tombstone.getAttribute('stamp') } } }