import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTypebot } from '@/providers/TypebotProvider' import { ImageBubbleBlock } from 'models' import { TypingBubble } from '@/components/TypingBubble' import { parseVariables } from '@/features/variables' type Props = { block: ImageBubbleBlock onTransitionEnd: () => void } export const showAnimationDuration = 400 export const mediaLoadingFallbackTimeout = 5000 export const ImageBubble = ({ block, onTransitionEnd }: Props) => { const { typebot, isLoading } = useTypebot() const messageContainer = useRef(null) const image = useRef(null) const [isTyping, setIsTyping] = useState(true) const url = useMemo( () => parseVariables(typebot.variables)(block.content?.url), [block.content?.url, typebot.variables] ) const onTypingEnd = useCallback(() => { setIsTyping(false) setTimeout(() => { onTransitionEnd() }, showAnimationDuration) }, [onTransitionEnd]) useEffect(() => { if (!isTyping || isLoading) return const timeout = setTimeout(() => { setIsTyping(false) onTypingEnd() }, mediaLoadingFallbackTimeout) return () => { clearTimeout(timeout) } }, [isLoading, isTyping, onTypingEnd]) useEffect(() => { const currentImage = image.current if (!currentImage || isLoading || !isTyping) return currentImage.onload = () => { setIsTyping(false) onTypingEnd() } return () => { currentImage.onload = null } }, [isLoading, isTyping, onTypingEnd]) return (
{isTyping ? : null}
Bubble image
) }