import { useMemo, useRef } from 'react'; import { GraphCanvasRef, GraphEdge, GraphNode, LayoutTypes, useSelection } from 'reagraph'; import ConceptGraph from '../../components/Common/ConceptGraph'; import ConceptSelect from '../../components/Common/ConceptSelect'; import { useRSForm } from '../../context/RSFormContext'; import useLocalStorage from '../../hooks/useLocalStorage'; import { GraphLayoutSelector } from '../../utils/staticUI'; function EditorTermGraph() { const { schema } = useRSForm(); const [ layout, setLayout ] = useLocalStorage('graph_layout', 'forceatlas2'); const graphRef = useRef(null); const nodes: GraphNode[] = useMemo(() => { return schema?.items.map(cst => { return { id: String(cst.id), label: (cst.term.resolved || cst.term.raw) ? `${cst.alias}: ${cst.term.resolved || cst.term.raw}` : cst.alias }} ) ?? []; }, [schema?.items]); const edges: GraphEdge[] = useMemo(() => { const result: GraphEdge[] = []; let edgeID = 1; schema?.graph.nodes.forEach(source => { source.adjacent.forEach(target => { result.push({ id: String(edgeID), source: String(source.id), target: String(target) }); edgeID += 1; }); }); return result; }, [schema?.graph]); const { selections, actives, onNodeClick, onCanvasClick, onNodePointerOver, onNodePointerOut } = useSelection({ type: 'multi', // 'single' | 'multi' | 'multiModifier' ref: graphRef, nodes, edges, pathSelectionType: 'all', focusOnSelect: 'singleOnly' }); return (
{ data && setLayout(data[0].value); }} />
); } export default EditorTermGraph;