signal-desktop/ts/util/isConversationAccepted.ts

91 lines
2.6 KiB
TypeScript

// 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) > 0;
const hasMessagesBeforeMessageRequests =
(conversationAttrs.messageCountBeforeMessageRequests || 0) > 0;
const hasNoMessages = (conversationAttrs.messageCount || 0) === 0;
const isEmptyPrivateConvo =
hasNoMessages &&
isDirectConversation(conversationAttrs) &&
!ignoreEmptyConvo;
const isEmptyWhitelistedGroup =
hasNoMessages &&
!isDirectConversation(conversationAttrs) &&
Boolean(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')
);
}