rename message props to messageProps

pull/1783/head
Audric Ackermann 4 years ago
parent c8aa73626e
commit e451cdd78f
No known key found for this signature in database
GPG Key ID: 999F434D76324AD4

@ -1,18 +1,16 @@
// tslint:disable: no-backbone-get-set-outside-model
import React from 'react'; import React from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { SessionCompositionBox, StagedAttachmentType } from './SessionCompositionBox'; import { SessionCompositionBox, StagedAttachmentType } from './SessionCompositionBox';
import { ClosedGroup, Constants, Utils } from '../../../session'; import { Constants } from '../../../session';
import _ from 'lodash'; import _ from 'lodash';
import { AttachmentUtil, GoogleChrome } from '../../../util'; import { AttachmentUtil, GoogleChrome } from '../../../util';
import { ConversationHeaderWithDetails } from '../../conversation/ConversationHeader'; import { ConversationHeaderWithDetails } from '../../conversation/ConversationHeader';
import { SessionRightPanelWithDetails } from './SessionRightPanel'; import { SessionRightPanelWithDetails } from './SessionRightPanel';
import { SessionTheme } from '../../../state/ducks/SessionTheme'; import { SessionTheme } from '../../../state/ducks/SessionTheme';
import { DefaultTheme, useTheme } from 'styled-components'; import { DefaultTheme } from 'styled-components';
import { SessionMessagesList } from './SessionMessagesList'; import { SessionMessagesList } from './SessionMessagesList';
import { LightboxGallery, MediaItemType } from '../../LightboxGallery'; import { LightboxGallery, MediaItemType } from '../../LightboxGallery';
import { Message } from '../../conversation/media-gallery/types/Message'; import { Message } from '../../conversation/media-gallery/types/Message';
@ -21,7 +19,11 @@ import { AttachmentType, AttachmentTypeWithPath, save } from '../../../types/Att
import { ToastUtils, UserUtils } from '../../../session/utils'; import { ToastUtils, UserUtils } from '../../../session/utils';
import * as MIME from '../../../types/MIME'; import * as MIME from '../../../types/MIME';
import { SessionFileDropzone } from './SessionFileDropzone'; import { SessionFileDropzone } from './SessionFileDropzone';
import { ConversationType, PropsForMessage } from '../../../state/ducks/conversations'; import {
ConversationType,
PropsForMessage,
SortedMessageModelProps,
} from '../../../state/ducks/conversations';
import { MessageView } from '../../MainViewController'; import { MessageView } from '../../MainViewController';
import { pushUnblockToSend } from '../../../session/utils/Toast'; import { pushUnblockToSend } from '../../../session/utils/Toast';
import { MessageDetail } from '../../conversation/MessageDetail'; import { MessageDetail } from '../../conversation/MessageDetail';
@ -39,7 +41,6 @@ import { updateMentionsMembers } from '../../../state/ducks/mentionsInput';
import { sendDataExtractionNotification } from '../../../session/messages/outgoing/controlMessage/DataExtractionNotificationMessage'; import { sendDataExtractionNotification } from '../../../session/messages/outgoing/controlMessage/DataExtractionNotificationMessage';
import { SessionButtonColor } from '../SessionButton'; import { SessionButtonColor } from '../SessionButton';
import { usingClosedConversationDetails } from '../usingClosedConversationDetails';
interface State { interface State {
// Message sending progress // Message sending progress
messageProgressVisible: boolean; messageProgressVisible: boolean;
@ -83,7 +84,7 @@ interface Props {
selectedConversationKey: string; selectedConversationKey: string;
selectedConversation?: ConversationType; selectedConversation?: ConversationType;
theme: DefaultTheme; theme: DefaultTheme;
messages: Array<any>; messagesProps: Array<SortedMessageModelProps>;
actions: any; actions: any;
} }
@ -216,9 +217,9 @@ export class SessionConversation extends React.Component<Props, State> {
} = this.state; } = this.state;
const selectionMode = !!selectedMessages.length; const selectionMode = !!selectedMessages.length;
const { selectedConversation, selectedConversationKey, messages, actions } = this.props; const { selectedConversation, selectedConversationKey, messagesProps, actions } = this.props;
if (!selectedConversation || !messages) { if (!selectedConversation || !messagesProps) {
// return an empty message view // return an empty message view
return <MessageView />; return <MessageView />;
} }
@ -414,7 +415,7 @@ export class SessionConversation extends React.Component<Props, State> {
selectedConversation, selectedConversation,
selectedConversationKey, selectedConversationKey,
ourNumber, ourNumber,
messages, messagesProps,
actions, actions,
} = this.props; } = this.props;
const { quotedMessageTimestamp, selectedMessages } = this.state; const { quotedMessageTimestamp, selectedMessages } = this.state;
@ -423,7 +424,7 @@ export class SessionConversation extends React.Component<Props, State> {
selectedMessages, selectedMessages,
ourPrimary: ourNumber, ourPrimary: ourNumber,
conversationKey: selectedConversationKey, conversationKey: selectedConversationKey,
messages, messagesProps,
resetSelection: this.resetSelection, resetSelection: this.resetSelection,
quotedMessageTimestamp, quotedMessageTimestamp,
conversation: selectedConversation as ConversationType, conversation: selectedConversation as ConversationType,
@ -529,15 +530,15 @@ export class SessionConversation extends React.Component<Props, State> {
public async deleteMessagesById(messageIds: Array<string>, askUserForConfirmation: boolean) { public async deleteMessagesById(messageIds: Array<string>, askUserForConfirmation: boolean) {
// Get message objects // Get message objects
const { selectedConversationKey, selectedConversation, messages } = this.props; const { selectedConversationKey, selectedConversation, messagesProps } = this.props;
const conversationModel = getConversationController().getOrThrow(selectedConversationKey); const conversationModel = getConversationController().getOrThrow(selectedConversationKey);
if (!selectedConversation) { if (!selectedConversation) {
window?.log?.info('No valid selected conversation.'); window?.log?.info('No valid selected conversation.');
return; return;
} }
const selectedMessages = messages.filter(message => const selectedMessages = messagesProps.filter(message =>
messageIds.find(selectedMessage => selectedMessage === message.id) messageIds.find(selectedMessage => selectedMessage === message.propsForMessage.id)
); );
const multiple = selectedMessages.length > 1; const multiple = selectedMessages.length > 1;
@ -557,7 +558,7 @@ export class SessionConversation extends React.Component<Props, State> {
})(); })();
const doDelete = async () => { const doDelete = async () => {
let toDeleteLocally; let toDeleteLocallyIds: Array<string>;
if (selectedConversation.isPublic) { if (selectedConversation.isPublic) {
// Get our Moderator status // Get our Moderator status
@ -568,7 +569,7 @@ export class SessionConversation extends React.Component<Props, State> {
const isAdmin = conversationModel.isAdmin(ourDevicePubkey); const isAdmin = conversationModel.isAdmin(ourDevicePubkey);
const isAllOurs = selectedMessages.every( const isAllOurs = selectedMessages.every(
message => ourDevicePubkey === message.attributes.source message => ourDevicePubkey === message.propsForMessage.authorPhoneNumber
); );
if (!isAllOurs && !isAdmin) { if (!isAllOurs && !isAdmin) {
@ -578,18 +579,18 @@ export class SessionConversation extends React.Component<Props, State> {
return; return;
} }
toDeleteLocally = await deleteOpenGroupMessages(selectedMessages, conversationModel); toDeleteLocallyIds = await deleteOpenGroupMessages(selectedMessages, conversationModel);
if (toDeleteLocally.length === 0) { if (toDeleteLocallyIds.length === 0) {
// Message failed to delete from server, show error? // Message failed to delete from server, show error?
return; return;
} }
} else { } else {
toDeleteLocally = selectedMessages; toDeleteLocallyIds = selectedMessages.map(pro => pro.propsForMessage.id);
} }
await Promise.all( await Promise.all(
toDeleteLocally.map(async message => { toDeleteLocallyIds.map(async msgId => {
await conversationModel.removeMessage(message.id); await conversationModel.removeMessage(msgId);
}) })
); );
@ -684,15 +685,19 @@ export class SessionConversation extends React.Component<Props, State> {
return; return;
} }
if (!_.isEqual(this.state.quotedMessageTimestamp, quotedMessageTimestamp)) { if (!_.isEqual(this.state.quotedMessageTimestamp, quotedMessageTimestamp)) {
const { messages, selectedConversationKey } = this.props; const { messagesProps, selectedConversationKey } = this.props;
const conversationModel = getConversationController().getOrThrow(selectedConversationKey); const conversationModel = getConversationController().getOrThrow(selectedConversationKey);
let quotedMessageProps = null; let quotedMessageProps = null;
if (quotedMessageTimestamp) { if (quotedMessageTimestamp) {
const quotedMessage = messages.find(m => m.attributes.sent_at === quotedMessageTimestamp); const quotedMessage = messagesProps.find(
m =>
m.propsForMessage.timestamp === quotedMessageTimestamp ||
m.propsForMessage.serverTimestamp === quotedMessageTimestamp
);
if (quotedMessage) { if (quotedMessage) {
const quotedMessageModel = await getMessageById(quotedMessage.id); const quotedMessageModel = await getMessageById(quotedMessage.propsForMessage.id);
if (quotedMessageModel) { if (quotedMessageModel) {
quotedMessageProps = await conversationModel.makeQuote(quotedMessageModel); quotedMessageProps = await conversationModel.makeQuote(quotedMessageModel);
} }

@ -35,7 +35,7 @@ interface State {
interface Props { interface Props {
selectedMessages: Array<string>; selectedMessages: Array<string>;
conversationKey: string; conversationKey: string;
messages: Array<SortedMessageModelProps>; messagesProps: Array<SortedMessageModelProps>;
conversation: ConversationType; conversation: ConversationType;
ourPrimary: string; ourPrimary: string;
messageContainerRef: React.RefObject<any>; messageContainerRef: React.RefObject<any>;
@ -98,8 +98,11 @@ export class SessionMessagesList extends React.Component<Props, State> {
public componentDidUpdate(prevProps: Props, _prevState: State) { public componentDidUpdate(prevProps: Props, _prevState: State) {
const isSameConvo = prevProps.conversationKey === this.props.conversationKey; const isSameConvo = prevProps.conversationKey === this.props.conversationKey;
const messageLengthChanged = prevProps.messages.length !== this.props.messages.length; const messageLengthChanged = prevProps.messagesProps.length !== this.props.messagesProps.length;
if (!isSameConvo || (prevProps.messages.length === 0 && this.props.messages.length !== 0)) { if (
!isSameConvo ||
(prevProps.messagesProps.length === 0 && this.props.messagesProps.length !== 0)
) {
// displayed conversation changed. We have a bit of cleaning to do here // displayed conversation changed. We have a bit of cleaning to do here
this.scrollOffsetBottomPx = Number.MAX_VALUE; this.scrollOffsetBottomPx = Number.MAX_VALUE;
this.ignoreScrollEvents = true; this.ignoreScrollEvents = true;
@ -133,7 +136,7 @@ export class SessionMessagesList extends React.Component<Props, State> {
} }
public render() { public render() {
const { conversationKey, conversation, messages } = this.props; const { conversationKey, conversation, messagesProps } = this.props;
const { showScrollButton } = this.state; const { showScrollButton } = this.state;
let displayedName = null; let displayedName = null;
@ -157,7 +160,7 @@ export class SessionMessagesList extends React.Component<Props, State> {
key="typing-bubble" key="typing-bubble"
/> />
{this.renderMessages(messages)} {this.renderMessages()}
<SessionScrollButton <SessionScrollButton
show={showScrollButton} show={showScrollButton}
@ -206,8 +209,8 @@ export class SessionMessagesList extends React.Component<Props, State> {
return findFirstUnreadIndex; return findFirstUnreadIndex;
} }
private renderMessages(messagesProps: Array<SortedMessageModelProps>) { private renderMessages() {
const { selectedMessages } = this.props; const { selectedMessages, messagesProps } = this.props;
const multiSelectMode = Boolean(selectedMessages.length); const multiSelectMode = Boolean(selectedMessages.length);
let currentMessageIndex = 0; let currentMessageIndex = 0;
let playableMessageIndex = 0; let playableMessageIndex = 0;
@ -367,9 +370,9 @@ export class SessionMessagesList extends React.Component<Props, State> {
// ~~~~~~~~~~~~~ MESSAGE HANDLING ~~~~~~~~~~~~~ // ~~~~~~~~~~~~~ MESSAGE HANDLING ~~~~~~~~~~~~~
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
private updateReadMessages() { private updateReadMessages() {
const { messages, conversationKey } = this.props; const { messagesProps, conversationKey } = this.props;
if (!messages || messages.length === 0) { if (!messagesProps || messagesProps.length === 0) {
return; return;
} }
@ -384,7 +387,7 @@ export class SessionMessagesList extends React.Component<Props, State> {
} }
if (this.getScrollOffsetBottomPx() === 0) { if (this.getScrollOffsetBottomPx() === 0) {
void conversation.markRead(messages[0].propsForMessage.receivedAt); void conversation.markRead(messagesProps[0].propsForMessage.receivedAt);
} }
} }
@ -393,11 +396,11 @@ export class SessionMessagesList extends React.Component<Props, State> {
* @param index index of message that just completed * @param index index of message that just completed
*/ */
private readonly playNextMessage = (index: any) => { private readonly playNextMessage = (index: any) => {
const { messages } = this.props; const { messagesProps } = this.props;
let nextIndex: number | undefined = index - 1; let nextIndex: number | undefined = index - 1;
// to prevent autoplaying as soon as a message is received. // to prevent autoplaying as soon as a message is received.
const latestMessagePlayed = index <= 0 || messages.length < index - 1; const latestMessagePlayed = index <= 0 || messagesProps.length < index - 1;
if (latestMessagePlayed) { if (latestMessagePlayed) {
nextIndex = undefined; nextIndex = undefined;
this.setState({ this.setState({
@ -407,8 +410,8 @@ export class SessionMessagesList extends React.Component<Props, State> {
} }
// stop auto-playing when the audio messages change author. // stop auto-playing when the audio messages change author.
const prevAuthorNumber = messages[index].propsForMessage.authorPhoneNumber; const prevAuthorNumber = messagesProps[index].propsForMessage.authorPhoneNumber;
const nextAuthorNumber = messages[index - 1].propsForMessage.authorPhoneNumber; const nextAuthorNumber = messagesProps[index - 1].propsForMessage.authorPhoneNumber;
const differentAuthor = prevAuthorNumber !== nextAuthorNumber; const differentAuthor = prevAuthorNumber !== nextAuthorNumber;
if (differentAuthor) { if (differentAuthor) {
nextIndex = undefined; nextIndex = undefined;
@ -464,28 +467,27 @@ export class SessionMessagesList extends React.Component<Props, State> {
const shouldFetchMoreMessages = scrollTop <= Constants.UI.MESSAGE_CONTAINER_BUFFER_OFFSET_PX; const shouldFetchMoreMessages = scrollTop <= Constants.UI.MESSAGE_CONTAINER_BUFFER_OFFSET_PX;
if (shouldFetchMoreMessages) { if (shouldFetchMoreMessages) {
const { messages } = this.props; const { messagesProps } = this.props;
const numMessages = const numMessages = messagesProps.length + Constants.CONVERSATION.DEFAULT_MESSAGE_FETCH_COUNT;
this.props.messages.length + Constants.CONVERSATION.DEFAULT_MESSAGE_FETCH_COUNT; const oldLen = messagesProps.length;
const oldLen = messages.length; const previousTopMessage = messagesProps[oldLen - 1]?.propsForMessage.id;
const previousTopMessage = messages[oldLen - 1]?.propsForMessage.id;
fetchMessagesForConversation({ conversationKey, count: numMessages }); fetchMessagesForConversation({ conversationKey, count: numMessages });
if (previousTopMessage && oldLen !== messages.length) { if (previousTopMessage && oldLen !== messagesProps.length) {
this.scrollToMessage(previousTopMessage); this.scrollToMessage(previousTopMessage);
} }
} }
} }
private scrollToUnread() { private scrollToUnread() {
const { messages, conversation } = this.props; const { messagesProps, conversation } = this.props;
if (conversation.unreadCount > 0) { if (conversation.unreadCount > 0) {
let message; let message;
if (messages.length > conversation.unreadCount) { if (messagesProps.length > conversation.unreadCount) {
// if we have enough message to show one more message, show one more to include the unread banner // if we have enough message to show one more message, show one more to include the unread banner
message = messages[conversation.unreadCount - 1]; message = messagesProps[conversation.unreadCount - 1];
} else { } else {
message = messages[conversation.unreadCount - 1]; message = messagesProps[conversation.unreadCount - 1];
} }
if (message) { if (message) {
@ -493,7 +495,7 @@ export class SessionMessagesList extends React.Component<Props, State> {
} }
} }
if (this.ignoreScrollEvents && messages.length > 0) { if (this.ignoreScrollEvents && messagesProps.length > 0) {
this.ignoreScrollEvents = false; this.ignoreScrollEvents = false;
this.updateReadMessages(); this.updateReadMessages();
} }
@ -563,6 +565,8 @@ export class SessionMessagesList extends React.Component<Props, State> {
private async scrollToQuoteMessage(options: QuoteClickOptions) { private async scrollToQuoteMessage(options: QuoteClickOptions) {
const { quoteAuthor, quoteId, referencedMessageNotFound } = options; const { quoteAuthor, quoteId, referencedMessageNotFound } = options;
const { messagesProps } = this.props;
// For simplicity's sake, we show the 'not found' toast no matter what if we were // For simplicity's sake, we show the 'not found' toast no matter what if we were
// not able to find the referenced message when the quote was received. // not able to find the referenced message when the quote was received.
if (referencedMessageNotFound) { if (referencedMessageNotFound) {
@ -570,7 +574,7 @@ export class SessionMessagesList extends React.Component<Props, State> {
return; return;
} }
// Look for message in memory first, which would tell us if we could scroll to it // Look for message in memory first, which would tell us if we could scroll to it
const targetMessage = this.props.messages.find(item => { const targetMessage = messagesProps.find(item => {
const messageAuthor = item.propsForMessage?.authorPhoneNumber; const messageAuthor = item.propsForMessage?.authorPhoneNumber;
if (!messageAuthor || quoteAuthor !== messageAuthor) { if (!messageAuthor || quoteAuthor !== messageAuthor) {

@ -31,7 +31,7 @@ import {
lastAvatarUploadTimestamp, lastAvatarUploadTimestamp,
removeAllMessagesInConversation, removeAllMessagesInConversation,
} from '../data/data'; } from '../data/data';
import { conversationReset } from '../state/ducks/conversations'; import { conversationReset, SortedMessageModelProps } from '../state/ducks/conversations';
import { getDecryptedMediaUrl } from '../session/crypto/DecryptedAttachmentsManager'; import { getDecryptedMediaUrl } from '../session/crypto/DecryptedAttachmentsManager';
import { IMAGE_JPEG } from '../types/MIME'; import { IMAGE_JPEG } from '../types/MIME';
import { FSv2 } from '../fileserver'; import { FSv2 } from '../fileserver';
@ -87,9 +87,9 @@ export async function copyPublicKeyByConvoId(convoId: string) {
* @param convo the conversation to delete from (only v2 opengroups are supported) * @param convo the conversation to delete from (only v2 opengroups are supported)
*/ */
export async function deleteOpenGroupMessages( export async function deleteOpenGroupMessages(
messages: Array<MessageModel>, messages: Array<SortedMessageModelProps>,
convo: ConversationModel convo: ConversationModel
): Promise<Array<MessageModel>> { ): Promise<Array<string>> {
if (!convo.isPublic()) { if (!convo.isPublic()) {
throw new Error('cannot delete public message on a non public groups'); throw new Error('cannot delete public message on a non public groups');
} }
@ -100,14 +100,13 @@ export async function deleteOpenGroupMessages(
// so logic here is to delete each messages and get which one where not removed // so logic here is to delete each messages and get which one where not removed
const validServerIdsToRemove = _.compact( const validServerIdsToRemove = _.compact(
messages.map(msg => { messages.map(msg => {
const serverId = msg.get('serverId'); return msg.propsForMessage.serverId;
return serverId;
}) })
); );
const validMessageModelsToRemove = _.compact( const validMessageModelsToRemove = _.compact(
messages.map(msg => { messages.map(msg => {
const serverId = msg.get('serverId'); const serverId = msg.propsForMessage.serverId;
if (serverId) { if (serverId) {
return msg; return msg;
} }
@ -125,7 +124,7 @@ export async function deleteOpenGroupMessages(
// remove only the messages we managed to remove on the server // remove only the messages we managed to remove on the server
if (allMessagesAreDeleted) { if (allMessagesAreDeleted) {
window?.log?.info('Removed all those serverIds messages successfully'); window?.log?.info('Removed all those serverIds messages successfully');
return validMessageModelsToRemove; return validMessageModelsToRemove.map(m => m.propsForMessage.id);
} else { } else {
window?.log?.info( window?.log?.info(
'failed to remove all those serverIds message. not removing them locally neither' 'failed to remove all those serverIds message. not removing them locally neither'

@ -551,6 +551,7 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
timestamp: this.get('sent_at'), timestamp: this.get('sent_at'),
receivedAt: this.get('received_at'), receivedAt: this.get('received_at'),
serverTimestamp: this.get('serverTimestamp'), serverTimestamp: this.get('serverTimestamp'),
serverId: this.get('serverId'),
status: this.getMessagePropStatus(), status: this.getMessagePropStatus(),
authorName: senderContact.name, authorName: senderContact.name,
authorProfileName: senderContact.profileName, authorProfileName: senderContact.profileName,

@ -11,7 +11,6 @@ import {
MessageModelType, MessageModelType,
PropsForDataExtractionNotification, PropsForDataExtractionNotification,
} from '../../models/messageType'; } from '../../models/messageType';
import { AttachmentType } from '../../types/Attachment';
export type MessageModelProps = { export type MessageModelProps = {
propsForMessage: PropsForMessage; propsForMessage: PropsForMessage;
@ -137,6 +136,7 @@ export type PropsForMessage = {
timestamp: number | undefined; timestamp: number | undefined;
receivedAt: number | undefined; receivedAt: number | undefined;
serverTimestamp: number | undefined; serverTimestamp: number | undefined;
serverId: number | undefined;
status: LastMessageStatusType; status: LastMessageStatusType;
authorName: string | null; authorName: string | null;
authorProfileName: string | null; authorProfileName: string | null;

@ -15,7 +15,7 @@ const mapStateToProps = (state: StateType) => {
selectedConversation: getSelectedConversation(state), selectedConversation: getSelectedConversation(state),
selectedConversationKey: getSelectedConversationKey(state), selectedConversationKey: getSelectedConversationKey(state),
theme: getTheme(state), theme: getTheme(state),
messages: getMessagesOfSelectedConversation(state), messagesProps: getMessagesOfSelectedConversation(state),
ourNumber: getOurNumber(state), ourNumber: getOurNumber(state),
}; };
}; };

Loading…
Cancel
Save