97 lines
2.4 KiB
TypeScript
97 lines
2.4 KiB
TypeScript
// Copyright 2021 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import type { ConversationAttributesType } from '../model-types.d';
|
|
import type { ConversationType } from '../state/ducks/conversations';
|
|
import * as Bytes from '../Bytes';
|
|
import * as log from '../logging/log';
|
|
|
|
export enum ConversationTypes {
|
|
Me = 'Me',
|
|
Direct = 'Direct',
|
|
GroupV1 = 'GroupV1',
|
|
GroupV2 = 'GroupV2',
|
|
}
|
|
|
|
export function isDirectConversation(
|
|
conversationAttrs:
|
|
| Pick<ConversationAttributesType, 'type'>
|
|
| Pick<ConversationType, 'type'>
|
|
): boolean {
|
|
return (
|
|
conversationAttrs.type === 'private' || conversationAttrs.type === 'direct'
|
|
);
|
|
}
|
|
|
|
export function isMe(conversationAttrs: ConversationAttributesType): boolean {
|
|
const { e164, uuid } = conversationAttrs;
|
|
const ourNumber = window.textsecure.storage.user.getNumber();
|
|
const ourUuid = window.textsecure.storage.user.getUuid()?.toString();
|
|
return Boolean((e164 && e164 === ourNumber) || (uuid && uuid === ourUuid));
|
|
}
|
|
|
|
export function isGroup(
|
|
conversationAttrs: Pick<
|
|
ConversationAttributesType,
|
|
'groupId' | 'groupVersion'
|
|
>
|
|
): boolean {
|
|
return isGroupV2(conversationAttrs) || isGroupV1(conversationAttrs);
|
|
}
|
|
|
|
export function isGroupV1(
|
|
conversationAttrs: Pick<ConversationAttributesType, 'groupId'>
|
|
): boolean {
|
|
const { groupId } = conversationAttrs;
|
|
if (!groupId) {
|
|
return false;
|
|
}
|
|
|
|
const buffer = Bytes.fromBinary(groupId);
|
|
return buffer.byteLength === window.Signal.Groups.ID_V1_LENGTH;
|
|
}
|
|
|
|
export function isGroupV2(
|
|
conversationAttrs: Pick<
|
|
ConversationAttributesType,
|
|
'groupId' | 'groupVersion'
|
|
>
|
|
): boolean {
|
|
const { groupId, groupVersion = 0 } = conversationAttrs;
|
|
if (!groupId) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
return (
|
|
groupVersion === 2 &&
|
|
Bytes.fromBase64(groupId).byteLength === window.Signal.Groups.ID_LENGTH
|
|
);
|
|
} catch (error) {
|
|
log.error('isGroupV2: Failed to process groupId in base64!');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function typeofConversation(
|
|
conversationAttrs: ConversationAttributesType
|
|
): ConversationTypes | undefined {
|
|
if (isMe(conversationAttrs)) {
|
|
return ConversationTypes.Me;
|
|
}
|
|
|
|
if (isDirectConversation(conversationAttrs)) {
|
|
return ConversationTypes.Direct;
|
|
}
|
|
|
|
if (isGroupV2(conversationAttrs)) {
|
|
return ConversationTypes.GroupV2;
|
|
}
|
|
|
|
if (isGroupV1(conversationAttrs)) {
|
|
return ConversationTypes.GroupV1;
|
|
}
|
|
|
|
return undefined;
|
|
}
|