import styles from '../../../assets/index.css' import { createSignal, onMount, Show, splitProps, onCleanup, createEffect, } from 'solid-js' import { CommandData } from '../../commands' import { isDefined, isNotDefined } from '@typebot.io/lib' import { PopupParams } from '../types' import { Bot, BotProps } from '../../../components/Bot' import { getPaymentInProgressInStorage } from '@/features/blocks/inputs/payment/helpers/paymentInProgressStorage' export type PopupProps = BotProps & PopupParams & { defaultOpen?: boolean isOpen?: boolean onOpen?: () => void onClose?: () => void } export const Popup = (props: PopupProps) => { const [popupProps, botProps] = splitProps(props, [ 'onOpen', 'onClose', 'autoShowDelay', 'theme', 'isOpen', 'defaultOpen', ]) const [prefilledVariables, setPrefilledVariables] = createSignal( // eslint-disable-next-line solid/reactivity botProps.prefilledVariables ) const [isBotOpened, setIsBotOpened] = createSignal( // eslint-disable-next-line solid/reactivity popupProps.isOpen ?? false ) onMount(() => { const paymentInProgress = getPaymentInProgressInStorage() if (popupProps.defaultOpen || paymentInProgress) openBot() window.addEventListener('message', processIncomingEvent) const autoShowDelay = popupProps.autoShowDelay if (isDefined(autoShowDelay)) { setTimeout(() => { openBot() }, autoShowDelay) } }) onCleanup(() => { window.removeEventListener('message', processIncomingEvent) }) createEffect(() => { if (isNotDefined(props.isOpen) || props.isOpen === isBotOpened()) return toggleBot() }) createEffect(() => { if (!props.prefilledVariables) return setPrefilledVariables((existingPrefilledVariables) => ({ ...existingPrefilledVariables, ...props.prefilledVariables, })) }) const stopPropagation = (event: MouseEvent) => { event.stopPropagation() } const processIncomingEvent = (event: MessageEvent) => { const { data } = event if (!data.isFromTypebot) return if (data.command === 'open') openBot() if (data.command === 'close') closeBot() if (data.command === 'toggle') toggleBot() if (data.command === 'setPrefilledVariables') setPrefilledVariables((existingPrefilledVariables) => ({ ...existingPrefilledVariables, ...data.variables, })) } const openBot = () => { setIsBotOpened(true) popupProps.onOpen?.() document.body.style.setProperty('overflow', 'hidden', 'important') document.addEventListener('pointerdown', closeBot) } const closeBot = () => { setIsBotOpened(false) popupProps.onClose?.() document.body.style.overflow = 'auto' document.removeEventListener('pointerdown', closeBot) } const toggleBot = () => { isBotOpened() ? closeBot() : openBot() } return (