Files
Desktop/ts/util/getLastMessage.preload.ts

100 lines
3.2 KiB
TypeScript

// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { AciString } from '../types/ServiceId.std.js';
import type { ConversationAttributesType } from '../model-types.d.ts';
import type { LastMessageType } from '../state/ducks/conversations.preload.js';
import { dropNull } from './dropNull.std.js';
import { findAndFormatContact } from './findAndFormatContact.preload.js';
import { hydrateRanges } from './BodyRange.node.js';
import { stripNewlinesForLeftPane } from './stripNewlinesForLeftPane.std.js';
import { itemStorage } from '../textsecure/Storage.preload.js';
import { getTitle } from './getTitle.preload.js';
function getNameForAci(
aci: AciString | null | undefined,
options?: { isShort?: boolean }
): string | null {
if (aci == null) {
return null;
}
const conversation = window.ConversationController.get(aci);
if (conversation != null) {
return getTitle(conversation.attributes, options);
}
return null;
}
function getDisplayNameForAci(
aci: AciString | null | undefined,
ourAci: AciString | null | undefined
): string | null {
if (aci === ourAci) {
return window.SignalContext.i18n('icu:you');
}
return getNameForAci(aci, { isShort: true });
}
export function getLastMessage(
conversationAttrs: ConversationAttributesType
): LastMessageType | undefined {
const ourAci = itemStorage.user.getAci();
if (conversationAttrs.lastMessageDeletedForEveryone) {
const { lastMessageAuthorAci, lastMessageDeletedForEveryoneByAdminAci } =
conversationAttrs;
// Don't show admin name when the admin deleted their own message or when
// the current user is the admin (show "You deleted this message" instead)
const isAdminDeletingOwnMessage =
lastMessageDeletedForEveryoneByAdminAci != null &&
lastMessageDeletedForEveryoneByAdminAci === lastMessageAuthorAci;
const isAdminMe =
lastMessageDeletedForEveryoneByAdminAci != null &&
lastMessageDeletedForEveryoneByAdminAci === ourAci;
const deletedByAdminName =
isAdminDeletingOwnMessage || isAdminMe
? null
: getNameForAci(lastMessageDeletedForEveryoneByAdminAci);
const authorName =
getDisplayNameForAci(lastMessageAuthorAci, ourAci) ??
// Deprecated: fall back to lastMessageAuthor from old database rows
conversationAttrs.lastMessageAuthor ??
null;
return {
deletedForEveryone: true,
deletedByAdminName,
isOutgoing: lastMessageAuthorAci === ourAci || isAdminMe,
authorName,
};
}
const lastMessageText = conversationAttrs.lastMessage;
if (!lastMessageText) {
return undefined;
}
const rawBodyRanges = conversationAttrs.lastMessageBodyRanges || [];
const bodyRanges = hydrateRanges(rawBodyRanges, findAndFormatContact);
const text = stripNewlinesForLeftPane(lastMessageText);
const prefix = conversationAttrs.lastMessagePrefix;
const author =
getDisplayNameForAci(conversationAttrs.lastMessageAuthorAci, ourAci) ??
// Deprecated: fall back to lastMessageAuthor from old database rows
conversationAttrs.lastMessageAuthor ??
null;
return {
author,
bodyRanges,
deletedForEveryone: false,
prefix,
status: dropNull(conversationAttrs.lastMessageStatus),
text,
};
}