diff --git a/js/models/messages.js b/js/models/messages.js index 27f307739..3e04e9a32 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -617,7 +617,6 @@ onBanUser: () => this.banUser(), onRetrySend: () => this.retrySend(), onShowDetail: () => this.trigger('show-message-detail', this), - onDelete: () => this.trigger('delete', this), onClickLinkPreview: url => this.trigger('navigate-to', url), onShowUserDetails: pubkey => diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 525821323..04bb04282 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -791,7 +791,8 @@ export class Message extends React.PureComponent { direction, status, isDeletable, - onDelete, + id, + onSelectMessage, onDownload, onRetrySend, onShowDetail, @@ -828,10 +829,7 @@ export class Message extends React.PureComponent { }, 100); }; - const isServerDeletable = !!this.props.isPublic; - const deleteMessageCtxText = window.i18n( - isServerDeletable ? 'deleteForEveryone' : 'delete' - ); + const selectMessageText = window.i18n('selectMessage'); return ( { {window.i18n('resend')} ) : null} {isDeletable ? ( - {deleteMessageCtxText} + { + e.event.stopPropagation(); + onSelectMessage(id); + }} + > + {selectMessageText} + ) : null} {isModerator && isPublic ? ( {window.i18n('banUser')} diff --git a/ts/components/session/conversation/SessionConversation.tsx b/ts/components/session/conversation/SessionConversation.tsx index e4795aea7..6cf5467e0 100644 --- a/ts/components/session/conversation/SessionConversation.tsx +++ b/ts/components/session/conversation/SessionConversation.tsx @@ -26,6 +26,7 @@ import { AttachmentType, save } from '../../../types/Attachment'; import { ToastUtils } from '../../../session/utils'; import * as MIME from '../../../types/MIME'; import { SessionFileDropzone } from './SessionFileDropzone'; +import { PubKey } from '../../../session/types'; interface State { conversationKey: string; @@ -449,9 +450,7 @@ export class SessionConversation extends React.Component { onSetDisappearingMessages: (seconds: any) => conversation.updateExpirationTimer(seconds), onDeleteMessages: () => null, - onDeleteSelectedMessages: async () => { - await this.deleteSelectedMessages(); - }, + onDeleteSelectedMessages: this.deleteSelectedMessages, onCloseOverlay: () => { this.setState({ selectedMessages: [] }); conversation.resetMessageSelection(); @@ -536,6 +535,7 @@ export class SessionConversation extends React.Component { onClickAttachment: this.onClickAttachment, onDownloadAttachment: this.downloadAttachment, messageContainerRef: this.messageContainerRef, + onDeleteSelectedMessages: this.deleteSelectedMessages, }; } @@ -652,16 +652,15 @@ export class SessionConversation extends React.Component { public async deleteSelectedMessages() { // Get message objects - const selectedMessages = this.state.messages.filter(message => - this.state.selectedMessages.find( - selectedMessage => selectedMessage === message.id - ) - ); - const { conversationKey } = this.state; const conversationModel = window.ConversationController.getOrThrow( conversationKey ); + const selectedMessages = conversationModel.messageCollection.models.filter(message => + this.state.selectedMessages.find( + selectedMessage => selectedMessage === message.id + ) + ); const multiple = selectedMessages.length > 1; @@ -698,9 +697,9 @@ export class SessionConversation extends React.Component { await MultiDeviceProtocol.getPrimaryDevice(ourDevicePubkey) ).key; const isModerator = conversationModel.isModerator(ourPrimaryPubkey); + const ourNumbers = (await MultiDeviceProtocol.getOurDevices()).map(m => m.key); const isAllOurs = selectedMessages.every( - message => - message.propsForMessage.authorPhoneNumber === message.OUR_NUMBER + message => ourNumbers.includes(message.get('source')) ); if (!isAllOurs && !isModerator) { @@ -743,13 +742,6 @@ export class SessionConversation extends React.Component { }); }; - // Only show a warning when at least one messages was successfully - // saved in on the server - if (!selectedMessages.some(m => !m.hasErrors())) { - await doDelete(); - return; - } - // If removable from server, we "Unsend" - otherwise "Delete" const pluralSuffix = multiple ? 's' : ''; const title = window.i18n( diff --git a/ts/components/session/conversation/SessionConversationMessagesList.tsx b/ts/components/session/conversation/SessionConversationMessagesList.tsx index 392701b15..c0b908091 100644 --- a/ts/components/session/conversation/SessionConversationMessagesList.tsx +++ b/ts/components/session/conversation/SessionConversationMessagesList.tsx @@ -34,6 +34,7 @@ interface Props { replyToMessage: (messageId: number) => Promise; onClickAttachment: (attachment: any, message: any) => void; onDownloadAttachment: ({ attachment }: { attachment: any }) => void; + onDeleteSelectedMessages: () => Promise; } export class SessionConversationMessagesList extends React.Component<