import React, { FC, useRef } from '../../../lib/teact/teact'; import { ApiMessage } from '../../../api/types'; import { MEMOJI_STICKER_ID } from '../../../config'; import { getStickerDimensions } from '../../common/helpers/mediaDimensions'; import { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers'; import useMedia from '../../../hooks/useMedia'; import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; import buildClassName from '../../../util/buildClassName'; import { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver'; import useFlag from '../../../hooks/useFlag'; import useWebpThumbnail from '../../../hooks/useWebpThumbnail'; import AnimatedSticker from '../../common/AnimatedSticker'; import StickerSetModal from '../../common/StickerSetModal.async'; import './Sticker.scss'; type OwnProps = { message: ApiMessage; observeIntersection: ObserveFn; observeIntersectionForPlaying: ObserveFn; shouldLoop?: boolean; lastSyncTime?: number; }; const Sticker: FC = ({ message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime, }) => { // eslint-disable-next-line no-null/no-null const ref = useRef(null); const [isModalOpen, openModal, closeModal] = useFlag(); const sticker = message.content.sticker!; const { isAnimated, stickerSetId } = sticker; const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID; const shouldLoad = useIsIntersecting(ref, observeIntersection); const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying); const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!; const thumbDataUri = useWebpThumbnail(message); const mediaData = useMedia( mediaHash, !shouldLoad, getMessageMediaFormat(message, 'inline', true), lastSyncTime, ); const isMediaLoaded = Boolean(mediaData); const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded); const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded; const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(isMediaReady, 'slow'); const { width, height } = getStickerDimensions(sticker); const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty'); const stickerClassName = buildClassName( 'Sticker media-inner', isMemojiSticker && 'inactive', ); return (
{!isMediaReady && ( )} {!isAnimated && shouldRenderFullMedia && ( )} {isAnimated && isMediaLoaded && ( )}
); }; export default Sticker;