import { TypingBubble } from '@/components' import { isMobile } from '@/utils/isMobileSignal' import { createSignal, onCleanup, onMount } from 'solid-js' import { clsx } from 'clsx' import { EmbedBubbleBlock } from '@indite.io/schemas' import { defaultEmbedBubbleContent } from '@indite.io/schemas/features/blocks/bubbles/embed/constants' import { isNotEmpty } from '@indite.io/lib/utils' import { InputSubmitContent } from '@/types' type Props = { content: EmbedBubbleBlock['content'] onTransitionEnd?: (ref?: HTMLDivElement) => void onCompleted?: (data?: InputSubmitContent) => void } let typingTimeout: NodeJS.Timeout export const showAnimationDuration = 400 export const EmbedBubble = (props: Props) => { let ref: HTMLDivElement | undefined const [isTyping, setIsTyping] = createSignal( props.onTransitionEnd ? true : false ) const handleMessage = ( event: MessageEvent<{ name?: string; data?: string }> ) => { if ( props.content?.waitForEvent?.isEnabled && isNotEmpty(event.data.name) && event.data.name === props.content?.waitForEvent.name ) { props.onCompleted?.( props.content.waitForEvent.saveDataInVariableId && event.data.data ? { type: 'text', value: event.data.data, } : undefined ) window.removeEventListener('message', handleMessage) } } onMount(() => { typingTimeout = setTimeout(() => { setIsTyping(false) if (props.content?.waitForEvent?.isEnabled) { window.addEventListener('message', handleMessage) } setTimeout(() => { props.onTransitionEnd?.(ref) }, showAnimationDuration) }, 2000) }) onCleanup(() => { if (typingTimeout) clearTimeout(typingTimeout) window.removeEventListener('message', handleMessage) }) return (
{isTyping() && }