import { useCallback, useMemo, useState } from 'react'; import { GraphCanvas,GraphEdge, GraphNode } from 'reagraph'; import Modal from '../../components/Common/Modal'; import { useConceptTheme } from '../../context/ThemeContext'; import { graphDarkT, graphLightT } from '../../utils/color'; import { resources } from '../../utils/constants'; import { SyntaxTree } from '../../utils/models'; import { getASTNodeColor, getASTNodeLabel } from '../../utils/staticUI'; interface DlgShowASTProps { hideWindow: () => void syntaxTree: SyntaxTree expression: string } function DlgShowAST({ hideWindow, syntaxTree, expression }: DlgShowASTProps) { const { darkMode, colors } = useConceptTheme(); const [hoverID, setHoverID] = useState(undefined); const hoverNode = useMemo( () => { return syntaxTree.find(node => node.uid === hoverID); }, [hoverID, syntaxTree]); const nodes: GraphNode[] = useMemo( () => syntaxTree.map(node => { return { id: String(node.uid), label: getASTNodeLabel(node), fill: getASTNodeColor(node, colors), }; }), [syntaxTree, colors]); const edges: GraphEdge[] = useMemo( () => { const result: GraphEdge[] = []; syntaxTree.forEach(node => { if (node.parent !== node.uid) { result.push({ id: String(node.uid), source: String(node.parent), target: String(node.uid) }); } }); return result; }, [syntaxTree]); const handleHoverIn = useCallback( (node: GraphNode) => { setHoverID(Number(node.id)); }, []); const handleHoverOut = useCallback( () => { setHoverID(undefined); }, []); return (
{!hoverNode && expression} {hoverNode &&
{expression.slice(0, hoverNode.start)} {expression.slice(hoverNode.start, hoverNode.finish)} {expression.slice(hoverNode.finish)}
}
); } export default DlgShowAST;