diff --git a/ts/components/conversation/TimerNotification.tsx b/ts/components/conversation/TimerNotification.tsx index 7991f5569..a866306d0 100644 --- a/ts/components/conversation/TimerNotification.tsx +++ b/ts/components/conversation/TimerNotification.tsx @@ -5,9 +5,8 @@ import { PropsForExpirationTimer } from '../../state/ducks/conversations'; import { ExpirableReadableMessage } from './message/message-item/ExpirableReadableMessage'; import { SessionIcon } from '../icon'; -import { SpacerSM } from '../basic/Text'; +import { SpacerSM, Text } from '../basic/Text'; import { Flex } from '../basic/Flex'; -import { Text } from '../basic/Text'; export const TimerNotification = (props: PropsForExpirationTimer) => { const { diff --git a/ts/components/conversation/message/message-item/DataExtractionNotification.tsx b/ts/components/conversation/message/message-item/DataExtractionNotification.tsx index 4dd2a09fc..74a6f0417 100644 --- a/ts/components/conversation/message/message-item/DataExtractionNotification.tsx +++ b/ts/components/conversation/message/message-item/DataExtractionNotification.tsx @@ -4,10 +4,21 @@ import { SignalService } from '../../../../protobuf'; import { Flex } from '../../../basic/Flex'; import { SpacerSM, Text } from '../../../basic/Text'; import { SessionIcon } from '../../../icon'; -import { ReadableMessage } from './ReadableMessage'; +import { ExpirableReadableMessage } from './ExpirableReadableMessage'; export const DataExtractionNotification = (props: PropsForDataExtractionNotification) => { - const { name, type, source, messageId, isUnread, receivedAt } = props; + const { + name, + type, + source, + messageId, + isUnread, + receivedAt, + direction, + expirationLength, + expirationTimestamp, + isExpired, + } = props; let contentText: string; if (type === SignalService.DataExtractionNotification.Type.MEDIA_SAVED) { @@ -17,10 +28,14 @@ export const DataExtractionNotification = (props: PropsForDataExtractionNotifica } return ( - - + ); }; diff --git a/ts/components/conversation/message/message-item/MessageRequestResponse.tsx b/ts/components/conversation/message/message-item/MessageRequestResponse.tsx index bd97b18fe..1d3be7fb9 100644 --- a/ts/components/conversation/message/message-item/MessageRequestResponse.tsx +++ b/ts/components/conversation/message/message-item/MessageRequestResponse.tsx @@ -6,6 +6,7 @@ import { Flex } from '../../../basic/Flex'; import { SpacerSM, Text } from '../../../basic/Text'; import { ReadableMessage } from './ReadableMessage'; +// Note this should not respond to the disappearing message conversation setting so we use the ReadableMessage export const MessageRequestResponse = (props: PropsForMessageRequestResponse) => { const { messageId, isUnread, receivedAt, conversationId } = props; diff --git a/ts/models/message.ts b/ts/models/message.ts index e7219a9bd..70b9e89ed 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -338,13 +338,8 @@ export class MessageModel extends Backbone.Model { return null; } const invitation = this.get('groupInvitation'); - - let direction = this.get('direction'); - if (!direction) { - direction = this.get('type') === 'outgoing' ? 'outgoing' : 'incoming'; - } - let serverAddress = ''; + try { const url = new URL(invitation.url); serverAddress = url.origin; @@ -382,6 +377,7 @@ export class MessageModel extends Backbone.Model { messageId: this.id, receivedAt: this.get('received_at'), isUnread: this.isUnread(), + ...this.getPropsForExpiringMessage(), }; } diff --git a/ts/models/messageType.ts b/ts/models/messageType.ts index 760f5744f..bf0ff3d2e 100644 --- a/ts/models/messageType.ts +++ b/ts/models/messageType.ts @@ -1,6 +1,10 @@ import { defaultsDeep } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { CallNotificationType, PropsForMessageWithConvoProps } from '../state/ducks/conversations'; +import { + CallNotificationType, + PropsForExpiringMessage, + PropsForMessageWithConvoProps, +} from '../state/ducks/conversations'; import { AttachmentTypeWithPath } from '../types/Attachment'; import { Reaction, ReactionList, SortedReactionList } from '../types/Reaction'; import { DisappearingMessageType } from '../util/expiringMessages'; @@ -135,12 +139,14 @@ export enum MessageDirection { any = '%', } -export type PropsForDataExtractionNotification = DataExtractionNotificationMsg & { +export interface PropsForDataExtractionNotification + extends DataExtractionNotificationMsg, + PropsForExpiringMessage { name: string; messageId: string; receivedAt?: number; isUnread: boolean; -}; +} export type PropsForMessageRequestResponse = MessageRequestResponseMsg & { conversationId?: string; diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index d597d6a36..df4d62c23 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -28,7 +28,10 @@ import { import { ConversationTypeEnum } from '../models/conversationAttributes'; import { findCachedBlindedMatchOrLookupOnAllServers } from '../session/apis/open_group_api/sogsv3/knownBlindedkeys'; import { appendFetchAvatarAndProfileJob } from './userProfileImageUpdates'; -import { DisappearingMessageConversationSetting } from '../util/expiringMessages'; +import { + DisappearingMessageConversationSetting, + setExpirationStartTimestamp, +} from '../util/expiringMessages'; export async function handleSwarmContentMessage(envelope: EnvelopePlus, messageHash: string) { try { @@ -332,7 +335,7 @@ function shouldDropBlockedUserMessage( return !isControlDataMessageOnly; } -// tslint:disable-next-line: cyclomatic-complexity +// tslint:disable-next-line: cyclomatic-complexity max-func-body-length export async function innerHandleSwarmContentMessage( envelope: EnvelopePlus, sentAtTimestamp: number, @@ -414,7 +417,7 @@ export async function innerHandleSwarmContentMessage( if (dataMessage.expireTimer) { // TODO Trigger banner in UI? expireTimer = dataMessage.expireTimer; - window.log.info(`WIP: Received outdated disappearing message data message`, content); + window.log.info('WIP: Received outdated disappearing message data message', content); } // NOTE In the protobuf this is a long @@ -777,6 +780,7 @@ export async function handleDataExtractionNotification( if (timestamp) { const envelopeTimestamp = toNumber(timestamp); const referencedAttachmentTimestamp = toNumber(referencedAttachment); + const expirationType = convo.get('expirationType'); await convo.addSingleIncomingMessage({ source, @@ -787,7 +791,9 @@ export async function handleDataExtractionNotification( source, }, unread: 1, // 1 means unread - expireTimer: 0, + expirationType: expirationType !== 'off' ? expirationType : undefined, + expireTimer: convo.get('expireTimer') ? convo.get('expireTimer') : 0, + expirationStartTimestamp: setExpirationStartTimestamp(expirationType), }); convo.updateLastMessage(); } diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index b3bb42deb..554b8b759 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -228,7 +228,7 @@ export async function handleSwarmDataMessage( return; } - let msgModel = + const msgModel = isSyncedMessage || (envelope.senderIdentity && isUsFromCache(envelope.senderIdentity)) ? createSwarmMessageSentFromUs({ conversationId: convoIdToAddTheMessageTo, @@ -245,7 +245,6 @@ export async function handleSwarmDataMessage( if (isSyncedMessage) { // TODO handle sync messages separately window.log.info('WIP: Sync Message dropping'); - expireUpdate = null; } await handleSwarmMessage( @@ -255,7 +254,7 @@ export async function handleSwarmDataMessage( cleanDataMessage, convoToAddMessageTo, () => removeFromCache(envelope), - expireUpdate + isSyncedMessage ? expireUpdate : null ); } diff --git a/ts/receiver/queuedJob.ts b/ts/receiver/queuedJob.ts index c14d4e328..aa64de826 100644 --- a/ts/receiver/queuedJob.ts +++ b/ts/receiver/queuedJob.ts @@ -314,7 +314,7 @@ async function handleExpirationTimerUpdateNoCommit( // TODO Not entirely sure that this works if (conversation.get('lastDisappearingMessageChangeTimestamp') > providedChangeTimestamp) { - window.log.info(`WIP: This is an outdated disappearing message setting`); + window.log.info('WIP: This is an outdated disappearing message setting'); return; } diff --git a/ts/session/apis/snode_api/expire.ts b/ts/session/apis/snode_api/expire.ts index bcca1fc40..3954cdc6d 100644 --- a/ts/session/apis/snode_api/expire.ts +++ b/ts/session/apis/snode_api/expire.ts @@ -139,7 +139,7 @@ async function processExpirationResults( if (!isValid) { window.log.warn( - `WIP: loki_message:::expireMessage - Signature verification failed!`, + 'WIP: loki_message:::expireMessage - Signature verification failed!', messageHashes ); } diff --git a/ts/session/sending/MessageSentHandler.ts b/ts/session/sending/MessageSentHandler.ts index 4c22ef19f..1156f1ce6 100644 --- a/ts/session/sending/MessageSentHandler.ts +++ b/ts/session/sending/MessageSentHandler.ts @@ -154,7 +154,7 @@ async function handleMessageSentFailure( sentMessage: RawMessage | OpenGroupVisibleMessage, error: any ) { - let fetchedMessage = await fetchHandleMessageSentData(sentMessage.identifier); + const fetchedMessage = await fetchHandleMessageSentData(sentMessage.identifier); if (!fetchedMessage) { return; }