Browse Source

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.
JC Brand 5 years ago
parent
commit
ead8cdbcd6
3 changed files with 38 additions and 14 deletions
  1. 5 2
      spec/retractions.js
  2. 1 8
      src/converse-muc-views.js
  3. 32 4
      src/headless/converse-muc.js

+ 5 - 2
spec/retractions.js

@@ -424,6 +424,7 @@
                 expect(view.model.messages.at(0).get('moderated')).toBe('retracted');
                 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('moderation_reason')).toBe(reason);
                 expect(view.model.messages.at(0).get('is_ephemeral')).toBe(false);
                 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);
                 expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1);
 
 
                 const msg_el = view.el.querySelector('.chat-msg--retracted .chat-msg__message');
                 const msg_el = view.el.querySelector('.chat-msg--retracted .chat-msg__message');
@@ -571,7 +572,7 @@
 
 
                 const message = view.model.messages.at(0);
                 const message = view.model.messages.at(0);
                 expect(message.get('retracted')).toBeTruthy();
                 expect(message.get('retracted')).toBeTruthy();
-                expect(message.get('is_ephemeral')).toBeTruthy();
+                expect(message.get('is_ephemeral')).toBe(false);
                 expect(message.get('editable')).toBeFalsy();
                 expect(message.get('editable')).toBeFalsy();
 
 
                 const stanza_id = message.get(`stanza_id ${muc_jid}`);
                 const stanza_id = message.get(`stanza_id ${muc_jid}`);
@@ -591,7 +592,7 @@
 
 
                 expect(view.model.messages.length).toBe(1);
                 expect(view.model.messages.length).toBe(1);
                 expect(view.model.messages.at(0).get('retracted')).toBeTruthy();
                 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.model.messages.at(0).get('editable')).toBe(false);
                 expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1);
                 expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1);
                 const el = view.el.querySelector('.chat-msg--retracted .chat-msg__message div');
                 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.length).toBe(1);
                 expect(view.model.messages.at(0).get('retracted')).toBeFalsy();
                 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('is_ephemeral')).toBeFalsy();
+                expect(view.model.messages.at(0).get('editable')).toBeTruthy();
 
 
                 expect(view.el.querySelectorAll('.chat-error').length).toBe(1);
                 expect(view.el.querySelectorAll('.chat-error').length).toBe(1);
                 const errmsg = view.el.querySelector('.chat-error');
                 const errmsg = view.el.querySelector('.chat-error');
@@ -675,6 +677,7 @@
                 expect(view.model.messages.length).toBe(1);
                 expect(view.model.messages.length).toBe(1);
                 expect(view.model.messages.at(0).get('retracted')).toBeFalsy();
                 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('is_ephemeral')).toBeFalsy();
+                expect(view.model.messages.at(0).get('editable')).toBeTruthy();
 
 
                 const error_messages = view.el.querySelectorAll('.chat-error');
                 const error_messages = view.el.querySelectorAll('.chat-error');
                 expect(error_messages.length).toBe(2);
                 expect(error_messages.length).toBe(2);

+ 1 - 8
src/converse-muc-views.js

@@ -990,7 +990,7 @@ converse.plugins.add('converse-muc-views', {
              * @param { string } [reason] - The reason for retracting the message.
              * @param { string } [reason] - The reason for retracting the message.
              */
              */
             async retractOtherMessage (message, reason) {
             async retractOtherMessage (message, reason) {
-                const result = await this.model.sendRetractionIQ(message, reason);
+                const result = await this.model.retractOtherMessage(message, reason);
                 if (result === null) {
                 if (result === null) {
                     const err_msg = __(`A timeout occurred while trying to retract the message`);
                     const err_msg = __(`A timeout occurred while trying to retract the message`);
                     _converse.api.alert('error', __('Error'), err_msg);
                     _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.api.alert('error', __('Error'), err_msg);
                     _converse.log(err_msg, Strophe.LogLevel.WARN);
                     _converse.log(err_msg, Strophe.LogLevel.WARN);
                     _converse.log(result, 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
-                    });
                 }
                 }
             },
             },
 
 

+ 32 - 4
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
              * @private
              * @method _converse.ChatRoom#retractOwnMessage
              * @method _converse.ChatRoom#retractOwnMessage
              * @param { _converse.Message } message - The message which we're retracting.
              * @param { _converse.Message } message - The message which we're retracting.
              */
              */
             async retractOwnMessage(message) {
             async retractOwnMessage(message) {
                 const editable = message.get('editable');
                 const editable = message.get('editable');
-                const is_ephemeral = message.get('is_ephemeral');
                 // Optimistic save
                 // Optimistic save
                 message.save({
                 message.save({
                     'retracted': (new Date()).toISOString(),
                     'retracted': (new Date()).toISOString(),
                     'retracted_id': message.get('origin_id'),
                     'retracted_id': message.get('origin_id'),
-                    'is_ephemeral': true,
                     'editable': false
                     'editable': false
                 });
                 });
                 try {
                 try {
                     await this.sendRetractionMessage(message)
                     await this.sendRetractionMessage(message)
                 } catch (e) {
                 } catch (e) {
                     message.save({
                     message.save({
-                        is_ephemeral,
                         editable,
                         editable,
                         'retracted': undefined,
                         'retracted': undefined,
                         'retracted_id': 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.
              * Sends a message stanza to retract a message in this groupchat.
              * @private
              * @private