From 8117e631d0902a67facd29a336aec628367fafcf Mon Sep 17 00:00:00 2001 From: William Grant Date: Mon, 3 Apr 2023 14:09:06 +0200 Subject: [PATCH] feat: legacy mode now works for 1-1 chats --- ts/models/conversation.ts | 21 +++++++++++------ ts/models/message.ts | 23 +++++++++++++++---- ts/receiver/queuedJob.ts | 12 ++++++++-- .../messages/outgoing/ExpirableMessage.ts | 1 + .../outgoing/visibleMessage/VisibleMessage.ts | 5 ++++ ts/session/sending/MessageSentHandler.ts | 8 ++++++- ts/types/LocalizerKeys.ts | 2 ++ ts/util/expiringMessages.ts | 21 +++++++++-------- 8 files changed, 70 insertions(+), 23 deletions(-) diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index faf5bd3f7..42d6e3111 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -635,13 +635,15 @@ export class ConversationModel extends Backbone.Model { if (this.isPrivate()) { if (this.isMe()) { - if (!this.isDisappearingMode('deleteAfterSend')) { - return; + if (this.isDisappearingMode) { + // TODO legacy messages support will be removed in a future release + if (!this.isDisappearingMode('legacy') || !this.isDisappearingMode('deleteAfterSend')) { + return; + } } chatMessageParams.syncTarget = this.id; const chatMessageMe = new VisibleMessage(chatMessageParams); - // TODO handle sync messages for disappearing messages here await getMessageQueue().sendSyncMessage(chatMessageMe); return; } @@ -680,6 +682,11 @@ export class ConversationModel extends Backbone.Model { expireTimer: chatMessageParams.expireTimer, }); + window.log.info( + `WIP: sendMessageJob() closedGroupVisibleMessage`, + closedGroupVisibleMessage + ); + // we need the return await so that errors are caught in the catch {} await getMessageQueue().sendToGroup(closedGroupVisibleMessage); return; @@ -2231,11 +2238,11 @@ export class ConversationModel extends Backbone.Model { } private isDisappearingMode(mode: DisappearingMessageType) { - // TODO support legacy mode + // TODO legacy messages support will be removed in a future release const success = - this.get('expirationType') && - this.get('expirationType') !== 'off' && - mode === 'deleteAfterRead' + this.get('expirationType') && this.get('expirationType') !== 'off' && mode === 'legacy' + ? this.get('expirationType') === 'legacy' + : mode === 'deleteAfterRead' ? this.get('expirationType') === 'deleteAfterRead' : this.get('expirationType') === 'deleteAfterSend'; diff --git a/ts/models/message.ts b/ts/models/message.ts index e9618d009..f12259db2 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -1209,9 +1209,17 @@ export class MessageModel extends Backbone.Model { public markReadNoCommit(readAt: number) { this.set({ unread: 0 }); - if (this.get('expirationType') === 'deleteAfterRead' && this.get('expireTimer')) { + const expirationType = this.get('expirationType'); + // TODO legacy messages support will be removed in a future release + const convo = this.getConversation(); + const isLegacyMode = convo && convo.isPrivate() && expirationType === 'legacy'; + if ((isLegacyMode || expirationType === 'deleteAfterRead') && this.get('expireTimer')) { this.set({ - expirationStartTimestamp: setExpirationStartTimestamp('deleteAfterRead', readAt), + expirationStartTimestamp: setExpirationStartTimestamp( + 'deleteAfterRead', + readAt, + isLegacyMode + ), }); } @@ -1252,7 +1260,9 @@ export class MessageModel extends Backbone.Model { } const expiresAt = start + delta; - this.set({ expires_at: expiresAt }); + this.set({ + expires_at: expiresAt, + }); const id = this.get('id'); if (id) { await this.commit(); @@ -1263,7 +1273,12 @@ export class MessageModel extends Backbone.Model { sentAt: this.get('sent_at'), }); - if (this.get('expirationType') === 'deleteAfterRead') { + // TODO do we not need to do deleteAfterSend here? + // TODO legacy messages support will be removed in a future release + if ( + this.get('expirationType') === 'legacy' || + this.get('expirationType') === 'deleteAfterRead' + ) { const messageHash = this.get('messageHash'); if (messageHash) { await expireMessageOnSnode(messageHash, this.get('expireTimer')); diff --git a/ts/receiver/queuedJob.ts b/ts/receiver/queuedJob.ts index 14ec983e8..ba11cb602 100644 --- a/ts/receiver/queuedJob.ts +++ b/ts/receiver/queuedJob.ts @@ -163,9 +163,17 @@ function updateReadStatus(message: MessageModel) { if (message.isExpirationTimerUpdate()) { message.set({ unread: 0 }); - if (message.get('expirationType') === 'deleteAfterRead' && message.get('expireTimer')) { + const expirationType = message.get('expirationType'); + // TODO legacy messages support will be removed in a future release + const convo = message.getConversation(); + const isLegacyMode = convo && convo.isPrivate() && expirationType === 'legacy'; + if ((isLegacyMode || expirationType === 'deleteAfterRead') && message.get('expireTimer')) { message.set({ - expirationStartTimestamp: setExpirationStartTimestamp('deleteAfterRead'), + expirationStartTimestamp: setExpirationStartTimestamp( + 'deleteAfterRead', + undefined, + isLegacyMode + ), }); } } diff --git a/ts/session/messages/outgoing/ExpirableMessage.ts b/ts/session/messages/outgoing/ExpirableMessage.ts index cb9cb32ee..c5a207e87 100644 --- a/ts/session/messages/outgoing/ExpirableMessage.ts +++ b/ts/session/messages/outgoing/ExpirableMessage.ts @@ -33,6 +33,7 @@ export class ExpirableMessage extends ContentMessage { return this.expirationType; } + // TODO need to account for legacy messages here? public ttl(): number { switch (this.expirationType) { case 'deleteAfterSend': diff --git a/ts/session/messages/outgoing/visibleMessage/VisibleMessage.ts b/ts/session/messages/outgoing/visibleMessage/VisibleMessage.ts index 5c21bd61e..87cd986a2 100644 --- a/ts/session/messages/outgoing/visibleMessage/VisibleMessage.ts +++ b/ts/session/messages/outgoing/visibleMessage/VisibleMessage.ts @@ -186,6 +186,11 @@ export class VisibleMessage extends ExpirableMessage { dataMessage.timestamp = this.timestamp; + // TODO legacy messages support will be removed in a future release + if (this.expirationType === 'legacy' && this.expireTimer) { + dataMessage.expireTimer = this.expireTimer; + } + return dataMessage; } diff --git a/ts/session/sending/MessageSentHandler.ts b/ts/session/sending/MessageSentHandler.ts index 9b95178ad..f55d85a65 100644 --- a/ts/session/sending/MessageSentHandler.ts +++ b/ts/session/sending/MessageSentHandler.ts @@ -122,12 +122,18 @@ async function handleMessageSentSuccess( sentTo = _.union(sentTo, [sentMessage.device]); + const expirationType = fetchedMessage.get('expirationType'); + // TODO legacy messages support will be removed in a future release + const convo = fetchedMessage.getConversation(); + const isLegacyMode = convo && convo.isPrivate() && expirationType === 'legacy'; + const markAsUnread = isLegacyMode || expirationType === 'deleteAfterRead'; + fetchedMessage.set({ sent_to: sentTo, sent: true, sent_at: effectiveTimestamp, // TODO message status overrides this for some reason in the UI, message still disappears though - unread: fetchedMessage.get('expirationType') === 'deleteAfterRead' ? 1 : 0, + unread: markAsUnread ? 1 : 0, }); if ( diff --git a/ts/types/LocalizerKeys.ts b/ts/types/LocalizerKeys.ts index b604c1633..34d826470 100644 --- a/ts/types/LocalizerKeys.ts +++ b/ts/types/LocalizerKeys.ts @@ -182,7 +182,9 @@ export type LocalizerKeys = | 'timerModeRead' | 'timerModeSent' | 'youChangedTheTimer' + | 'youChangedTheTimerLegacy' | 'theyChangedTheTimer' + | 'theyChangedTheTimerLegacy' | 'timerOption_0_seconds' | 'timerOption_5_seconds' | 'timerOption_10_seconds' diff --git a/ts/util/expiringMessages.ts b/ts/util/expiringMessages.ts index 4679fdb41..72160270f 100644 --- a/ts/util/expiringMessages.ts +++ b/ts/util/expiringMessages.ts @@ -208,14 +208,16 @@ export const ExpirationTimerOptions = { export function setExpirationStartTimestamp( mode: DisappearingMessageType, - timestamp?: number + timestamp?: number, + isLegacyMode?: boolean ): number | undefined { let expirationStartTimestamp: number | undefined = getNowWithNetworkOffset(); + // TODO legacy messages support will be removed in a future release if (timestamp) { window.log.info( - `WIP: We compare 2 timestamps for a delete after ${ - mode === 'deleteAfterRead' ? 'read' : 'send' + `WIP: We compare 2 timestamps for a disappear ${ + isLegacyMode ? 'legacy' : mode === 'deleteAfterRead' ? 'after read' : 'after send' } message: \expirationStartTimestamp `, new Date(expirationStartTimestamp).toLocaleTimeString(), '\ntimestamp ', @@ -224,17 +226,18 @@ export function setExpirationStartTimestamp( expirationStartTimestamp = Math.min(expirationStartTimestamp, timestamp); } + // TODO legacy messages support will be removed in a future release if (mode === 'deleteAfterRead') { window.log.info( - `WIP: We set the start timestamp for a delete after read message to ${new Date( - expirationStartTimestamp - ).toLocaleTimeString()}` + `WIP: We set the start timestamp for a ${ + isLegacyMode ? 'legacy ' : '' + }delete after read message to ${new Date(expirationStartTimestamp).toLocaleTimeString()}` ); } else if (mode === 'deleteAfterSend') { window.log.info( - `WIP: We set the start timestamp for a delete after send message to ${new Date( - expirationStartTimestamp - ).toLocaleTimeString()}` + `WIP: We set the start timestamp for a ${ + isLegacyMode ? 'legacy ' : '' + }delete after send message to ${new Date(expirationStartTimestamp).toLocaleTimeString()}` ); } else if (mode === 'off') { window.log.info(`WIP: Disappearing message mode "${mode}" set. We can safely ignore this.`);