import { TypingBubble } from '@/components' import type { Settings, TextBubbleBlock } from '@indite.io/schemas' import { For, createSignal, onCleanup, onMount } from 'solid-js' import { PlateElement } from './plate/PlateBlock' import { computePlainText } from '../helpers/convertRichTextToPlainText' import { clsx } from 'clsx' import { isMobile } from '@/utils/isMobileSignal' import { computeTypingDuration } from '@indite.io/bot-engine/computeTypingDuration' type Props = { content: TextBubbleBlock['content'] typingEmulation: Settings['typingEmulation'] isTypingSkipped: boolean onTransitionEnd?: (ref?: HTMLDivElement) => void } export const showAnimationDuration = 400 let typingTimeout: NodeJS.Timeout export const TextBubble = (props: Props) => { let ref: HTMLDivElement | undefined const [isTyping, setIsTyping] = createSignal( props.onTransitionEnd ? true : false ) const onTypingEnd = () => { if (!isTyping()) return setIsTyping(false) setTimeout(() => { props.onTransitionEnd?.(ref) }, showAnimationDuration) } onMount(() => { if (!isTyping) return const plainText = props.content?.richText ? computePlainText(props.content.richText) : '' const typingDuration = props.typingEmulation?.enabled === false || props.isTypingSkipped ? 0 : computeTypingDuration({ bubbleContent: plainText, typingSettings: props.typingEmulation, }) typingTimeout = setTimeout(onTypingEnd, typingDuration) }) onCleanup(() => { if (typingTimeout) clearTimeout(typingTimeout) }) return (
{isTyping() && }
{(element) => }
) }