diff --git a/js/models/conversations.js b/js/models/conversations.js index a8d4c3e67..7cbc75d33 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -570,9 +570,9 @@ const model = this.addSingleMessage(message); MessageController.register(model.id, model); - + console.log(`[vince] Changed triggered from model`); - + this.trigger('change'); }, addSingleMessage(message, setToExpire = true) { diff --git a/js/models/messages.js b/js/models/messages.js index 2377bb67d..8ca0f6c7b 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -603,7 +603,6 @@ isModerator, onCopyText: () => this.copyText(), - onSelectMessage: () => this.selectMessage(), onSelectMessageUnchecked: () => this.selectMessageUnchecked(), onCopyPubKey: () => this.copyPubKey(), onBanUser: () => this.banUser(), @@ -957,14 +956,6 @@ this.trigger('change'); }, - selectMessage() { - if (window.contextMenuShown || this.get('isRss')) { - return; - } - - this.selectMessageUnchecked(); - }, - copyText() { clipboard.writeText(this.get('body')); diff --git a/stylesheets/_session_conversation.scss b/stylesheets/_session_conversation.scss index 8dc0810a4..f800b0fc5 100644 --- a/stylesheets/_session_conversation.scss +++ b/stylesheets/_session_conversation.scss @@ -141,6 +141,7 @@ $composition-container-height: 60px; height: 0; background-color: inherit; outline: none; + position: relative; &__blocking-overlay { background-color: rgba(0, 0, 0, 0.8); diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 4b759db4b..67d2acb6e 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -113,7 +113,6 @@ export interface Props { onClickLinkPreview?: (url: string) => void; onCopyText?: () => void; onSelectMessage: (messageId: string) => void; - onSelectMessageUnchecked: () => void; onReply?: () => void; onRetrySend?: () => void; onDownload?: (isDangerous: boolean) => void; @@ -919,7 +918,6 @@ export class Message extends React.PureComponent { const { attachments, onCopyText, - onSelectMessageUnchecked, direction, status, isDeletable, @@ -966,8 +964,6 @@ export class Message extends React.PureComponent { const isServerDeletable = !!this.props.isPublic; const deleteMessageCtxText = i18n(isServerDeletable ? 'unsend' : 'delete'); - // CONTEXT MENU "Select Message" does not work - return ( { ) : null} {i18n('copyMessage')} - - {i18n('selectMessage')} - { // Keyboard navigation this.onKeyDown = this.onKeyDown.bind(this); - const conversationModel = window.ConversationController.get(this.state.conversationKey); + const conversationModel = window.ConversationController.get( + this.state.conversationKey + ); conversationModel.on('change', () => { - this.setState({ - messages: conversationModel.messageCollection.models, - }); + this.setState( + { + messages: conversationModel.messageCollection.models, + }, + this.updateReadMessages + ); }); } @@ -141,7 +146,7 @@ export class SessionConversation extends React.Component { public async componentWillMount() { await this.loadInitialMessages(); - this.setState({initialFetchComplete: true}); + this.setState({ initialFetchComplete: true }); } public componentDidMount() { @@ -162,16 +167,15 @@ export class SessionConversation extends React.Component { this.scrollToBottom(); } - // New messages get from message collection. - const messageCollection = window.ConversationController.get(this.state.conversationKey).messageCollection; + const messageCollection = window.ConversationController.get( + this.state.conversationKey + ).messageCollection; console.log('[vince] messageCollection:', messageCollection); console.log('[vince] this.state.messages:', this.state.messages); } - public async componentWillReceiveProps(nextProps: any) { - - } + public async componentWillReceiveProps(nextProps: any) {} // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~ RENDER METHODS ~~~~~~~~~~~~~~ @@ -288,7 +292,6 @@ export class SessionConversation extends React.Component { } public renderMessages(messages: any) { - const multiSelectMode = Boolean(this.state.selectedMessages.length); // FIXME VINCE: IF MESSAGE IS THE TOP OF UNREAD, THEN INSERT AN UNREAD BANNER @@ -381,7 +384,9 @@ export class SessionConversation extends React.Component { // in the conversation model. // The only time we need to call getMessages() is to grab more messages on scroll. const { conversationKey, initialFetchComplete } = this.state; - const conversationModel = window.ConversationController.get(conversationKey); + const conversationModel = window.ConversationController.get( + conversationKey + ); if (initialFetchComplete) { return; @@ -389,7 +394,10 @@ export class SessionConversation extends React.Component { const messageSet = await window.Signal.Data.getMessagesByConversation( conversationKey, - { limit: Constants.CONVERSATION.DEFAULT_MESSAGE_FETCH_COUNT, MessageCollection: window.Whisper.MessageCollection } + { + limit: Constants.CONVERSATION.DEFAULT_MESSAGE_FETCH_COUNT, + MessageCollection: window.Whisper.MessageCollection, + } ); const messages = messageSet.models; @@ -410,7 +418,9 @@ export class SessionConversation extends React.Component { fetchInterval = Constants.CONVERSATION.MESSAGE_FETCH_INTERVAL ) { const { conversationKey, messageFetchTimestamp } = this.state; - const conversationModel = window.ConversationController.get(conversationKey); + const conversationModel = window.ConversationController.get( + conversationKey + ); const timestamp = getTimestamp(); // If we have pulled messages in the last interval, don't bother rescanning @@ -770,9 +780,11 @@ 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 selectedMessages = this.state.messages.filter(message => + this.state.selectedMessages.find( + selectedMessage => selectedMessage === message.id + ) + ); const { conversationKey } = this.state; const conversationModel = window.ConversationController.get( @@ -793,7 +805,9 @@ export class SessionConversation extends React.Component { ? window.i18n('deleteMultiplePublicWarning') : window.i18n('deletePublicWarning'); } - return multiple ? window.i18n('deleteMultipleWarning') : window.i18n('deleteWarning'); + return multiple + ? window.i18n('deleteMultipleWarning') + : window.i18n('deleteWarning'); })(); const doDelete = async () => { @@ -807,7 +821,9 @@ export class SessionConversation extends React.Component { if (!ourDevicePubkey) { return; } - const ourPrimaryPubkey = (await MultiDeviceProtocol.getPrimaryDevice(ourDevicePubkey)).key; + const ourPrimaryPubkey = ( + await MultiDeviceProtocol.getPrimaryDevice(ourDevicePubkey) + ).key; const isModerator = conversationModel.isModerator(ourPrimaryPubkey); const isAllOurs = selectedMessages.every( message => @@ -821,16 +837,21 @@ export class SessionConversation extends React.Component { id: 'messageDeletionForbidden', }); + this.setState({ selectedMessages: [] }); return; } - toDeleteLocally = await conversationModel.deletePublicMessages(selectedMessages); + toDeleteLocally = await conversationModel.deletePublicMessages( + selectedMessages + ); if (toDeleteLocally.length === 0) { // Message failed to delete from server, show error? return; } } else { - selectedMessages.forEach(m => conversationModel.messageCollection.remove(m.id)); + selectedMessages.forEach(m => + conversationModel.messageCollection.remove(m.id) + ); toDeleteLocally = selectedMessages; } @@ -844,7 +865,7 @@ export class SessionConversation extends React.Component { ); // Update view and trigger update - this.setState({selectedMessages: [] }, () => { + this.setState({ selectedMessages: [] }, () => { conversationModel.trigger('change', conversationModel); }); }; @@ -859,9 +880,7 @@ export class SessionConversation extends React.Component { // If removable from server, we "Unsend" - otherwise "Delete" const pluralSuffix = multiple ? 's' : ''; const title = window.i18n( - isPublic - ? `unsendMessage${pluralSuffix}` - : `deleteMessage${pluralSuffix}` + isPublic ? `unsendMessage${pluralSuffix}` : `deleteMessage${pluralSuffix}` ); const okText = window.i18n(isServerDeletable ? 'unsend' : 'delete');