@ -310,6 +310,7 @@ export function isLegacyDisappearingModeEnabled(
* /
* /
export function changeToDisappearingMessageType (
export function changeToDisappearingMessageType (
convo : ConversationModel ,
convo : ConversationModel ,
expireTimer : number ,
expirationType? : DisappearingMessageConversationType
expirationType? : DisappearingMessageConversationType
) : DisappearingMessageType {
) : DisappearingMessageType {
if ( expirationType === 'off' || expirationType === 'legacy' ) {
if ( expirationType === 'off' || expirationType === 'legacy' ) {
@ -317,10 +318,14 @@ export function changeToDisappearingMessageType(
return 'unknown' ;
return 'unknown' ;
}
}
if ( convo . isMe ( ) || convo . isClosedGroup ( ) ) {
if ( expireTimer > 0 ) {
return 'deleteAfterSend' ;
if ( convo . isMe ( ) || convo . isClosedGroup ( ) ) {
return 'deleteAfterSend' ;
}
return 'deleteAfterRead' ;
}
}
return 'deleteAfterRead' ;
return 'unknown' ;
}
}
// TODO legacy messages support will be removed in a future release
// TODO legacy messages support will be removed in a future release
@ -368,9 +373,9 @@ function checkIsLegacyDisappearingDataMessage(dataMessage: SignalService.DataMes
// TODO legacy messages support will be removed in a future release
// TODO legacy messages support will be removed in a future release
export async function checkForExpireUpdateInContentMessage (
export async function checkForExpireUpdateInContentMessage (
con voToUpdate: ConversationModel ,
con tent: SignalService.Content ,
con tent: SignalService.Content
con voToUpdate: ConversationModel
) : Promise < DisappearingMessageUpdate | undefined > {
) : Promise < DisappearingMessageUpdate > {
const dataMessage = content . dataMessage as SignalService . DataMessage ;
const dataMessage = content . dataMessage as SignalService . DataMessage ;
// We will only support legacy disappearing messages for a short period before disappearing messages v2 is unlocked
// We will only support legacy disappearing messages for a short period before disappearing messages v2 is unlocked
const isDisappearingMessagesV2Released = await ReleasedFeatures . checkIsDisappearMessageV2FeatureReleased ( ) ;
const isDisappearingMessagesV2Released = await ReleasedFeatures . checkIsDisappearMessageV2FeatureReleased ( ) ;
@ -382,17 +387,16 @@ export async function checkForExpireUpdateInContentMessage(
) ;
) ;
const isLegacyConversationSettingMessage = isDisappearingMessagesV2Released
const isLegacyConversationSettingMessage = isDisappearingMessagesV2Released
? isLegacyContentMessage &&
? isLegacyContentMessage &&
isLegacyDataMessage &&
( isLegacyDataMessage || ! content . lastDisappearingMessageChangeTimestamp ) &&
dataMessage . flags === SignalService . DataMessage . Flags . EXPIRATION_TIMER_UPDATE
dataMessage . flags === SignalService . DataMessage . Flags . EXPIRATION_TIMER_UPDATE
: isLegacyContentMessage &&
: isLegacyContentMessage &&
dataMessage . flags === SignalService . DataMessage . Flags . EXPIRATION_TIMER_UPDATE ;
dataMessage . flags === SignalService . DataMessage . Flags . EXPIRATION_TIMER_UPDATE ;
le t expirationTimer = isLegacyDataMessage
cons t expirationTimer = isLegacyDataMessage
? Number ( dataMessage . expireTimer )
? Number ( dataMessage . expireTimer )
: content . expirationTimer ;
: content . expirationTimer ;
// NOTE This starts are a DisappearingMessageConversationType but we will convert it to a DisappearingMessageType for the final return
const expirationMode = changeToDisappearingMessageConversationType (
let expirationMode : any = changeToDisappearingMessageConversationType (
convoToUpdate ,
convoToUpdate ,
DisappearingMessageMode [ content . expirationType ] ,
DisappearingMessageMode [ content . expirationType ] ,
expirationTimer
expirationTimer
@ -402,13 +406,14 @@ export async function checkForExpireUpdateInContentMessage(
? Number ( content . lastDisappearingMessageChangeTimestamp )
? Number ( content . lastDisappearingMessageChangeTimestamp )
: undefined ;
: undefined ;
// TODO should review this
const expireUpdate : DisappearingMessageUpdate = {
const shouldDisappearButIsntMessage =
expirationType : changeToDisappearingMessageType ( convoToUpdate , expirationTimer , expirationMode ) ,
dataMessage . flags !== SignalService . DataMessage . Flags . EXPIRATION_TIMER_UPDATE &&
expirationTimer ,
expirationMode === 'off' &&
lastDisappearingMessageChangeTimestamp ,
expirationTimer === 0 &&
isLegacyConversationSettingMessage ,
convoToUpdate . get ( 'expirationType' ) !== 'off' &&
isLegacyDataMessage ,
convoToUpdate . get ( 'expireTimer' ) !== 0 ;
isDisappearingMessagesV2Released ,
} ;
// NOTE some platforms do not include the diappearing message values in the Data Message for sent messages so we have to trust the conversation settings until v2 is released
// NOTE some platforms do not include the diappearing message values in the Data Message for sent messages so we have to trust the conversation settings until v2 is released
if (
if (
@ -426,15 +431,27 @@ export async function checkForExpireUpdateInContentMessage(
content ,
content ,
convoToUpdate
convoToUpdate
) ;
) ;
expirationTimer = convoToUpdate . get ( 'expireTimer' ) ;
expirationMode = changeToDisappearingMessageType (
expireUpdate . expirationTimer = convoToUpdate . get ( 'expireTimer' ) ;
expireUpdate . expirationType = changeToDisappearingMessageType (
convoToUpdate ,
convoToUpdate ,
expireUpdate . expirationTimer ,
convoToUpdate . get ( 'expirationType' )
convoToUpdate . get ( 'expirationType' )
) ;
) ;
expireUpdate . isLegacyDataMessage = true ;
}
}
}
}
// NOTE If it is a legacy message and disappearing messages v2 is released then we ignore it and use the local client's conversation settings
// TODO should review this
// NOTE this is only required for legacy disappearing message conversation settings I think?
const shouldDisappearButIsntMessage =
dataMessage . flags !== SignalService . DataMessage . Flags . EXPIRATION_TIMER_UPDATE &&
expirationMode === 'off' &&
expirationTimer === 0 &&
convoToUpdate . get ( 'expirationType' ) !== 'off' &&
convoToUpdate . get ( 'expireTimer' ) !== 0 ;
// NOTE If it is a legacy message and disappearing messages v2 is released then we ignore it and use the local client's conversation settings andshow the outdated client banner
if (
if (
isDisappearingMessagesV2Released &&
isDisappearingMessagesV2Released &&
( isLegacyDataMessage || isLegacyConversationSettingMessage || shouldDisappearButIsntMessage )
( isLegacyDataMessage || isLegacyConversationSettingMessage || shouldDisappearButIsntMessage )
@ -443,24 +460,21 @@ export async function checkForExpireUpdateInContentMessage(
'WIP: Received a legacy disappearing message after v2 was released. Overriding it with the conversation settings' ,
'WIP: Received a legacy disappearing message after v2 was released. Overriding it with the conversation settings' ,
content
content
) ;
) ;
expirationTimer = convoToUpdate . get ( 'expireTimer' ) ;
expirationMode = convoToUpdate . get ( 'expirationType' ) ;
}
const expireUpdate : DisappearingMessageUpdate = {
expireUpdate . expirationTimer = convoToUpdate . get ( 'expireTimer' ) ;
expir ationType: changeToDisappearingMessageType ( convoToUpdate , expirationMode ) ,
expireUpdate . expirationType = changeToDisappearingMessageType (
expirationTimer ,
convoToUpdate ,
lastDisappearingMessageChangeTimestamp ,
expireUpdate . expirationTimer ,
isLegacyConversationSettingMessage ,
convoToUpdate . get ( 'expirationType' )
isLegacyDataMessage ,
) ;
isDisappearingMessagesV2Released,
expireUpdate. isLegacyDataMessage = true ;
} ;
}
return expireUpdate ;
return expireUpdate ;
}
}
// TODO legacy messages support will be removed in a future release
// TODO legacy messages support will be removed in a future release
export function handleExpireUpdat e(
export function updateMessageModelToExpir e(
converationModel : ConversationModel ,
converationModel : ConversationModel ,
messageModel : MessageModel ,
messageModel : MessageModel ,
expireUpdate? : DisappearingMessageUpdate
expireUpdate? : DisappearingMessageUpdate
@ -470,7 +484,9 @@ export function handleExpireUpdate(
}
}
if ( converationModel . isPublic ( ) ) {
if ( converationModel . isPublic ( ) ) {
window . log . warn ( "updateExpireTimer() Disappearing messages aren't supported in communities" ) ;
window . log . warn (
"updateMessageModelToExpire() Disappearing messages aren't supported in communities"
) ;
return messageModel ;
return messageModel ;
}
}
@ -514,12 +530,14 @@ export async function checkHasOutdatedClient(
sender : ConversationModel ,
sender : ConversationModel ,
expireUpdate : DisappearingMessageUpdate
expireUpdate : DisappearingMessageUpdate
) {
) {
const isOutdated =
expireUpdate . isLegacyDataMessage || expireUpdate . isLegacyConversationSettingMessage ;
const outdatedSender =
const outdatedSender =
sender . get ( 'nickname' ) || sender . get ( 'displayNameInProfile' ) || sender . get ( 'id' ) ;
sender . get ( 'nickname' ) || sender . get ( 'displayNameInProfile' ) || sender . get ( 'id' ) ;
if ( convoToUpdate . get ( 'hasOutdatedClient' ) ) {
if ( convoToUpdate . get ( 'hasOutdatedClient' ) ) {
// trigger notice banner
// trigger notice banner
if ( expireUpdate. isLegacyDataMessage || expireUpdate . isLegacyConversationSettingMessage ) {
if ( isOutdated ) {
if ( convoToUpdate . get ( 'hasOutdatedClient' ) !== outdatedSender ) {
if ( convoToUpdate . get ( 'hasOutdatedClient' ) !== outdatedSender ) {
convoToUpdate . set ( {
convoToUpdate . set ( {
hasOutdatedClient : outdatedSender ,
hasOutdatedClient : outdatedSender ,
@ -534,7 +552,7 @@ export async function checkHasOutdatedClient(
return ;
return ;
}
}
if ( expireUpdate. isLegacyDataMessage || expireUpdate . isLegacyConversationSettingMessage ) {
if ( isOutdated ) {
convoToUpdate . set ( {
convoToUpdate . set ( {
hasOutdatedClient : outdatedSender ,
hasOutdatedClient : outdatedSender ,
} ) ;
} ) ;