import { createSignal, createEffect, Show } from 'solid-js'; import { isNotDefined, getBubbleButtonSize } from '@/utils/index'; import { ButtonTheme } from '../types'; type Props = ButtonTheme & { isBotOpened: boolean; toggleBot: () => void; setButtonPosition: (position: { bottom: number; right?: number; left?: number }) => void; dragAndDrop: boolean; autoOpen?: boolean; // Optional parameter to control automatic window opening openDelay?: number; // Optional parameter for delay time in seconds autoOpenOnMobile?: boolean; // Optional parameter for opening on mobile }; const defaultButtonColor = '#3B81F6'; const defaultIconColor = 'white'; const defaultBottom = 20; const defaultRight = 20; const defaultLeft = 20; export const BubbleButton = (props: Props) => { const buttonSize = getBubbleButtonSize(props.size); const [position, setPosition] = createSignal({ bottom: props.bottom ?? defaultBottom, right: props.left !== undefined ? undefined : (props.right ?? defaultRight), left: props.left ?? undefined, }); const [isSmallScreen, setIsSmallScreen] = createSignal(false); const [userInteracted, setUserInteracted] = createSignal(false); let dragStartX: number; let initialRight: number; let initialLeft: number; const onMouseDown = (e: MouseEvent) => { if (props.dragAndDrop) { dragStartX = e.clientX; initialRight = position().right ?? 0; initialLeft = position().left ?? 0; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); } }; const onMouseMove = (e: MouseEvent) => { const deltaX = dragStartX - e.clientX; const screenWidth = window.innerWidth; const maxPosition = screenWidth - buttonSize; let newPosition; if (position().left !== undefined) { const newLeft = initialLeft - deltaX; newPosition = { bottom: position().bottom, left: Math.min(Math.max(newLeft, defaultLeft), maxPosition), right: undefined, }; } else { const newRight = initialRight + deltaX; newPosition = { bottom: position().bottom, right: Math.min(Math.max(newRight, defaultRight), maxPosition), left: undefined, }; } setPosition(newPosition); props.setButtonPosition(newPosition); }; const onMouseUp = () => { document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); }; const handleButtonClick = () => { props.toggleBot(); setUserInteracted(true); // Mark that the user has interacted if (window.innerWidth <= 640) { setIsSmallScreen(true); } }; createEffect(() => { // Automatically open the chat window if autoOpen is true if (props.autoOpen && (props.autoOpenOnMobile || window.innerWidth > 640)) { const delayInSeconds = props.openDelay ?? 2; // Default to 2 seconds if openDelay is not defined const delayInMilliseconds = delayInSeconds * 1000; // Convert seconds to milliseconds setTimeout(() => { if (!props.isBotOpened && !userInteracted()) { props.toggleBot(); } }, delayInMilliseconds); } }); return ( ); };