import type { FC } from '../../lib/teact/teact'; import { memo, useRef } from '../../lib/teact/teact'; import type { ApiBotPreviewMedia } from '../../api/types'; import type { ObserveFn } from '../../hooks/useIntersectionObserver'; import buildClassName from '../../util/buildClassName'; import { formatMediaDuration } from '../../util/dates/dateFormat'; import stopEvent from '../../util/stopEvent'; import useMessageMediaHash from '../../hooks/media/useMessageMediaHash'; import useThumbnail from '../../hooks/media/useThumbnail'; import { useIsIntersecting } from '../../hooks/useIntersectionObserver'; import useLastCallback from '../../hooks/useLastCallback'; import useMedia from '../../hooks/useMedia'; import useMediaTransitionDeprecated from '../../hooks/useMediaTransitionDeprecated'; import './Media.scss'; type OwnProps = { media: ApiBotPreviewMedia; idPrefix?: string; isProtected?: boolean; observeIntersection?: ObserveFn; onClick: (index: number) => void; index: number; }; const PreviewMedia: FC = ({ media, idPrefix = 'preview-media', isProtected, observeIntersection, onClick, index, }) => { const ref = useRef(); const isIntersecting = useIsIntersecting(ref, observeIntersection); const thumbDataUri = useThumbnail(media); const mediaHash = useMessageMediaHash(media, 'preview'); const mediaBlobUrl = useMedia(mediaHash, !isIntersecting); const transitionClassNames = useMediaTransitionDeprecated(mediaBlobUrl); const video = media.content.video; const handleClick = useLastCallback(() => { onClick(index); }); return (
{video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}} {isProtected && }
); }; export default memo(PreviewMedia);