import React, { FC, useCallback, useRef, useState, } from '../../lib/teact/teact'; import { ApiMediaFormat, ApiSticker } from '../../api/types'; import { LIKE_STICKER_ID } from './helpers/mediaDimensions'; import { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver'; import useMedia from '../../hooks/useMedia'; import useTransitionForMedia from '../../hooks/useTransitionForMedia'; import useFlag from '../../hooks/useFlag'; import AnimatedSticker from './AnimatedSticker'; import './AnimatedEmoji.scss'; type OwnProps = { sticker: ApiSticker; observeIntersection?: ObserveFn; size?: 'large' | 'medium' | 'small'; lastSyncTime?: number; forceLoadPreview?: boolean; }; const QUALITY = 1; const WIDTH = { large: 160, medium: 128, small: 104, }; const AnimatedEmoji: FC = ({ sticker, size = 'medium', observeIntersection, lastSyncTime, forceLoadPreview, }) => { // eslint-disable-next-line no-null/no-null const ref = useRef(null); const [isAnimationLoaded, markAnimationLoaded] = useFlag(); const localMediaHash = `sticker${sticker.id}`; const isIntersecting = useIsIntersecting(ref, observeIntersection); const thumbDataUri = sticker.thumbnail && sticker.thumbnail.dataUri; const previewBlobUrl = useMedia( `${localMediaHash}?size=m`, !isIntersecting && !forceLoadPreview, ApiMediaFormat.BlobUrl, lastSyncTime, ); const { transitionClassNames } = useTransitionForMedia(previewBlobUrl, 'slow'); const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime); const isMediaLoaded = Boolean(mediaData); const [playKey, setPlayKey] = useState(String(Math.random())); const handleClick = useCallback(() => { setPlayKey(String(Math.random())); }, []); const width = WIDTH[size]; const style = `width: ${width}px; height: ${width}px;`; return (
{!isAnimationLoaded && thumbDataUri && ( )} {!isAnimationLoaded && previewBlobUrl && ( )} {isMediaLoaded && ( )}
); }; export default AnimatedEmoji;