| 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, | |
| } | |
| } | |