import { TypingBubble } from '@/components' import { createSignal, onCleanup, onMount } from 'solid-js' import { clsx } from 'clsx' import { isMobile } from '@/utils/isMobileSignal' import { ImageBubbleBlock } from '@indite.io/schemas' import { defaultImageBubbleContent } from '@indite.io/schemas/features/blocks/bubbles/image/constants' type Props = { content: ImageBubbleBlock['content'] onTransitionEnd?: (ref?: HTMLDivElement) => void } export const showAnimationDuration = 400 export const mediaLoadingFallbackTimeout = 5000 let typingTimeout: NodeJS.Timeout export const ImageBubble = (props: Props) => { let ref: HTMLDivElement | undefined let image: HTMLImageElement | undefined const [isTyping, setIsTyping] = createSignal( props.onTransitionEnd ? true : false ) const onTypingEnd = () => { if (!isTyping()) return setIsTyping(false) setTimeout(() => { props.onTransitionEnd?.(ref) }, showAnimationDuration) } onMount(() => { if (!image) return typingTimeout = setTimeout(onTypingEnd, mediaLoadingFallbackTimeout) image.onload = () => { clearTimeout(typingTimeout) onTypingEnd() } }) onCleanup(() => { if (typingTimeout) clearTimeout(typingTimeout) }) const Image = ( { ) return (
{isTyping() ? : null}
{props.content?.clickLink ? ( {Image} ) : (
{Image}
)}
) }