Better housekeeping for link previews

This commit is contained in:
Evan Hahn 2021-08-13 10:01:56 -05:00 committed by GitHub
parent b0750e5f4e
commit b7447cda29
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -66,6 +66,7 @@ import {
import { ReadStatus } from '../messages/MessageReadStatus'; import { ReadStatus } from '../messages/MessageReadStatus';
import { markViewed } from '../services/MessageUpdater'; import { markViewed } from '../services/MessageUpdater';
import { viewSyncJobQueue } from '../jobs/viewSyncJobQueue'; import { viewSyncJobQueue } from '../jobs/viewSyncJobQueue';
import type { WhatIsThis } from '../window.d';
type AttachmentOptions = { type AttachmentOptions = {
messageId: string; messageId: string;
@ -3968,7 +3969,7 @@ Whisper.ConversationView = Whisper.View.extend({
message, message,
attachments, attachments,
this.quote, this.quote,
this.getLinkPreview(), this.getLinkPreviewForSend(),
undefined, // sticker undefined, // sticker
mentions, mentions,
{ {
@ -4465,7 +4466,7 @@ Whisper.ConversationView = Whisper.View.extend({
); );
}, },
getLinkPreview() { getLinkPreviewForSend(message: string) {
// Don't generate link previews if user has turned them off // Don't generate link previews if user has turned them off
if (!window.storage.get('linkPreviews', false)) { if (!window.storage.get('linkPreviews', false)) {
return []; return [];
@ -4475,17 +4476,26 @@ Whisper.ConversationView = Whisper.View.extend({
return []; return [];
} }
return this.preview.map((item: any) => { const urlsInMessage = new Set<string>(LinkPreview.findLinks(message));
if (item.image) {
// We eliminate the ObjectURL here, unneeded for send or save
return {
...item,
image: window._.omit(item.image, 'url'),
};
}
return item; return (
}); this.preview
// This bullet-proofs against sending link previews for URLs that are no longer in
// the message. This can happen if you have a link preview, then quickly delete
// the link and send the message.
.filter(({ url }: Readonly<{ url: string }>) => urlsInMessage.has(url))
.map((item: WhatIsThis) => {
if (item.image) {
// We eliminate the ObjectURL here, unneeded for send or save
return {
...item,
image: window._.omit(item.image, 'url'),
};
}
return item;
})
);
}, },
getLinkPreviewWithDomain(): LinkPreviewWithDomain | undefined { getLinkPreviewWithDomain(): LinkPreviewWithDomain | undefined {