From 3f3b50bc6d870fe65e4b6d86b65bb2da5a5cf9e1 Mon Sep 17 00:00:00 2001 From: zubiden <19638254+zubiden@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:33:25 +0400 Subject: [PATCH] GIF: Use full media if preview not available (#5180) --- .../common/embedded/EmbeddedMessage.tsx | 35 +++++++++++++++---- src/components/middle/HeaderPinnedMessage.tsx | 28 ++++++++++++--- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/components/common/embedded/EmbeddedMessage.tsx b/src/components/common/embedded/EmbeddedMessage.tsx index a8348fb38..a1b79af66 100644 --- a/src/components/common/embedded/EmbeddedMessage.tsx +++ b/src/components/common/embedded/EmbeddedMessage.tsx @@ -101,11 +101,15 @@ const EmbeddedMessage: FC = ({ }; }, [message, replyInfo]); - const mediaHash = containedMedia && getMessageMediaHash(containedMedia, 'pictogram'); + const gif = containedMedia?.content?.video?.isGif ? containedMedia.content.video : undefined; + const isVideoThumbnail = Boolean(gif && !gif.previewPhotoSizes?.length); + + const mediaHash = containedMedia && getMessageMediaHash(containedMedia, isVideoThumbnail ? 'full' : 'pictogram'); const mediaBlobUrl = useMedia(mediaHash, !isIntersecting); const mediaThumbnail = useThumbnail(containedMedia); - const isRoundVideo = Boolean(message && getMessageRoundVideo(message)); - const isSpoiler = Boolean(message && getMessageIsSpoiler(message)); + + const isRoundVideo = Boolean(containedMedia && getMessageRoundVideo(containedMedia)); + const isSpoiler = Boolean(containedMedia && getMessageIsSpoiler(containedMedia)); const isQuote = Boolean(replyInfo?.type === 'message' && replyInfo.isQuote); const replyForwardInfo = replyInfo?.type === 'message' ? replyInfo.replyFrom : undefined; @@ -234,7 +238,9 @@ const EmbeddedMessage: FC = ({ >
- {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl, isRoundVideo, isProtected, isSpoiler)} + {mediaThumbnail && renderPictogram( + mediaThumbnail, mediaBlobUrl, isVideoThumbnail, isRoundVideo, isProtected, isSpoiler, + )} {sender?.color?.backgroundEmojiId && ( = ({ function renderPictogram( thumbDataUri: string, blobUrl?: string, + isFullVideo?: boolean, isRoundVideo?: boolean, isProtected?: boolean, isSpoiler?: boolean, @@ -269,10 +276,11 @@ function renderPictogram( const { width, height } = getPictogramDimensions(); const srcUrl = blobUrl || thumbDataUri; + const shouldRenderVideo = isFullVideo && blobUrl; return (
- {!isSpoiler && ( + {!isSpoiler && !shouldRenderVideo && ( )} - + {!isSpoiler && shouldRenderVideo && ( +
); diff --git a/src/components/middle/HeaderPinnedMessage.tsx b/src/components/middle/HeaderPinnedMessage.tsx index a55b93427..a2e5a7760 100644 --- a/src/components/middle/HeaderPinnedMessage.tsx +++ b/src/components/middle/HeaderPinnedMessage.tsx @@ -5,7 +5,9 @@ import { getActions } from '../../global'; import type { ApiMessage } from '../../api/types'; import type { Signal } from '../../util/signals'; -import { getMessageIsSpoiler, getMessageMediaHash, getMessageSingleInlineButton } from '../../global/helpers'; +import { + getMessageIsSpoiler, getMessageMediaHash, getMessageSingleInlineButton, getMessageVideo, +} from '../../global/helpers'; import buildClassName from '../../util/buildClassName'; import { IS_TOUCH_ENV } from '../../util/windowEnvironment'; import { getPictogramDimensions, REM } from '../common/helpers/mediaDimensions'; @@ -56,8 +58,12 @@ const HeaderPinnedMessage: FC = ({ const { clickBotInlineButton } = getActions(); const lang = useOldLang(); + const video = getMessageVideo(message); + const gif = video?.isGif ? video : undefined; + const isVideoThumbnail = Boolean(gif && !gif.previewPhotoSizes?.length); + const mediaThumbnail = useThumbnail(message); - const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram')); + const mediaBlobUrl = useMedia(getMessageMediaHash(message, isVideoThumbnail ? 'full' : 'pictogram')); const isSpoiler = getMessageIsSpoiler(message); const isLoading = Boolean(useDerivedState(getLoadingPinnedId)); @@ -86,13 +92,14 @@ const HeaderPinnedMessage: FC = ({ const { handleClick, handleMouseDown } = useFastClick(onClick); - function renderPictogram(thumbDataUri?: string, blobUrl?: string, spoiler?: boolean) { + function renderPictogram(thumbDataUri?: string, blobUrl?: string, isFullVideo?: boolean, asSpoiler?: boolean) { const { width, height } = getPictogramDimensions(); const srcUrl = blobUrl || thumbDataUri; + const shouldRenderVideo = isFullVideo && blobUrl; return (
- {thumbDataUri && !spoiler && ( + {thumbDataUri && !asSpoiler && !shouldRenderVideo && ( = ({ draggable={false} /> )} + {shouldRenderVideo && !asSpoiler && ( +
); } @@ -168,6 +185,7 @@ const HeaderPinnedMessage: FC = ({ {renderPictogram( mediaThumbnail, mediaBlobUrl, + isVideoThumbnail, isSpoiler, )}