| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | import { useCallback } from 'react'import { useStoreApi } from 'reactflow'import type { Node } from '../types'import { useWorkflowStore } from '../store'export const useHelpline = () => {  const store = useStoreApi()  const workflowStore = useWorkflowStore()  const handleSetHelpline = useCallback((node: Node) => {    const { getNodes } = store.getState()    const nodes = getNodes()    const {      setHelpLineHorizontal,      setHelpLineVertical,    } = workflowStore.getState()    if (node.data.isInIteration) {      return {        showHorizontalHelpLineNodes: [],        showVerticalHelpLineNodes: [],      }    }    const showHorizontalHelpLineNodes = nodes.filter((n) => {      if (n.id === node.id)        return false      if (n.data.isInIteration)        return false      const nY = Math.ceil(n.position.y)      const nodeY = Math.ceil(node.position.y)      if (nY - nodeY < 5 && nY - nodeY > -5)        return true      return false    }).sort((a, b) => a.position.x - b.position.x)    const showHorizontalHelpLineNodesLength = showHorizontalHelpLineNodes.length    if (showHorizontalHelpLineNodesLength > 0) {      const first = showHorizontalHelpLineNodes[0]      const last = showHorizontalHelpLineNodes[showHorizontalHelpLineNodesLength - 1]      const helpLine = {        top: first.position.y,        left: first.position.x,        width: last.position.x + last.width! - first.position.x,      }      if (node.position.x < first.position.x) {        helpLine.left = node.position.x        helpLine.width = first.position.x + first.width! - node.position.x      }      if (node.position.x > last.position.x)        helpLine.width = node.position.x + node.width! - first.position.x      setHelpLineHorizontal(helpLine)    }    else {      setHelpLineHorizontal()    }    const showVerticalHelpLineNodes = nodes.filter((n) => {      if (n.id === node.id)        return false      if (n.data.isInIteration)        return false      const nX = Math.ceil(n.position.x)      const nodeX = Math.ceil(node.position.x)      if (nX - nodeX < 5 && nX - nodeX > -5)        return true      return false    }).sort((a, b) => a.position.x - b.position.x)    const showVerticalHelpLineNodesLength = showVerticalHelpLineNodes.length    if (showVerticalHelpLineNodesLength > 0) {      const first = showVerticalHelpLineNodes[0]      const last = showVerticalHelpLineNodes[showVerticalHelpLineNodesLength - 1]      const helpLine = {        top: first.position.y,        left: first.position.x,        height: last.position.y + last.height! - first.position.y,      }      if (node.position.y < first.position.y) {        helpLine.top = node.position.y        helpLine.height = first.position.y + first.height! - node.position.y      }      if (node.position.y > last.position.y)        helpLine.height = node.position.y + node.height! - first.position.y      setHelpLineVertical(helpLine)    }    else {      setHelpLineVertical()    }    return {      showHorizontalHelpLineNodes,      showVerticalHelpLineNodes,    }  }, [store, workflowStore])  return {    handleSetHelpline,  }}
 |