signal-desktop/ts/util/isConversationAccepted.ts

85 lines
2.4 KiB
TypeScript
Raw Normal View History

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { ConversationAttributesType } from '../model-types.d';
import { isDirectConversation, isMe } from './whatTypeOfConversation';
/**
* Determine if this conversation should be considered "accepted" in terms
* of message requests
*/
export function isConversationAccepted(
conversationAttrs: ConversationAttributesType
): boolean {
const messageRequestsEnabled = window.Signal.RemoteConfig.isEnabled(
'desktop.messageRequests'
);
if (!messageRequestsEnabled) {
return true;
}
if (isMe(conversationAttrs)) {
return true;
}
const messageRequestEnum =
window.textsecure.protobuf.SyncMessage.MessageRequestResponse.Type;
const { messageRequestResponseType } = conversationAttrs;
if (messageRequestResponseType === messageRequestEnum.ACCEPT) {
return true;
}
const { sentMessageCount } = conversationAttrs;
const hasSentMessages = sentMessageCount > 0;
const hasMessagesBeforeMessageRequests =
(conversationAttrs.messageCountBeforeMessageRequests || 0) > 0;
const hasNoMessages = (conversationAttrs.messageCount || 0) === 0;
const isEmptyPrivateConvo =
hasNoMessages && isDirectConversation(conversationAttrs);
const isEmptyWhitelistedGroup =
hasNoMessages &&
!isDirectConversation(conversationAttrs) &&
conversationAttrs.profileSharing;
return (
isFromOrAddedByTrustedContact(conversationAttrs) ||
hasSentMessages ||
hasMessagesBeforeMessageRequests ||
// an empty group is the scenario where we need to rely on
// whether the profile has already been shared or not
isEmptyPrivateConvo ||
isEmptyWhitelistedGroup
);
}
// Is this someone who is a contact, or are we sharing our profile with them?
// Or is the person who added us to this group a contact or are we sharing profile
// with them?
function isFromOrAddedByTrustedContact(
conversationAttrs: ConversationAttributesType
): boolean {
if (isDirectConversation(conversationAttrs)) {
return Boolean(conversationAttrs.name || conversationAttrs.profileSharing);
}
const { addedBy } = conversationAttrs;
if (!addedBy) {
return false;
}
const conversation = window.ConversationController.get(addedBy);
if (!conversation) {
return false;
}
return Boolean(
isMe(conversation.attributes) ||
conversation.get('name') ||
conversation.get('profileSharing')
);
}