import { useCallback, useMemo, useRef, useState } from 'react'; import { darkTheme, GraphCanvas, GraphCanvasRef, GraphEdge, GraphNode, LayoutTypes, lightTheme, useSelection } from 'reagraph'; import Button from '../../components/Common/Button'; import Checkbox from '../../components/Common/Checkbox'; import ConceptSelect from '../../components/Common/ConceptSelect'; import { useRSForm } from '../../context/RSFormContext'; import { useConceptTheme } from '../../context/ThemeContext'; import useLocalStorage from '../../hooks/useLocalStorage'; import { resources } from '../../utils/constants'; import { GraphLayoutSelector,mapLayoutLabels } from '../../utils/staticUI'; function EditorTermGraph() { const { schema } = useRSForm(); const { darkMode } = useConceptTheme(); const [ layout, setLayout ] = useLocalStorage('graph_layout', 'forceatlas2'); const [ orbit, setOrbit ] = useState(false); 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.outputs.forEach(target => { result.push({ id: String(edgeID), source: String(source.id), target: String(target) }); edgeID += 1; }); }); return result; }, [schema?.graph]); const handleCenter = useCallback(() => { graphRef.current?.resetControls(); graphRef.current?.centerGraph(); }, []); const { selections, actives, onNodeClick, onCanvasClick, onNodePointerOver, onNodePointerOut } = useSelection({ ref: graphRef, nodes, edges, type: 'multi', // 'single' | 'multi' | 'multiModifier' pathSelectionType: 'all', focusOnSelect: false }); return (<>
{ setLayout(data.length > 0 ? data[0].value : GraphLayoutSelector[0].value); }} /> setOrbit(event.target.checked) }/>
); } export default EditorTermGraph;