'use client'; import { useCallback, useMemo, useState } from 'react'; import GraphUI, { GraphEdge, GraphNode } from '@/components/Common/GraphUI'; import Modal, { ModalProps } from '@/components/Common/Modal'; import { useConceptTheme } from '@/context/ThemeContext'; import { SyntaxTree } from '@/models/rslang'; import { graphDarkT, graphLightT } from '@/utils/color'; import { colorbgSyntaxTree } from '@/utils/color'; import { resources } from '@/utils/constants'; import { labelSyntaxTree } from '@/utils/labels'; interface DlgShowASTProps extends Pick { syntaxTree: SyntaxTree expression: string } function DlgShowAST({ hideWindow, syntaxTree, expression }: DlgShowASTProps) { const { darkMode, colors } = useConceptTheme(); const [hoverID, setHoverID] = useState(undefined); const hoverNode = useMemo( () => syntaxTree.find(node => node.uid === hoverID) , [hoverID, syntaxTree]); const nodes: GraphNode[] = useMemo( () => syntaxTree.map(node => ({ id: String(node.uid), label: labelSyntaxTree(node), fill: colorbgSyntaxTree(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 : null} {hoverNode ?
{expression.slice(0, hoverNode.start)} {expression.slice(hoverNode.start, hoverNode.finish)} {expression.slice(hoverNode.finish)}
: null}
); } export default DlgShowAST;