import { useEventListener, Stack, Flex, Portal } from '@chakra-ui/react' import { Step, Table } from 'models' import { DraggableStep, useDnd } from 'contexts/DndContext' import { Coordinates } from 'contexts/GraphContext' import { useState } from 'react' import { StepNode, StepNodeOverlay } from './StepNode' export const StepsList = ({ blockId, steps, showSortPlaceholders, onMouseUp, }: { blockId: string steps: Table showSortPlaceholders: boolean onMouseUp: (index: number) => void }) => { const { draggedStep, setDraggedStep, draggedStepType } = useDnd() const [expandedPlaceholderIndex, setExpandedPlaceholderIndex] = useState< number | undefined >() const [position, setPosition] = useState({ x: 0, y: 0, }) const [relativeCoordinates, setRelativeCoordinates] = useState({ x: 0, y: 0 }) const handleStepMove = (event: MouseEvent) => { if (!draggedStep) return const { clientX, clientY } = event setPosition({ ...position, x: clientX - relativeCoordinates.x, y: clientY - relativeCoordinates.y, }) } useEventListener('mousemove', handleStepMove) const handleMouseMove = (event: React.MouseEvent) => { if (!draggedStep) return const element = event.currentTarget as HTMLDivElement const rect = element.getBoundingClientRect() const y = event.clientY - rect.top if (y < 20) setExpandedPlaceholderIndex(0) } const handleMouseUp = (e: React.MouseEvent) => { if (expandedPlaceholderIndex === undefined) return e.stopPropagation() setExpandedPlaceholderIndex(undefined) onMouseUp(expandedPlaceholderIndex) } const handleStepMouseDown = ( { absolute, relative }: { absolute: Coordinates; relative: Coordinates }, step: DraggableStep ) => { setPosition(absolute) setRelativeCoordinates(relative) setDraggedStep(step) } const handleMouseOnTopOfStep = (stepIndex: number) => { if (!draggedStep && !draggedStepType) return setExpandedPlaceholderIndex(stepIndex === 0 ? 0 : stepIndex) } const handleMouseOnBottomOfStep = (stepIndex: number) => { if (!draggedStep && !draggedStepType) return setExpandedPlaceholderIndex(stepIndex + 1) } return ( {steps.allIds.map((stepId, idx) => ( handleMouseOnTopOfStep(idx)} onMouseMoveBottomOfElement={() => { handleMouseOnBottomOfStep(idx) }} onMouseDown={handleStepMouseDown} /> ))} {draggedStep && draggedStep.blockId === blockId && ( )} ) }