No Backbone in data layer; server/client interfaces are now similar
This commit is contained in:
parent
064bbfe97a
commit
34fd945f83
31 changed files with 573 additions and 1021 deletions
|
@ -9,7 +9,6 @@ import type {
|
|||
ConversationModelCollectionType,
|
||||
LastMessageStatus,
|
||||
MessageAttributesType,
|
||||
MessageModelCollectionType,
|
||||
QuotedMessageType,
|
||||
SenderKeyInfoType,
|
||||
VerificationOptions,
|
||||
|
@ -38,6 +37,7 @@ import type {
|
|||
CustomColorType,
|
||||
} from '../types/Colors';
|
||||
import type { MessageModel } from './messages';
|
||||
import { getContact } from '../messages/helpers';
|
||||
import { strictAssert } from '../util/assert';
|
||||
import { isMuted } from '../util/isMuted';
|
||||
import { isConversationSMSOnly } from '../util/isConversationSMSOnly';
|
||||
|
@ -1305,12 +1305,6 @@ export class ConversationModel extends window.Backbone
|
|||
});
|
||||
}
|
||||
|
||||
async cleanup(): Promise<void> {
|
||||
await Conversation.deleteExternalFiles(this.attributes, {
|
||||
deleteAttachmentData,
|
||||
});
|
||||
}
|
||||
|
||||
async onNewMessage(message: MessageModel): Promise<void> {
|
||||
const uuid = message.get('sourceUuid');
|
||||
const e164 = message.get('source');
|
||||
|
@ -1407,13 +1401,11 @@ export class ConversationModel extends window.Backbone
|
|||
let scrollToLatestUnread = true;
|
||||
|
||||
if (newestMessageId) {
|
||||
const newestInMemoryMessage = await getMessageById(newestMessageId, {
|
||||
Message: window.Whisper.Message,
|
||||
});
|
||||
const newestInMemoryMessage = await getMessageById(newestMessageId);
|
||||
if (newestInMemoryMessage) {
|
||||
// If newest in-memory message is unread, scrolling down would mean going to
|
||||
// the very bottom, not the oldest unread.
|
||||
if (isMessageUnread(newestInMemoryMessage.attributes)) {
|
||||
if (isMessageUnread(newestInMemoryMessage)) {
|
||||
scrollToLatestUnread = false;
|
||||
}
|
||||
} else {
|
||||
|
@ -1443,7 +1435,6 @@ export class ConversationModel extends window.Backbone
|
|||
|
||||
const messages = await getOlderMessagesByConversation(conversationId, {
|
||||
limit: MESSAGE_LOAD_CHUNK_SIZE,
|
||||
MessageCollection: window.Whisper.MessageCollection,
|
||||
});
|
||||
|
||||
const cleaned: Array<MessageModel> = await this.cleanModels(messages);
|
||||
|
@ -1481,23 +1472,20 @@ export class ConversationModel extends window.Backbone
|
|||
const finish = this.setInProgressFetch();
|
||||
|
||||
try {
|
||||
const message = await getMessageById(oldestMessageId, {
|
||||
Message: window.Whisper.Message,
|
||||
});
|
||||
const message = await getMessageById(oldestMessageId);
|
||||
if (!message) {
|
||||
throw new Error(
|
||||
`loadOlderMessages: failed to load message ${oldestMessageId}`
|
||||
);
|
||||
}
|
||||
|
||||
const receivedAt = message.get('received_at');
|
||||
const sentAt = message.get('sent_at');
|
||||
const receivedAt = message.received_at;
|
||||
const sentAt = message.sent_at;
|
||||
const models = await getOlderMessagesByConversation(conversationId, {
|
||||
receivedAt,
|
||||
sentAt,
|
||||
messageId: oldestMessageId,
|
||||
limit: MESSAGE_LOAD_CHUNK_SIZE,
|
||||
MessageCollection: window.Whisper.MessageCollection,
|
||||
});
|
||||
|
||||
if (models.length < 1) {
|
||||
|
@ -1533,22 +1521,19 @@ export class ConversationModel extends window.Backbone
|
|||
const finish = this.setInProgressFetch();
|
||||
|
||||
try {
|
||||
const message = await getMessageById(newestMessageId, {
|
||||
Message: window.Whisper.Message,
|
||||
});
|
||||
const message = await getMessageById(newestMessageId);
|
||||
if (!message) {
|
||||
throw new Error(
|
||||
`loadNewerMessages: failed to load message ${newestMessageId}`
|
||||
);
|
||||
}
|
||||
|
||||
const receivedAt = message.get('received_at');
|
||||
const sentAt = message.get('sent_at');
|
||||
const receivedAt = message.received_at;
|
||||
const sentAt = message.sent_at;
|
||||
const models = await getNewerMessagesByConversation(conversationId, {
|
||||
receivedAt,
|
||||
sentAt,
|
||||
limit: MESSAGE_LOAD_CHUNK_SIZE,
|
||||
MessageCollection: window.Whisper.MessageCollection,
|
||||
});
|
||||
|
||||
if (models.length < 1) {
|
||||
|
@ -1587,33 +1572,29 @@ export class ConversationModel extends window.Backbone
|
|||
const finish = this.setInProgressFetch();
|
||||
|
||||
try {
|
||||
const message = await getMessageById(messageId, {
|
||||
Message: window.Whisper.Message,
|
||||
});
|
||||
const message = await getMessageById(messageId);
|
||||
if (!message) {
|
||||
throw new Error(
|
||||
`loadMoreAndScroll: failed to load message ${messageId}`
|
||||
);
|
||||
}
|
||||
|
||||
const receivedAt = message.get('received_at');
|
||||
const sentAt = message.get('sent_at');
|
||||
const receivedAt = message.received_at;
|
||||
const sentAt = message.sent_at;
|
||||
const older = await getOlderMessagesByConversation(conversationId, {
|
||||
limit: MESSAGE_LOAD_CHUNK_SIZE,
|
||||
receivedAt,
|
||||
sentAt,
|
||||
messageId,
|
||||
MessageCollection: window.Whisper.MessageCollection,
|
||||
});
|
||||
const newer = await getNewerMessagesByConversation(conversationId, {
|
||||
limit: MESSAGE_LOAD_CHUNK_SIZE,
|
||||
receivedAt,
|
||||
sentAt,
|
||||
MessageCollection: window.Whisper.MessageCollection,
|
||||
});
|
||||
const metrics = await getMessageMetricsForConversation(conversationId);
|
||||
|
||||
const all = [...older.models, message, ...newer.models];
|
||||
const all = [...older, message, ...newer];
|
||||
|
||||
const cleaned: Array<MessageModel> = await this.cleanModels(all);
|
||||
const scrollToMessageId =
|
||||
|
@ -1636,19 +1617,18 @@ export class ConversationModel extends window.Backbone
|
|||
}
|
||||
|
||||
async cleanModels(
|
||||
collection: MessageModelCollectionType | Array<MessageModel>
|
||||
messages: ReadonlyArray<MessageAttributesType>
|
||||
): Promise<Array<MessageModel>> {
|
||||
const result = collection
|
||||
.filter((message: MessageModel) => Boolean(message.id))
|
||||
.map((message: MessageModel) =>
|
||||
window.MessageController.register(message.id, message)
|
||||
);
|
||||
const result = messages
|
||||
.filter(message => Boolean(message.id))
|
||||
.map(message => window.MessageController.register(message.id, message));
|
||||
|
||||
const eliminated = collection.length - result.length;
|
||||
const eliminated = messages.length - result.length;
|
||||
if (eliminated > 0) {
|
||||
log.warn(`cleanModels: Eliminated ${eliminated} messages without an id`);
|
||||
}
|
||||
|
||||
let upgraded = 0;
|
||||
for (let max = result.length, i = 0; i < max; i += 1) {
|
||||
const message = result[i];
|
||||
const { attributes } = message;
|
||||
|
@ -1661,8 +1641,12 @@ export class ConversationModel extends window.Backbone
|
|||
message.set(upgradedMessage);
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await window.Signal.Data.saveMessage(upgradedMessage);
|
||||
upgraded += 1;
|
||||
}
|
||||
}
|
||||
if (upgraded > 0) {
|
||||
log.warn(`cleanModels: Upgraded schema of ${upgraded} messages`);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -1972,18 +1956,17 @@ export class ConversationModel extends window.Backbone
|
|||
): Promise<void> {
|
||||
const { isLocalAction } = options;
|
||||
|
||||
let messages: MessageModelCollectionType | undefined;
|
||||
let messages: Array<MessageAttributesType> | undefined;
|
||||
do {
|
||||
const first = messages ? messages.first() : undefined;
|
||||
const first = messages ? messages[0] : undefined;
|
||||
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
messages = await window.Signal.Data.getOlderMessagesByConversation(
|
||||
this.get('id'),
|
||||
{
|
||||
MessageCollection: window.Whisper.MessageCollection,
|
||||
limit: 100,
|
||||
receivedAt: first ? first.get('received_at') : undefined,
|
||||
sentAt: first ? first.get('sent_at') : undefined,
|
||||
receivedAt: first ? first.received_at : undefined,
|
||||
sentAt: first ? first.sent_at : undefined,
|
||||
messageId: first ? first.id : undefined,
|
||||
}
|
||||
);
|
||||
|
@ -1992,9 +1975,7 @@ export class ConversationModel extends window.Backbone
|
|||
return;
|
||||
}
|
||||
|
||||
const readMessages = messages.filter(
|
||||
m => !hasErrors(m.attributes) && isIncoming(m.attributes)
|
||||
);
|
||||
const readMessages = messages.filter(m => !hasErrors(m) && isIncoming(m));
|
||||
|
||||
if (isLocalAction) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
|
@ -2002,9 +1983,9 @@ export class ConversationModel extends window.Backbone
|
|||
window.storage,
|
||||
readMessages.map(m => ({
|
||||
messageId: m.id,
|
||||
senderE164: m.get('source'),
|
||||
senderUuid: m.get('sourceUuid'),
|
||||
timestamp: m.get('sent_at'),
|
||||
senderE164: m.source,
|
||||
senderUuid: m.sourceUuid,
|
||||
timestamp: m.sent_at,
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
@ -3209,10 +3190,7 @@ export class ConversationModel extends window.Backbone
|
|||
|
||||
const message = window.MessageController.getById(notificationId);
|
||||
if (message) {
|
||||
message.cleanup();
|
||||
window.Signal.Data.removeMessage(message.id, {
|
||||
Message: window.Whisper.Message,
|
||||
});
|
||||
window.Signal.Data.removeMessage(message.id);
|
||||
}
|
||||
|
||||
if (this.get('expireTimer') || forceRemove) {
|
||||
|
@ -3628,7 +3606,7 @@ export class ConversationModel extends window.Backbone
|
|||
async makeQuote(quotedMessage: MessageModel): Promise<QuotedMessageType> {
|
||||
const { getName } = EmbeddedContact;
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const contact = quotedMessage.getContact()!;
|
||||
const contact = getContact(quotedMessage.attributes)!;
|
||||
const attachments = quotedMessage.get('attachments');
|
||||
const preview = quotedMessage.get('preview');
|
||||
const sticker = quotedMessage.get('sticker');
|
||||
|
@ -4082,7 +4060,6 @@ export class ConversationModel extends window.Backbone
|
|||
const lastMessages = await window.Signal.Data.getLastConversationMessages({
|
||||
conversationId,
|
||||
ourUuid,
|
||||
Message: window.Whisper.Message,
|
||||
});
|
||||
|
||||
// This runs as a job to avoid race conditions
|
||||
|
@ -4090,22 +4067,21 @@ export class ConversationModel extends window.Backbone
|
|||
this.maybeSetPendingUniversalTimer(lastMessages.hasUserInitiatedMessages)
|
||||
);
|
||||
|
||||
let { preview: previewMessage, activity: activityMessage } = lastMessages;
|
||||
const { preview, activity } = lastMessages;
|
||||
let previewMessage: MessageModel | undefined;
|
||||
let activityMessage: MessageModel | undefined;
|
||||
|
||||
// Register the message with MessageController so that if it already exists
|
||||
// in memory we use that data instead of the data from the db which may
|
||||
// be out of date.
|
||||
if (previewMessage) {
|
||||
previewMessage = window.MessageController.register(
|
||||
previewMessage.id,
|
||||
previewMessage
|
||||
);
|
||||
if (preview) {
|
||||
previewMessage = window.MessageController.register(preview.id, preview);
|
||||
}
|
||||
|
||||
if (activityMessage) {
|
||||
if (activity) {
|
||||
activityMessage = window.MessageController.register(
|
||||
activityMessage.id,
|
||||
activityMessage
|
||||
activity.id,
|
||||
activity
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -4748,9 +4724,7 @@ export class ConversationModel extends window.Backbone
|
|||
this.deriveProfileKeyVersionIfNeeded(),
|
||||
]);
|
||||
|
||||
window.Signal.Data.updateConversation(this.attributes, {
|
||||
Conversation: window.Whisper.Conversation,
|
||||
});
|
||||
window.Signal.Data.updateConversation(this.attributes);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4814,7 +4788,6 @@ export class ConversationModel extends window.Backbone
|
|||
|
||||
await window.Signal.Data.removeAllMessagesInConversation(this.id, {
|
||||
logId: this.idForLogging(),
|
||||
MessageCollection: window.Whisper.MessageCollection,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -5090,7 +5063,7 @@ export class ConversationModel extends window.Backbone
|
|||
|
||||
const sender = reaction
|
||||
? window.ConversationController.get(reaction.get('fromId'))
|
||||
: message.getContact();
|
||||
: getContact(message.attributes);
|
||||
const senderName = sender
|
||||
? sender.getTitle()
|
||||
: window.i18n('unknownContact');
|
||||
|
|
|
@ -41,11 +41,9 @@ import * as expirationTimer from '../util/expirationTimer';
|
|||
|
||||
import type { ReactionType } from '../types/Reactions';
|
||||
import { UUID, UUIDKind } from '../types/UUID';
|
||||
import type { UUIDStringType } from '../types/UUID';
|
||||
import * as reactionUtil from '../reactions/util';
|
||||
import {
|
||||
copyStickerToAttachments,
|
||||
deletePackReference,
|
||||
savePackMetadata,
|
||||
getStickerPackStatus,
|
||||
} from '../types/Stickers';
|
||||
|
@ -134,6 +132,16 @@ import type { LinkPreviewType } from '../types/message/LinkPreviews';
|
|||
import * as log from '../logging/log';
|
||||
import * as Bytes from '../Bytes';
|
||||
import { computeHash } from '../Crypto';
|
||||
import { cleanupMessage, deleteMessageData } from '../util/cleanup';
|
||||
import {
|
||||
getContact,
|
||||
getContactId,
|
||||
getSource,
|
||||
getSourceDevice,
|
||||
getSourceUuid,
|
||||
isCustomError,
|
||||
isQuoteAMatch,
|
||||
} from '../messages/helpers';
|
||||
|
||||
/* eslint-disable camelcase */
|
||||
/* eslint-disable more/no-then */
|
||||
|
@ -148,36 +156,10 @@ declare const _: typeof window._;
|
|||
window.Whisper = window.Whisper || {};
|
||||
|
||||
const { Message: TypedMessage } = window.Signal.Types;
|
||||
const { deleteExternalMessageFiles, upgradeMessageSchema } =
|
||||
window.Signal.Migrations;
|
||||
const { upgradeMessageSchema } = window.Signal.Migrations;
|
||||
const { getTextWithMentions, GoogleChrome } = window.Signal.Util;
|
||||
|
||||
const { addStickerPackReference, getMessageBySender } = window.Signal.Data;
|
||||
|
||||
export function isQuoteAMatch(
|
||||
message: MessageModel | null | undefined,
|
||||
conversationId: string,
|
||||
quote: QuotedMessageType
|
||||
): message is MessageModel {
|
||||
if (!message) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const { authorUuid, id } = quote;
|
||||
const authorConversationId = window.ConversationController.ensureContactIds({
|
||||
e164: 'author' in quote ? quote.author : undefined,
|
||||
uuid: authorUuid,
|
||||
});
|
||||
|
||||
return (
|
||||
message.get('sent_at') === id &&
|
||||
message.get('conversationId') === conversationId &&
|
||||
message.getContactId() === authorConversationId
|
||||
);
|
||||
}
|
||||
|
||||
const isCustomError = (e: unknown): e is CustomError => e instanceof Error;
|
||||
|
||||
export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
||||
static getLongMessageAttachment: (
|
||||
attachment: typeof window.WhatIsThis
|
||||
|
@ -307,7 +289,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
let conversationIds: Array<string>;
|
||||
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
||||
if (isIncoming(this.attributes)) {
|
||||
conversationIds = [this.getContactId()!];
|
||||
conversationIds = [getContactId(this.attributes)!];
|
||||
} else if (!isEmpty(sendStateByConversationId)) {
|
||||
if (isMessageJustForMe(sendStateByConversationId, ourConversationId)) {
|
||||
conversationIds = [ourConversationId];
|
||||
|
@ -516,7 +498,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
|
||||
if (isGroupUpdate(attributes)) {
|
||||
const groupUpdate = this.get('group_update');
|
||||
const fromContact = this.getContact();
|
||||
const fromContact = getContact(this.attributes);
|
||||
const messages = [];
|
||||
if (!groupUpdate) {
|
||||
throw new Error('getNotificationData: Missing group_update');
|
||||
|
@ -749,8 +731,9 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
|
||||
// General
|
||||
idForLogging(): string {
|
||||
const account = this.getSourceUuid() || this.getSource();
|
||||
const device = this.getSourceDevice();
|
||||
const account =
|
||||
getSourceUuid(this.attributes) || getSource(this.attributes);
|
||||
const device = getSourceDevice(this.attributes);
|
||||
const timestamp = this.get('sent_at');
|
||||
|
||||
return `${account}.${device} ${timestamp}`;
|
||||
|
@ -785,29 +768,11 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
}
|
||||
|
||||
async cleanup(): Promise<void> {
|
||||
window.reduxActions?.conversations?.messageDeleted(
|
||||
this.id,
|
||||
this.get('conversationId')
|
||||
);
|
||||
|
||||
this.getConversation()?.debouncedUpdateLastMessage?.();
|
||||
|
||||
window.MessageController.unregister(this.id);
|
||||
await this.deleteData();
|
||||
await cleanupMessage(this.attributes);
|
||||
}
|
||||
|
||||
async deleteData(): Promise<void> {
|
||||
await deleteExternalMessageFiles(this.attributes);
|
||||
|
||||
const sticker = this.get('sticker');
|
||||
if (!sticker) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { packId } = sticker;
|
||||
if (packId) {
|
||||
await deletePackReference(this.id, packId);
|
||||
}
|
||||
await deleteMessageData(this.attributes);
|
||||
}
|
||||
|
||||
isValidTapToView(): boolean {
|
||||
|
@ -875,8 +840,8 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
await this.eraseContents();
|
||||
|
||||
if (!fromSync) {
|
||||
const sender = this.getSource();
|
||||
const senderUuid = this.getSourceUuid();
|
||||
const sender = getSource(this.attributes);
|
||||
const senderUuid = getSourceUuid(this.attributes);
|
||||
|
||||
if (senderUuid === undefined) {
|
||||
throw new Error('senderUuid is undefined');
|
||||
|
@ -929,7 +894,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
Number(sentAt)
|
||||
);
|
||||
const matchingMessage = find(inMemoryMessages, message =>
|
||||
isQuoteAMatch(message, this.get('conversationId'), quote)
|
||||
isQuoteAMatch(message.attributes, this.get('conversationId'), quote)
|
||||
);
|
||||
if (!matchingMessage) {
|
||||
log.info(
|
||||
|
@ -1078,66 +1043,6 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
return unidentifiedDeliveriesSet.has(contactId);
|
||||
}
|
||||
|
||||
getSource(): string | undefined {
|
||||
if (isIncoming(this.attributes)) {
|
||||
return this.get('source');
|
||||
}
|
||||
if (!isOutgoing(this.attributes)) {
|
||||
log.warn(
|
||||
'Message.getSource: Called for non-incoming/non-outoing message'
|
||||
);
|
||||
}
|
||||
|
||||
return window.textsecure.storage.user.getNumber();
|
||||
}
|
||||
|
||||
getSourceDevice(): string | number | undefined {
|
||||
const sourceDevice = this.get('sourceDevice');
|
||||
|
||||
if (isIncoming(this.attributes)) {
|
||||
return sourceDevice;
|
||||
}
|
||||
if (!isOutgoing(this.attributes)) {
|
||||
log.warn(
|
||||
'Message.getSourceDevice: Called for non-incoming/non-outoing message'
|
||||
);
|
||||
}
|
||||
|
||||
return sourceDevice || window.textsecure.storage.user.getDeviceId();
|
||||
}
|
||||
|
||||
getSourceUuid(): UUIDStringType | undefined {
|
||||
if (isIncoming(this.attributes)) {
|
||||
return this.get('sourceUuid');
|
||||
}
|
||||
if (!isOutgoing(this.attributes)) {
|
||||
log.warn(
|
||||
'Message.getSourceUuid: Called for non-incoming/non-outoing message'
|
||||
);
|
||||
}
|
||||
|
||||
return window.textsecure.storage.user.getUuid()?.toString();
|
||||
}
|
||||
|
||||
getContactId(): string | undefined {
|
||||
const source = this.getSource();
|
||||
const sourceUuid = this.getSourceUuid();
|
||||
|
||||
if (!source && !sourceUuid) {
|
||||
return window.ConversationController.getOurConversationId();
|
||||
}
|
||||
|
||||
return window.ConversationController.ensureContactIds({
|
||||
e164: source,
|
||||
uuid: sourceUuid,
|
||||
});
|
||||
}
|
||||
|
||||
getContact(): ConversationModel | undefined {
|
||||
const id = this.getContactId();
|
||||
return window.ConversationController.get(id);
|
||||
}
|
||||
|
||||
async saveErrors(
|
||||
providedErrors: Error | Array<Error>,
|
||||
options: { skipSave?: boolean } = {}
|
||||
|
@ -2106,7 +2011,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
|
||||
const inMemoryMessages = window.MessageController.filterBySentAt(id);
|
||||
const matchingMessage = find(inMemoryMessages, item =>
|
||||
isQuoteAMatch(item, conversationId, result)
|
||||
isQuoteAMatch(item.attributes, conversationId, result)
|
||||
);
|
||||
|
||||
let queryMessage: undefined | MessageModel;
|
||||
|
@ -2115,10 +2020,8 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
queryMessage = matchingMessage;
|
||||
} else {
|
||||
log.info('copyFromQuotedMessage: db lookup needed', id);
|
||||
const collection = await window.Signal.Data.getMessagesBySentAt(id, {
|
||||
MessageCollection: window.Whisper.MessageCollection,
|
||||
});
|
||||
const found = collection.find(item =>
|
||||
const messages = await window.Signal.Data.getMessagesBySentAt(id);
|
||||
const found = messages.find(item =>
|
||||
isQuoteAMatch(item, conversationId, result)
|
||||
);
|
||||
|
||||
|
@ -2256,7 +2159,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
const conversationId = message.get('conversationId');
|
||||
const GROUP_TYPES = Proto.GroupContext.Type;
|
||||
|
||||
const fromContact = this.getContact();
|
||||
const fromContact = getContact(this.attributes);
|
||||
if (fromContact) {
|
||||
fromContact.setRegistered();
|
||||
}
|
||||
|
@ -2281,10 +2184,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
);
|
||||
}
|
||||
const existingMessage =
|
||||
inMemoryMessage ||
|
||||
(await getMessageBySender(this.attributes, {
|
||||
Message: window.Whisper.Message,
|
||||
}));
|
||||
inMemoryMessage || (await getMessageBySender(this.attributes));
|
||||
const isUpdate = Boolean(data && data.isRecipientUpdate);
|
||||
|
||||
if (existingMessage && type === 'incoming') {
|
||||
|
@ -2702,7 +2602,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
|
|||
if (conversation.get('left')) {
|
||||
log.warn('re-added to a left group');
|
||||
attributes.left = false;
|
||||
conversation.set({ addedBy: message.getContactId() });
|
||||
conversation.set({ addedBy: getContactId(message.attributes) });
|
||||
}
|
||||
} else if (dataMessage.group.type === GROUP_TYPES.QUIT) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue