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