diff --git a/ts/components/CompositionArea.tsx b/ts/components/CompositionArea.tsx index 78d3fd23050..13dba5f800f 100644 --- a/ts/components/CompositionArea.tsx +++ b/ts/components/CompositionArea.tsx @@ -51,6 +51,7 @@ import type { } from '../state/ducks/conversations'; import type { EmojiPickDataType } from './emoji/EmojiPicker'; import type { LinkPreviewType } from '../types/message/LinkPreviews'; +import { isSameLinkPreview } from '../types/message/LinkPreviews'; import { MandatoryProfileSharingActions } from './conversation/MandatoryProfileSharingActions'; import { MediaQualitySelector } from './MediaQualitySelector'; @@ -366,6 +367,9 @@ export const CompositionArea = memo(function CompositionArea({ (draftEditMessage != null && dropNull(draftEditMessage.quote?.messageId) !== dropNull(quotedMessageId)) || + // Link preview of edited message changed + (draftEditMessage != null && + !isSameLinkPreview(linkPreviewResult, draftEditMessage?.preview)) || // Not edit message, but has attachments (draftEditMessage == null && draftAttachments.length !== 0); diff --git a/ts/services/LinkPreview.ts b/ts/services/LinkPreview.ts index f3e950a3842..67912c8377e 100644 --- a/ts/services/LinkPreview.ts +++ b/ts/services/LinkPreview.ts @@ -16,6 +16,7 @@ import * as Errors from '../types/errors'; import type { StickerPackType as StickerPackDBType } from '../sql/Interface'; import type { MIMEType } from '../types/MIME'; import * as Bytes from '../Bytes'; +import { sha256 } from '../Crypto'; import * as LinkPreview from '../types/LinkPreview'; import * as Stickers from '../types/Stickers'; import * as VisualAttachment from '../types/VisualAttachment'; @@ -364,6 +365,7 @@ async function getPreview( data, size: data.byteLength, ...dimensions, + plaintextHash: Bytes.toHex(sha256(data)), contentType: stringToMIMEType(withBlob.file.type), blurHash, }; diff --git a/ts/types/message/LinkPreviews.ts b/ts/types/message/LinkPreviews.ts index a68b9dd4e31..11c76ecf125 100644 --- a/ts/types/message/LinkPreviews.ts +++ b/ts/types/message/LinkPreviews.ts @@ -17,3 +17,28 @@ type GenericLinkPreviewType = { export type LinkPreviewType = GenericLinkPreviewType; export type LinkPreviewWithHydratedData = GenericLinkPreviewType; + +export function isSameLinkPreview( + prev: LinkPreviewType | undefined | null, + next: LinkPreviewType | undefined | null +): boolean { + // Both has to be absent or present + if (prev == null || next == null) { + return prev == null && next == null; + } + + if (prev.url !== next.url) { + return false; + } + if (prev.title !== next.title) { + return false; + } + if (prev.description !== next.description) { + return false; + } + if (prev.image?.plaintextHash !== next.image?.plaintextHash) { + return false; + } + + return true; +}