feat: DataExtractionNotifications now expire

MessageRequestResponses should not expire, pass yarn ready
pull/2660/head
William Grant 2 years ago
parent 5c697572a7
commit 446752cf54

@ -5,9 +5,8 @@ import { PropsForExpirationTimer } from '../../state/ducks/conversations';
import { ExpirableReadableMessage } from './message/message-item/ExpirableReadableMessage'; import { ExpirableReadableMessage } from './message/message-item/ExpirableReadableMessage';
import { SessionIcon } from '../icon'; import { SessionIcon } from '../icon';
import { SpacerSM } from '../basic/Text'; import { SpacerSM, Text } from '../basic/Text';
import { Flex } from '../basic/Flex'; import { Flex } from '../basic/Flex';
import { Text } from '../basic/Text';
export const TimerNotification = (props: PropsForExpirationTimer) => { export const TimerNotification = (props: PropsForExpirationTimer) => {
const { const {

@ -4,10 +4,21 @@ import { SignalService } from '../../../../protobuf';
import { Flex } from '../../../basic/Flex'; import { Flex } from '../../../basic/Flex';
import { SpacerSM, Text } from '../../../basic/Text'; import { SpacerSM, Text } from '../../../basic/Text';
import { SessionIcon } from '../../../icon'; import { SessionIcon } from '../../../icon';
import { ReadableMessage } from './ReadableMessage'; import { ExpirableReadableMessage } from './ExpirableReadableMessage';
export const DataExtractionNotification = (props: PropsForDataExtractionNotification) => { 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; let contentText: string;
if (type === SignalService.DataExtractionNotification.Type.MEDIA_SAVED) { if (type === SignalService.DataExtractionNotification.Type.MEDIA_SAVED) {
@ -17,10 +28,14 @@ export const DataExtractionNotification = (props: PropsForDataExtractionNotifica
} }
return ( return (
<ReadableMessage <ExpirableReadableMessage
messageId={messageId} messageId={messageId}
receivedAt={receivedAt} receivedAt={receivedAt}
isUnread={isUnread} isUnread={isUnread}
direction={direction}
expirationLength={expirationLength}
expirationTimestamp={expirationTimestamp}
isExpired={isExpired}
key={`readable-message-${messageId}`} key={`readable-message-${messageId}`}
> >
<Flex <Flex
@ -35,6 +50,6 @@ export const DataExtractionNotification = (props: PropsForDataExtractionNotifica
<SpacerSM /> <SpacerSM />
<Text text={contentText} subtle={true} ellipsisOverflow={true} /> <Text text={contentText} subtle={true} ellipsisOverflow={true} />
</Flex> </Flex>
</ReadableMessage> </ExpirableReadableMessage>
); );
}; };

@ -6,6 +6,7 @@ import { Flex } from '../../../basic/Flex';
import { SpacerSM, Text } from '../../../basic/Text'; import { SpacerSM, Text } from '../../../basic/Text';
import { ReadableMessage } from './ReadableMessage'; 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) => { export const MessageRequestResponse = (props: PropsForMessageRequestResponse) => {
const { messageId, isUnread, receivedAt, conversationId } = props; const { messageId, isUnread, receivedAt, conversationId } = props;

@ -338,13 +338,8 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
return null; return null;
} }
const invitation = this.get('groupInvitation'); const invitation = this.get('groupInvitation');
let direction = this.get('direction');
if (!direction) {
direction = this.get('type') === 'outgoing' ? 'outgoing' : 'incoming';
}
let serverAddress = ''; let serverAddress = '';
try { try {
const url = new URL(invitation.url); const url = new URL(invitation.url);
serverAddress = url.origin; serverAddress = url.origin;
@ -382,6 +377,7 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
messageId: this.id, messageId: this.id,
receivedAt: this.get('received_at'), receivedAt: this.get('received_at'),
isUnread: this.isUnread(), isUnread: this.isUnread(),
...this.getPropsForExpiringMessage(),
}; };
} }

@ -1,6 +1,10 @@
import { defaultsDeep } from 'lodash'; import { defaultsDeep } from 'lodash';
import { v4 as uuidv4 } from 'uuid'; 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 { AttachmentTypeWithPath } from '../types/Attachment';
import { Reaction, ReactionList, SortedReactionList } from '../types/Reaction'; import { Reaction, ReactionList, SortedReactionList } from '../types/Reaction';
import { DisappearingMessageType } from '../util/expiringMessages'; import { DisappearingMessageType } from '../util/expiringMessages';
@ -135,12 +139,14 @@ export enum MessageDirection {
any = '%', any = '%',
} }
export type PropsForDataExtractionNotification = DataExtractionNotificationMsg & { export interface PropsForDataExtractionNotification
extends DataExtractionNotificationMsg,
PropsForExpiringMessage {
name: string; name: string;
messageId: string; messageId: string;
receivedAt?: number; receivedAt?: number;
isUnread: boolean; isUnread: boolean;
}; }
export type PropsForMessageRequestResponse = MessageRequestResponseMsg & { export type PropsForMessageRequestResponse = MessageRequestResponseMsg & {
conversationId?: string; conversationId?: string;

@ -28,7 +28,10 @@ import {
import { ConversationTypeEnum } from '../models/conversationAttributes'; import { ConversationTypeEnum } from '../models/conversationAttributes';
import { findCachedBlindedMatchOrLookupOnAllServers } from '../session/apis/open_group_api/sogsv3/knownBlindedkeys'; import { findCachedBlindedMatchOrLookupOnAllServers } from '../session/apis/open_group_api/sogsv3/knownBlindedkeys';
import { appendFetchAvatarAndProfileJob } from './userProfileImageUpdates'; import { appendFetchAvatarAndProfileJob } from './userProfileImageUpdates';
import { DisappearingMessageConversationSetting } from '../util/expiringMessages'; import {
DisappearingMessageConversationSetting,
setExpirationStartTimestamp,
} from '../util/expiringMessages';
export async function handleSwarmContentMessage(envelope: EnvelopePlus, messageHash: string) { export async function handleSwarmContentMessage(envelope: EnvelopePlus, messageHash: string) {
try { try {
@ -332,7 +335,7 @@ function shouldDropBlockedUserMessage(
return !isControlDataMessageOnly; return !isControlDataMessageOnly;
} }
// tslint:disable-next-line: cyclomatic-complexity // tslint:disable-next-line: cyclomatic-complexity max-func-body-length
export async function innerHandleSwarmContentMessage( export async function innerHandleSwarmContentMessage(
envelope: EnvelopePlus, envelope: EnvelopePlus,
sentAtTimestamp: number, sentAtTimestamp: number,
@ -414,7 +417,7 @@ export async function innerHandleSwarmContentMessage(
if (dataMessage.expireTimer) { if (dataMessage.expireTimer) {
// TODO Trigger banner in UI? // TODO Trigger banner in UI?
expireTimer = dataMessage.expireTimer; 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 // NOTE In the protobuf this is a long
@ -777,6 +780,7 @@ export async function handleDataExtractionNotification(
if (timestamp) { if (timestamp) {
const envelopeTimestamp = toNumber(timestamp); const envelopeTimestamp = toNumber(timestamp);
const referencedAttachmentTimestamp = toNumber(referencedAttachment); const referencedAttachmentTimestamp = toNumber(referencedAttachment);
const expirationType = convo.get('expirationType');
await convo.addSingleIncomingMessage({ await convo.addSingleIncomingMessage({
source, source,
@ -787,7 +791,9 @@ export async function handleDataExtractionNotification(
source, source,
}, },
unread: 1, // 1 means unread 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(); convo.updateLastMessage();
} }

@ -228,7 +228,7 @@ export async function handleSwarmDataMessage(
return; return;
} }
let msgModel = const msgModel =
isSyncedMessage || (envelope.senderIdentity && isUsFromCache(envelope.senderIdentity)) isSyncedMessage || (envelope.senderIdentity && isUsFromCache(envelope.senderIdentity))
? createSwarmMessageSentFromUs({ ? createSwarmMessageSentFromUs({
conversationId: convoIdToAddTheMessageTo, conversationId: convoIdToAddTheMessageTo,
@ -245,7 +245,6 @@ export async function handleSwarmDataMessage(
if (isSyncedMessage) { if (isSyncedMessage) {
// TODO handle sync messages separately // TODO handle sync messages separately
window.log.info('WIP: Sync Message dropping'); window.log.info('WIP: Sync Message dropping');
expireUpdate = null;
} }
await handleSwarmMessage( await handleSwarmMessage(
@ -255,7 +254,7 @@ export async function handleSwarmDataMessage(
cleanDataMessage, cleanDataMessage,
convoToAddMessageTo, convoToAddMessageTo,
() => removeFromCache(envelope), () => removeFromCache(envelope),
expireUpdate isSyncedMessage ? expireUpdate : null
); );
} }

@ -314,7 +314,7 @@ async function handleExpirationTimerUpdateNoCommit(
// TODO Not entirely sure that this works // TODO Not entirely sure that this works
if (conversation.get('lastDisappearingMessageChangeTimestamp') > providedChangeTimestamp) { 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; return;
} }

@ -139,7 +139,7 @@ async function processExpirationResults(
if (!isValid) { if (!isValid) {
window.log.warn( window.log.warn(
`WIP: loki_message:::expireMessage - Signature verification failed!`, 'WIP: loki_message:::expireMessage - Signature verification failed!',
messageHashes messageHashes
); );
} }

@ -154,7 +154,7 @@ async function handleMessageSentFailure(
sentMessage: RawMessage | OpenGroupVisibleMessage, sentMessage: RawMessage | OpenGroupVisibleMessage,
error: any error: any
) { ) {
let fetchedMessage = await fetchHandleMessageSentData(sentMessage.identifier); const fetchedMessage = await fetchHandleMessageSentData(sentMessage.identifier);
if (!fetchedMessage) { if (!fetchedMessage) {
return; return;
} }

Loading…
Cancel
Save