From 2bdc0579c3bc044c64d0c25e32b2ef3a9e439e7c Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 13 Dec 2019 10:09:22 +1100 Subject: [PATCH] Message deletion moderator check and toast. --- _locales/en/messages.json | 5 ++++ js/views/conversation_view.js | 24 +++++++++++++++++-- .../session/icon/SessionIconButton.tsx | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index b77bc0a39..83a3658d9 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1017,6 +1017,11 @@ "message": "Are you sure? Clicking 'delete' will permanently remove these messages from this device only." }, + "messageDeletionForbidden": { + "message": "You don't have permission to delete others' messages.", + "description": + "Toast message explaining that the user doens't have the rights to delete other people's messages." + }, "deleteThisMessage": { "message": "Delete this message" }, diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index d7cf37a08..cfc06b784 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -69,6 +69,12 @@ }, }); + Whisper.MessageDeletionForbiddenToast = Whisper.ToastView.extend({ + render_attributes() { + return { toastMessage: i18n('messageDeletionForbidden') }; + }, + }); + const MAX_MESSAGE_BODY_LENGTH = 64 * 1024; Whisper.MessageBodyTooLongToast = Whisper.ToastView.extend({ render_attributes() { @@ -1397,9 +1403,23 @@ }, deleteSelectedMessages() { - const msgArray = Array.from(this.model.selectedMessages); + const selected = Array.from(this.model.selectedMessages); + const isModerator = this.model.isModerator(this.model.OUR_NUMBER); + let isAllOurs = true; + + // eslint-disable-next-line no-restricted-syntax + for (const message of selected) { + isAllOurs = message.attributes.source === message.OUR_NUMBER; + if (!isAllOurs && !isModerator) { + const toast = new Whisper.MessageDeletionForbiddenToast(); + toast.$el.appendTo(this.$el); + toast.render(); + + return; + } + } - this.deleteMessages(msgArray, () => { + this.deleteMessages(selected, () => { this.resetMessageSelection(); }); }, diff --git a/ts/components/session/icon/SessionIconButton.tsx b/ts/components/session/icon/SessionIconButton.tsx index 4c8773990..ddf53615c 100644 --- a/ts/components/session/icon/SessionIconButton.tsx +++ b/ts/components/session/icon/SessionIconButton.tsx @@ -11,7 +11,7 @@ export class SessionIconButton extends React.PureComponent { public static readonly extendedDefaults = { onClick: () => null, }; - public static readonlydefaultProps = { + public static readonly defaultProps = { ...SessionIcon.defaultProps, ...SessionIconButton.extendedDefaults, };