From ead8cdbcd681d903f493df7423bab491b53cc9cd Mon Sep 17 00:00:00 2001 From: JC Brand Date: Tue, 18 Feb 2020 16:06:59 +0100 Subject: [PATCH] Retracted moderated message should not be editable. Also, don't set retracted MUC messages as ephemeral, we want to keep on showing them to provide context in a MUC. --- spec/retractions.js | 7 +++++-- src/converse-muc-views.js | 9 +-------- src/headless/converse-muc.js | 36 ++++++++++++++++++++++++++++++++---- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/spec/retractions.js b/spec/retractions.js index c219110de..8270ceeb1 100644 --- a/spec/retractions.js +++ b/spec/retractions.js @@ -424,6 +424,7 @@ expect(view.model.messages.at(0).get('moderated')).toBe('retracted'); expect(view.model.messages.at(0).get('moderation_reason')).toBe(reason); expect(view.model.messages.at(0).get('is_ephemeral')).toBe(false); + expect(view.model.messages.at(0).get('editable')).toBe(false); expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1); const msg_el = view.el.querySelector('.chat-msg--retracted .chat-msg__message'); @@ -571,7 +572,7 @@ const message = view.model.messages.at(0); expect(message.get('retracted')).toBeTruthy(); - expect(message.get('is_ephemeral')).toBeTruthy(); + expect(message.get('is_ephemeral')).toBe(false); expect(message.get('editable')).toBeFalsy(); const stanza_id = message.get(`stanza_id ${muc_jid}`); @@ -591,7 +592,7 @@ expect(view.model.messages.length).toBe(1); expect(view.model.messages.at(0).get('retracted')).toBeTruthy(); - expect(view.model.messages.at(0).get('is_ephemeral')).toBe(true); + expect(view.model.messages.at(0).get('is_ephemeral')).toBe(false); expect(view.model.messages.at(0).get('editable')).toBe(false); expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1); const el = view.el.querySelector('.chat-msg--retracted .chat-msg__message div'); @@ -640,6 +641,7 @@ expect(view.model.messages.length).toBe(1); expect(view.model.messages.at(0).get('retracted')).toBeFalsy(); expect(view.model.messages.at(0).get('is_ephemeral')).toBeFalsy(); + expect(view.model.messages.at(0).get('editable')).toBeTruthy(); expect(view.el.querySelectorAll('.chat-error').length).toBe(1); const errmsg = view.el.querySelector('.chat-error'); @@ -675,6 +677,7 @@ expect(view.model.messages.length).toBe(1); expect(view.model.messages.at(0).get('retracted')).toBeFalsy(); expect(view.model.messages.at(0).get('is_ephemeral')).toBeFalsy(); + expect(view.model.messages.at(0).get('editable')).toBeTruthy(); const error_messages = view.el.querySelectorAll('.chat-error'); expect(error_messages.length).toBe(2); diff --git a/src/converse-muc-views.js b/src/converse-muc-views.js index 15a3101ea..17dea26b5 100644 --- a/src/converse-muc-views.js +++ b/src/converse-muc-views.js @@ -990,7 +990,7 @@ converse.plugins.add('converse-muc-views', { * @param { string } [reason] - The reason for retracting the message. */ async retractOtherMessage (message, reason) { - const result = await this.model.sendRetractionIQ(message, reason); + const result = await this.model.retractOtherMessage(message, reason); if (result === null) { const err_msg = __(`A timeout occurred while trying to retract the message`); _converse.api.alert('error', __('Error'), err_msg); @@ -1000,13 +1000,6 @@ converse.plugins.add('converse-muc-views', { _converse.api.alert('error', __('Error'), err_msg); _converse.log(err_msg, Strophe.LogLevel.WARN); _converse.log(result, Strophe.LogLevel.WARN); - } else { - message.save({ - 'moderated': 'retracted', - 'moderated_by': _converse.bare_jid, - 'moderated_id': message.get('msgid'), - 'moderation_reason': reason - }); } }, diff --git a/src/headless/converse-muc.js b/src/headless/converse-muc.js index c8d957edb..605fbf683 100644 --- a/src/headless/converse-muc.js +++ b/src/headless/converse-muc.js @@ -648,26 +648,23 @@ converse.plugins.add('converse-muc', { }, /** - * Retract one of your messages in this chat + * Retract one of your messages in this groupchat * @private * @method _converse.ChatRoom#retractOwnMessage * @param { _converse.Message } message - The message which we're retracting. */ async retractOwnMessage(message) { const editable = message.get('editable'); - const is_ephemeral = message.get('is_ephemeral'); // Optimistic save message.save({ 'retracted': (new Date()).toISOString(), 'retracted_id': message.get('origin_id'), - 'is_ephemeral': true, 'editable': false }); try { await this.sendRetractionMessage(message) } catch (e) { message.save({ - is_ephemeral, editable, 'retracted': undefined, 'retracted_id': undefined, @@ -676,6 +673,37 @@ converse.plugins.add('converse-muc', { } }, + /** + * Retract someone else's message in this groupchat. + * @private + * @method _converse.ChatRoom#retractOtherMessage + * @param { _converse.Message } message - The message which we're retracting. + * @param { string } [reason] - The reason for retracting the message. + */ + async retractOtherMessage (message, reason) { + const editable = message.get('editable'); + // Optimistic save + message.save({ + 'moderated': 'retracted', + 'moderated_by': _converse.bare_jid, + 'moderated_id': message.get('msgid'), + 'moderation_reason': reason, + 'editable': false + }); + const result = await this.sendRetractionIQ(message, reason); + if (result === null || u.isErrorStanza(result)) { + // Undo the save if something went wrong + message.save({ + editable, + 'moderated': undefined, + 'moderated_by': undefined, + 'moderated_id': undefined, + 'moderation_reason': undefined, + }); + } + return result; + }, + /** * Sends a message stanza to retract a message in this groupchat. * @private