mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-02-15 07:28:59 +00:00
Fix pin targeting based on edited timestamp
This commit is contained in:
@@ -869,7 +869,8 @@ type ReadableInterface = {
|
||||
|
||||
getMessageByAuthorAciAndSentAt: (
|
||||
authorAci: AciString,
|
||||
sentAtTimestamp: number
|
||||
sentAtTimestamp: number,
|
||||
options: { includeEdits: boolean }
|
||||
) => MessageType | null;
|
||||
getMessageBySender: (options: {
|
||||
source?: string;
|
||||
|
||||
@@ -49,7 +49,7 @@ import { isNormalNumber } from '../util/isNormalNumber.std.js';
|
||||
import { isNotNil } from '../util/isNotNil.std.js';
|
||||
import { parseIntOrThrow } from '../util/parseIntOrThrow.std.js';
|
||||
import { updateSchema } from './migrations/index.node.js';
|
||||
import type { JSONRows, QueryFragment, QueryTemplate } from './util.std.js';
|
||||
import type { JSONRows, QueryTemplate, QueryFragment } from './util.std.js';
|
||||
import {
|
||||
batchMultiVarQuery,
|
||||
bulkAdd,
|
||||
@@ -3322,17 +3322,30 @@ function getAllMessageIds(db: ReadableDB): Array<string> {
|
||||
function getMessageByAuthorAciAndSentAt(
|
||||
db: ReadableDB,
|
||||
authorAci: AciString,
|
||||
sentAtTimestamp: number
|
||||
sentAtTimestamp: number,
|
||||
options: { includeEdits: boolean }
|
||||
): MessageType | null {
|
||||
return db.transaction(() => {
|
||||
const [query, params] = sql`
|
||||
const editedMessagesQuery = sqlFragment`
|
||||
SELECT ${MESSAGE_COLUMNS_SELECT}
|
||||
FROM edited_messages
|
||||
INNER JOIN messages ON
|
||||
messages.id = edited_messages.messageId
|
||||
WHERE messages.sourceServiceId = ${authorAci}
|
||||
AND edited_messages.sentAt = ${sentAtTimestamp}
|
||||
`;
|
||||
|
||||
const messagesQuery = sqlFragment`
|
||||
SELECT ${MESSAGE_COLUMNS_SELECT}
|
||||
FROM messages
|
||||
WHERE sourceServiceId = ${authorAci}
|
||||
AND sent_at = ${sentAtTimestamp}
|
||||
LIMIT 2;
|
||||
WHERE messages.sourceServiceId = ${authorAci}
|
||||
AND messages.sent_at = ${sentAtTimestamp}
|
||||
`;
|
||||
|
||||
const [query, params] = options.includeEdits
|
||||
? sql`${editedMessagesQuery} UNION ${messagesQuery} LIMIT 2;`
|
||||
: sql`${messagesQuery} LIMIT 2;`;
|
||||
|
||||
const rows = db.prepare(query).all<MessageTypeUnhydrated>(params);
|
||||
|
||||
if (rows.length > 1) {
|
||||
|
||||
@@ -392,7 +392,8 @@ function scrollToPinnedMessage(
|
||||
return async (dispatch, getState) => {
|
||||
const pinnedMessage = await DataReader.getMessageByAuthorAciAndSentAt(
|
||||
pinMessage.targetAuthorAci,
|
||||
pinMessage.targetSentTimestamp
|
||||
pinMessage.targetSentTimestamp,
|
||||
{ includeEdits: true }
|
||||
);
|
||||
|
||||
if (!pinnedMessage) {
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
// Copyright 2026 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import { createLogger } from '../logging/log.std.js';
|
||||
import { isIncoming } from '../messages/helpers.std.js';
|
||||
import type { ReadonlyMessageAttributesType } from '../model-types.js';
|
||||
import { DataReader } from '../sql/Client.preload.js';
|
||||
import { itemStorage } from '../textsecure/Storage.preload.js';
|
||||
import type { AciString } from '../types/ServiceId.std.js';
|
||||
import { strictAssert } from './assert.std.js';
|
||||
import { getMessageSentTimestamp } from './getMessageSentTimestamp.std.js';
|
||||
import { isAciString } from './isAciString.std.js';
|
||||
|
||||
const log = createLogger('getPinMessageTarget');
|
||||
|
||||
export type PinnedMessageTarget = Readonly<{
|
||||
conversationId: string;
|
||||
targetMessageId: string;
|
||||
@@ -40,6 +44,9 @@ export async function getPinnedMessageTarget(
|
||||
conversationId: message.conversationId,
|
||||
targetMessageId: message.id,
|
||||
targetAuthorAci: getMessageAuthorAci(message),
|
||||
targetSentTimestamp: message.sent_at,
|
||||
targetSentTimestamp: getMessageSentTimestamp(message, {
|
||||
includeEdits: true,
|
||||
log,
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user