diff --git a/src/components/middle/message/RoundVideo.tsx b/src/components/middle/message/RoundVideo.tsx index 36784840d..2216c7a54 100644 --- a/src/components/middle/message/RoundVideo.tsx +++ b/src/components/middle/message/RoundVideo.tsx @@ -142,7 +142,9 @@ const RoundVideo: FC = ({ }, [shouldPlay]); useHeavyAnimationCheckForVideo(playerRef, shouldPlay); + usePauseOnInactive(playerRef, Boolean(mediaData)); + useVideoCleanup(playerRef, [mediaData]); const handleClick = useCallback(() => { diff --git a/src/components/middle/message/Video.tsx b/src/components/middle/message/Video.tsx index f13c4f2a3..544ce0405 100644 --- a/src/components/middle/message/Video.tsx +++ b/src/components/middle/message/Video.tsx @@ -19,6 +19,7 @@ import { } from '../../../modules/helpers'; import { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver'; import useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress'; +import useMedia from '../../../hooks/useMedia'; import useShowTransition from '../../../hooks/useShowTransition'; import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; import usePrevious from '../../../hooks/usePrevious'; @@ -71,6 +72,12 @@ const Video: FC = ({ const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime); const [isPlayAllowed, setIsPlayAllowed] = useState(shouldAutoPlay); + const previewBlobUrl = useMedia( + getMessageMediaHash(message, 'pictogram'), + !(isIntersecting && lastSyncTime), + getMessageMediaFormat(message, 'pictogram'), + lastSyncTime, + ); const thumbRef = useBlurredMediaThumbRef(message); const { mediaData, downloadProgress } = useMediaWithDownloadProgress( getMessageMediaHash(message, 'inline'), @@ -78,7 +85,9 @@ const Video: FC = ({ getMessageMediaFormat(message, 'inline'), lastSyncTime, ); + const fullMediaData = localBlobUrl || mediaData; + const isInline = Boolean(isIntersecting && fullMediaData); const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad); const { isUploading, isTransferring, transferProgress } = getMediaTransferState( @@ -104,9 +113,11 @@ const Video: FC = ({ const isForwarded = isForwardedMessage(message); const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded, noAvatars); - useHeavyAnimationCheckForVideo(videoRef, Boolean(fullMediaData && shouldAutoPlay)); + useHeavyAnimationCheckForVideo(videoRef, Boolean(isInline && shouldAutoPlay)); + usePauseOnInactive(videoRef, isPlayAllowed); - useVideoCleanup(videoRef, [fullMediaData]); + + useVideoCleanup(videoRef, [isInline]); const handleClick = useCallback(() => { if (isUploading) { @@ -130,6 +141,7 @@ const Video: FC = ({ ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;` : ''; + const shouldRenderInlineVideo = isInline; const shouldRenderPlayButton = (isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner); const shouldRenderDownloadButton = !isDownloadAllowed; @@ -142,15 +154,26 @@ const Video: FC = ({ style={style} onClick={isUploading ? undefined : handleClick} > - {(shouldRenderThumb || fullMediaData) && ( - + )} + {previewBlobUrl && ( + )} - {fullMediaData && ( + + {shouldRenderInlineVideo && (