| import { useCallback, useLayoutEffect } from 'react'; | |
| import { getLayoutedElements } from './elk-utils'; | |
| export const elkOptions = { | |
| 'elk.algorithm': 'layered', | |
| 'elk.layered.spacing.nodeNodeBetweenLayers': '100', | |
| 'elk.spacing.nodeNode': '80', | |
| }; | |
| export const useLayoutGraph = ( | |
| initialNodes, | |
| initialEdges, | |
| setNodes, | |
| setEdges, | |
| ) => { | |
| const onLayout = useCallback(({ direction, useInitialNodes = false }) => { | |
| const opts = { 'elk.direction': direction, ...elkOptions }; | |
| const ns = initialNodes; | |
| const es = initialEdges; | |
| getLayoutedElements(ns, es, opts).then( | |
| ({ nodes: layoutedNodes, edges: layoutedEdges }) => { | |
| setNodes(layoutedNodes); | |
| setEdges(layoutedEdges); | |
| // window.requestAnimationFrame(() => fitView()); | |
| }, | |
| ); | |
| }, []); | |
| // Calculate the initial layout on mount. | |
| useLayoutEffect(() => { | |
| onLayout({ direction: 'RIGHT', useInitialNodes: true }); | |
| }, [onLayout]); | |
| }; | |