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