import { Editable, EditableInput, EditablePreview, Stack, useEventListener, } from '@chakra-ui/react' import React, { useEffect, useMemo, useState } from 'react' import { Block } from 'models' import { useGraph } from 'contexts/GraphContext' import { useStepDnd } from 'contexts/StepDndContext' import { StepsList } from './StepsList' import { filterTable, isDefined } from 'utils' import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import { ContextMenu } from 'components/shared/ContextMenu' import { BlockNodeContextMenu } from './BlockNodeContextMenu' type Props = { block: Block } export const BlockNode = ({ block }: Props) => { const { connectingIds, setConnectingIds, previewingEdgeId } = useGraph() const { typebot, updateBlock } = useTypebot() const { setMouseOverBlockId } = useStepDnd() const { draggedStep, draggedStepType } = useStepDnd() const [isMouseDown, setIsMouseDown] = useState(false) const [isConnecting, setIsConnecting] = useState(false) const isPreviewing = useMemo(() => { if (!previewingEdgeId) return const edge = typebot?.edges.byId[previewingEdgeId] return edge?.to.blockId === block.id || edge?.from.blockId === block.id }, [block.id, previewingEdgeId, typebot?.edges.byId]) useEffect(() => { setIsConnecting( connectingIds?.target?.blockId === block.id && !isDefined(connectingIds.target?.stepId) ) }, [block.id, connectingIds]) const handleTitleSubmit = (title: string) => updateBlock(block.id, { title }) const handleMouseDown = () => { setIsMouseDown(true) } const handleMouseUp = () => { setIsMouseDown(false) } useEventListener('mouseup', handleMouseUp) const handleMouseMove = (event: MouseEvent) => { if (!isMouseDown) return const { movementX, movementY } = event updateBlock(block.id, { graphCoordinates: { x: block.graphCoordinates.x + movementX, y: block.graphCoordinates.y + movementY, }, }) } useEventListener('mousemove', handleMouseMove) const handleMouseEnter = () => { if (draggedStepType || draggedStep) setMouseOverBlockId(block.id) if (connectingIds) setConnectingIds({ ...connectingIds, target: { blockId: block.id } }) } const handleMouseLeave = () => { setMouseOverBlockId(undefined) if (connectingIds) setConnectingIds({ ...connectingIds, target: undefined }) } return ( renderMenu={() => } > {(ref, isOpened) => ( {typebot && ( )} )} ) }