diff --git a/src/components/common/AnimatedIconWithPreview.module.scss b/src/components/common/AnimatedIconWithPreview.module.scss index 4f4919521..b124c6825 100644 --- a/src/components/common/AnimatedIconWithPreview.module.scss +++ b/src/components/common/AnimatedIconWithPreview.module.scss @@ -2,6 +2,10 @@ position: relative; display: block !important; + + :global(.AnimatedSticker.not-shown) { + display: block; + } } .preview { @@ -10,4 +14,8 @@ top: 0; width: 100%; height: 100%; + + &:global(.closing) { + transition-delay: 150ms; + } } diff --git a/src/components/common/AnimatedIconWithPreview.tsx b/src/components/common/AnimatedIconWithPreview.tsx index 91bf0cdb6..f13057238 100644 --- a/src/components/common/AnimatedIconWithPreview.tsx +++ b/src/components/common/AnimatedIconWithPreview.tsx @@ -1,6 +1,7 @@ import React, { memo } from '../../lib/teact/teact'; import type { OwnProps as AnimatedIconProps } from './AnimatedIcon'; +import AnimatedIcon from './AnimatedIcon'; import buildClassName from '../../util/buildClassName'; import buildStyle from '../../util/buildStyle'; @@ -9,14 +10,14 @@ import useLastCallback from '../../hooks/useLastCallback'; import useMediaTransition from '../../hooks/useMediaTransition'; import useFlag from '../../hooks/useFlag'; -import AnimatedIcon from './AnimatedIcon'; - import styles from './AnimatedIconWithPreview.module.scss'; type OwnProps = Partial & { previewUrl?: string; thumbDataUri?: string; noPreviewTransition?: boolean }; +const ANIMATION_DURATION = 300; + const loadedPreviewUrls = new Set(); function AnimatedIconWithPreview(props: OwnProps) { @@ -24,36 +25,46 @@ function AnimatedIconWithPreview(props: OwnProps) { previewUrl, thumbDataUri, className, ...otherProps } = props; - const [isPreviewLoaded, markPreviewLoaded] = useFlag(Boolean(thumbDataUri) || loadedPreviewUrls.has(previewUrl)); - const transitionClassNames = useMediaTransition(isPreviewLoaded); + const [isThumbOpen, , unmarkThumbOpen] = useFlag(Boolean(thumbDataUri)); + const thumbClassNames = useMediaTransition(isThumbOpen); + + const [isPreviewOpen, markPreviewOpen, unmarkPreviewOpen] = useFlag(loadedPreviewUrls.has(previewUrl)); + const previewClassNames = useMediaTransition(isPreviewOpen); + const [isAnimationReady, markAnimationReady] = useFlag(false); const handlePreviewLoad = useLastCallback(() => { - markPreviewLoaded(); + markPreviewOpen(); loadedPreviewUrls.add(previewUrl); }); + const handleAnimationReady = useLastCallback(() => { + unmarkThumbOpen(); + unmarkPreviewOpen(); + setTimeout(markAnimationReady, ANIMATION_DURATION); + }); + const { size } = props; return (
{thumbDataUri && !isAnimationReady && ( // eslint-disable-next-line jsx-a11y/alt-text - + )} {previewUrl && !isAnimationReady && ( // eslint-disable-next-line jsx-a11y/alt-text )} {/* eslint-disable-next-line react/jsx-props-no-spreading */} - +
); }