mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-04-02 16:23:20 +01:00
100 lines
3.2 KiB
TypeScript
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,
|
|
};
|
|
}
|