TelegramPWA/src/components/common/AnimatedIcon.tsx
2023-06-12 11:47:13 +02:00

64 lines
1.6 KiB
TypeScript

import React, { memo, useState } from '../../lib/teact/teact';
import type { OwnProps as AnimatedStickerProps } from './AnimatedSticker';
import buildClassName from '../../util/buildClassName';
import useLastCallback from '../../hooks/useLastCallback';
import useMediaTransition from '../../hooks/useMediaTransition';
import useFlag from '../../hooks/useFlag';
import AnimatedSticker from './AnimatedSticker';
const DEFAULT_SIZE = 150;
export type OwnProps =
Partial<AnimatedStickerProps>
& { noTransition?: boolean; nonInteractive?: boolean };
function AnimatedIcon(props: OwnProps) {
const {
size = DEFAULT_SIZE,
play = true,
noLoop = true,
className,
noTransition,
nonInteractive,
onLoad,
onClick,
...otherProps
} = props;
const [isAnimationLoaded, markAnimationLoaded] = useFlag(false);
const transitionClassNames = useMediaTransition(noTransition || isAnimationLoaded);
const handleLoad = useLastCallback(() => {
markAnimationLoaded();
onLoad?.();
});
const [playKey, setPlayKey] = useState(String(Math.random()));
const handleClick = useLastCallback(() => {
if (play === true) {
setPlayKey(String(Math.random()));
}
onClick?.();
});
return (
<AnimatedSticker
className={buildClassName(className, transitionClassNames)}
size={size}
play={play === true ? playKey : play}
noLoop={noLoop}
onClick={!nonInteractive ? handleClick : undefined}
onLoad={handleLoad}
/* eslint-disable-next-line react/jsx-props-no-spreading */
{...otherProps}
/>
);
}
export default memo(AnimatedIcon);