From aeb4ea6e1dca14cdd153d56b017487e909e32b7e Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Wed, 25 Mar 2026 03:23:23 +0100 Subject: [PATCH] fix: exclude embed thumbnails from image context menu actions Add data-embed-thumbnail marker to VideoEmbed, GenericEmbed, and RichEmbed thumbnail containers. Update detection logic to skip these alongside avatars. Also remove redundant filename derivation in Save Image menu item. --- packages/web/src/components/chat/Message.tsx | 4 ++-- packages/web/src/components/chat/embeds/GenericEmbed.tsx | 2 +- packages/web/src/components/chat/embeds/RichEmbed.tsx | 2 +- packages/web/src/components/chat/embeds/VideoEmbed.tsx | 1 + packages/web/src/components/chat/messageMenuItems.tsx | 5 +---- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/web/src/components/chat/Message.tsx b/packages/web/src/components/chat/Message.tsx index 549782c2..a9d1264f 100644 --- a/packages/web/src/components/chat/Message.tsx +++ b/packages/web/src/components/chat/Message.tsx @@ -173,9 +173,9 @@ export function Message({ message, isCompact, isFirstInGroup, previousMessageId e.stopPropagation(); const selectedText = window.getSelection()?.toString() ?? ''; - // Detect if the right-click target is a content image (not an avatar) + // Detect if the right-click target is a content image (not an avatar or embed thumbnail) const imgEl = (e.target as HTMLElement).closest('img') as HTMLImageElement | null; - const isContentImage = imgEl && !imgEl.closest('[data-avatar]'); + const isContentImage = imgEl && !imgEl.closest('[data-avatar]') && !imgEl.closest('[data-embed-thumbnail]'); const imageUrl = isContentImage ? imgEl.src : null; const items = buildMessageMenuItems({ diff --git a/packages/web/src/components/chat/embeds/GenericEmbed.tsx b/packages/web/src/components/chat/embeds/GenericEmbed.tsx index 5e48cb67..c332e8da 100644 --- a/packages/web/src/components/chat/embeds/GenericEmbed.tsx +++ b/packages/web/src/components/chat/embeds/GenericEmbed.tsx @@ -41,7 +41,7 @@ export function GenericEmbed({ embed }: GenericEmbedProps) { )} {embed.image && ( -
+
{embed.image && ( -
+
setIsPlaying(true)} className="absolute inset-0 w-full h-full flex items-center justify-center group focus:outline-none" aria-label={`Play ${embed.title ?? 'video'}`} diff --git a/packages/web/src/components/chat/messageMenuItems.tsx b/packages/web/src/components/chat/messageMenuItems.tsx index d25ab4a9..675fbd91 100644 --- a/packages/web/src/components/chat/messageMenuItems.tsx +++ b/packages/web/src/components/chat/messageMenuItems.tsx @@ -55,10 +55,7 @@ export function buildMessageMenuItems(params: MessageMenuParams): ContextMenuIte ), - onClick: () => { - const filename = imageUrl.split('/').pop()?.split('?')[0] ?? 'image'; - saveImage(imageUrl, filename); - }, + onClick: () => saveImage(imageUrl), }); items.push({ key: 'copy-image',