// Copyright 2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { ConversationAttributesType } from '../model-types.d'; import { SignalService as Proto } from '../protobuf'; import { isDirectConversation, isMe } from './whatTypeOfConversation'; import { isInSystemContacts } from './isInSystemContacts'; /** * Determine if this conversation should be considered "accepted" in terms * of message requests */ export function isConversationAccepted( conversationAttrs: ConversationAttributesType, { ignoreEmptyConvo = false } = {} ): boolean { const messageRequestsEnabled = window.Signal.RemoteConfig.isEnabled( 'desktop.messageRequests' ); if (!messageRequestsEnabled) { return true; } if (isMe(conversationAttrs)) { return true; } const messageRequestEnum = Proto.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) && !ignoreEmptyConvo; 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 ( isInSystemContacts(conversationAttrs) || Boolean(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') ); }