diff --git a/ts/components/conversation/TimerNotification.tsx b/ts/components/conversation/TimerNotification.tsx index 4ed9b45bf..2dd26fc7d 100644 --- a/ts/components/conversation/TimerNotification.tsx +++ b/ts/components/conversation/TimerNotification.tsx @@ -187,6 +187,7 @@ export const TimerNotification = (props: PropsForExpirationTimer) => { const textToRender = useTextToRender(props); const isGroupOrCommunity = useSelectedIsGroupOrCommunity(); const isGroupV2 = useSelectedIsGroupV2(); + // renderOff is true when the update is put to off, or when we have a legacy group control message (as they are not expiring at all) const renderOffIcon = props.disabled || (isGroupOrCommunity && !isGroupV2); if (!textToRender || textToRender.length === 0) { diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index 93b053402..4423c0ca6 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -882,15 +882,23 @@ export class ConversationModel extends Backbone.Model { expirationMode = 'off'; expireTimer = 0; } + const shouldAddExpireUpdateMsgPrivate = this.isPrivate() && !fromConfigMessage; + const isLegacyGroup = this.isClosedGroup() && !PubKey.isClosedGroupV3(this.id); + + /** + * it's ugly, but we want to add a message for legacy groups only when + * - not coming from a config message + * - effectively changes the setting + * - ignores a off setting for a legacy group (as we can get a setting from restored from configMessage, and a newgroup can still be in the swarm when linking a device + */ + const shouldAddExpireUpdateMsgGroup = + isLegacyGroup && + !fromConfigMessage && + (expirationMode !== this.get('expirationMode') || expireTimer !== this.get('expireTimer')) && + expirationMode !== 'off'; + const shouldAddExpireUpdateMessage = - (this.isPrivate() && !fromConfigMessage) || - (this.isClosedGroup() && - !PubKey.isClosedGroupV3(this.id) && - !fromConfigMessage && - expirationMode !== this.get('expirationMode') && - expireTimer !== this.get('expireTimer') && - expirationMode !== 'off' && - expireTimer !== 0); + shouldAddExpireUpdateMsgPrivate || shouldAddExpireUpdateMsgGroup; // When we add a disappearing messages notification to the conversation, we want it // to be above the message that initiated that change, hence the subtraction. diff --git a/ts/session/messages/outgoing/controlMessage/ExpirationTimerUpdateMessage.ts b/ts/session/messages/outgoing/controlMessage/ExpirationTimerUpdateMessage.ts index effb98a2d..c9bb43820 100644 --- a/ts/session/messages/outgoing/controlMessage/ExpirationTimerUpdateMessage.ts +++ b/ts/session/messages/outgoing/controlMessage/ExpirationTimerUpdateMessage.ts @@ -1,4 +1,5 @@ import { SignalService } from '../../../../protobuf'; +import { TTL_DEFAULT } from '../../../constants'; import { PubKey } from '../../../types'; import { StringUtils } from '../../../utils'; import { DataMessage } from '../DataMessage'; @@ -60,4 +61,11 @@ export class ExpirationTimerUpdateMessage extends DataMessage { return data; } + + public ttl(): number { + if (this.groupId) { + return TTL_DEFAULT.CONTENT_MESSAGE; + } + return super.ttl(); + } }