diff --git a/js/models/conversations.js b/js/models/conversations.js index e28762909..fc6f4b85f 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2085,6 +2085,23 @@ token, }; }, + getModStatus() { + if (!this.isPublic()) { + return false; + } + return this.get('modStatus'); + }, + async setModStatus(newStatus) { + if (!this.isPublic()) { + return; + } + if (this.get('modStatus') !== newStatus) { + this.set({ modStatus: newStatus }); + await window.Signal.Data.updateConversation(this.id, this.attributes, { + Conversation: Whisper.Conversation, + }); + } + }, // SIGNAL PROFILES diff --git a/js/models/messages.js b/js/models/messages.js index 1c79f2858..cc82e1a0c 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -672,6 +672,8 @@ isP2p: !!this.get('isP2p'), isPublic: !!this.get('isPublic'), isRss: !!this.get('isRss'), + isDeletable: + !this.get('isPublic') || this.getConversation().getModStatus(), onCopyText: () => this.copyText(), onReply: () => this.trigger('reply', this), diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index edea0036d..055a829a6 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1291,6 +1291,29 @@ }, deleteMessage(message) { + if (this.model.isPublic()) { + const dialog = new Whisper.ConfirmationDialogView({ + message: i18n('deletePublicWarning'), + okText: i18n('delete'), + resolve: async () => { + const success = await this.model.deletePublicMessage(message); + if (!success) { + // Message failed to delete from server, show error? + return; + } + await window.Signal.Data.removeMessage(message.id, { + Message: Whisper.Message, + }); + message.trigger('unload'); + this.resetPanel(); + this.updateHeader(); + }, + }); + + this.$el.prepend(dialog.el); + dialog.focusCancel(); + return; + } const dialog = new Whisper.ConfirmationDialogView({ message: i18n('deleteWarning'), okText: i18n('delete'), diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 7fdebbadc..dba0d52de 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -48,6 +48,7 @@ interface LinkPreviewType { export interface Props { disableMenu?: boolean; + isDeletable: boolean; text?: string; textPending?: boolean; id?: string; @@ -819,6 +820,7 @@ export class Message extends React.PureComponent { onCopyText, direction, status, + isDeletable, onDelete, onDownload, onReply, @@ -876,14 +878,16 @@ export class Message extends React.PureComponent { {i18n('retrySend')} ) : null} - - {i18n('deleteMessage')} - + {isDeletable ? ( + + {i18n('deleteMessage')} + + ) : null} ); }