import React, { useEffect, useRef, useState } from 'react' import { useHostAvatars } from '../../../../contexts/HostAvatarsContext' import { useTypebot } from '../../../../contexts/TypebotContext' import { BubbleStepType, StepType, TextStep } from 'models' import { computeTypingTimeout } from '../../../../services/chat' import { TypingContent } from './TypingContent' type HostMessageBubbleProps = { step: TextStep onTransitionEnd: () => void } export const showAnimationDuration = 400 export const mediaLoadingFallbackTimeout = 5000 export const HostMessageBubble = ({ step, onTransitionEnd, }: HostMessageBubbleProps) => { const { typebot } = useTypebot() const { typingEmulation } = typebot.settings const { updateLastAvatarOffset } = useHostAvatars() const messageContainer = useRef(null) const [isTyping, setIsTyping] = useState(true) useEffect(() => { sendAvatarOffset() const typingTimeout = computeTypingTimeout( step.content.plainText, typingEmulation ) setTimeout(() => { onTypingEnd() }, typingTimeout) }, []) const onTypingEnd = () => { setIsTyping(false) setTimeout(() => { sendAvatarOffset() onTransitionEnd() }, showAnimationDuration) } const sendAvatarOffset = () => { if (!messageContainer.current) return const containerDimensions = messageContainer.current.getBoundingClientRect() updateLastAvatarOffset(containerDimensions.top + containerDimensions.height) } return (
{isTyping ? : <>}
{step.type === BubbleStepType.TEXT && (

)}

) }