import { EditablePreview, EditableInput, Editable, useEventListener, Flex, Fade, IconButton, } from '@chakra-ui/react' import { PlusIcon } from 'assets/icons' import { ContextMenu } from 'components/shared/ContextMenu' import { Coordinates } from 'contexts/GraphContext' import { useTypebot } from 'contexts/TypebotContext' import { ChoiceInputStep, ChoiceItem } from 'models' import React, { useState } from 'react' import { isDefined, isSingleChoiceInput } from 'utils' import { SourceEndpoint } from '../SourceEndpoint' import { ChoiceItemNodeContextMenu } from './ChoiceItemNodeContextMenu' type ChoiceItemNodeProps = { item: ChoiceItem onMouseMoveBottomOfElement?: () => void onMouseMoveTopOfElement?: () => void onMouseDown?: ( stepNodePosition: { absolute: Coordinates; relative: Coordinates }, item: ChoiceItem ) => void } export const ChoiceItemNode = ({ item, onMouseDown, onMouseMoveBottomOfElement, onMouseMoveTopOfElement, }: ChoiceItemNodeProps) => { const { deleteChoiceItem, updateChoiceItem, typebot, createChoiceItem } = useTypebot() const [mouseDownEvent, setMouseDownEvent] = useState<{ absolute: Coordinates; relative: Coordinates }>() const [isMouseOver, setIsMouseOver] = useState(false) const handleMouseDown = (e: React.MouseEvent) => { if (!onMouseDown) return e.stopPropagation() const element = e.currentTarget as HTMLDivElement const rect = element.getBoundingClientRect() const relativeX = e.clientX - rect.left const relativeY = e.clientY - rect.top setMouseDownEvent({ absolute: { x: e.clientX + relativeX, y: e.clientY + relativeY }, relative: { x: relativeX, y: relativeY }, }) } const handleGlobalMouseUp = () => { setMouseDownEvent(undefined) } useEventListener('mouseup', handleGlobalMouseUp) const handleMouseMove = (event: React.MouseEvent) => { if (!onMouseMoveBottomOfElement || !onMouseMoveTopOfElement) return const isMovingAndIsMouseDown = mouseDownEvent && onMouseDown && (event.movementX > 0 || event.movementY > 0) if (isMovingAndIsMouseDown) { onMouseDown(mouseDownEvent, item) deleteChoiceItem(item.id) setMouseDownEvent(undefined) } const element = event.currentTarget as HTMLDivElement const rect = element.getBoundingClientRect() const y = event.clientY - rect.top if (y > rect.height / 2) onMouseMoveBottomOfElement() else onMouseMoveTopOfElement() } const handleInputSubmit = (content: string) => updateChoiceItem(item.id, { content: content === '' ? undefined : content }) const handlePlusClick = () => { const nextIndex = ( typebot?.steps.byId[item.stepId] as ChoiceInputStep ).options.itemIds.indexOf(item.id) + 1 createChoiceItem({ stepId: item.stepId }, nextIndex) } const handleMouseEnter = () => setIsMouseOver(true) const handleMouseLeave = () => setIsMouseOver(false) return ( renderMenu={() => } > {(ref, isOpened) => ( {typebot && isSingleChoiceInput(typebot.steps.byId[item.stepId]) && ( )} } size="xs" onClick={handlePlusClick} /> )} ) }