2024-06-07 20:17:03 +03:00
|
|
|
'use client';
|
|
|
|
|
|
|
|
import { useCallback, useMemo, useState } from 'react';
|
2024-11-21 21:38:32 +03:00
|
|
|
import { ReactFlowProvider } from 'reactflow';
|
|
|
|
import { Node } from 'reactflow';
|
2024-06-07 20:17:03 +03:00
|
|
|
|
|
|
|
import Modal, { ModalProps } from '@/components/ui/Modal';
|
|
|
|
import Overlay from '@/components/ui/Overlay';
|
2024-06-26 19:47:05 +03:00
|
|
|
import { useConceptOptions } from '@/context/ConceptOptionsContext';
|
2024-06-07 20:17:03 +03:00
|
|
|
import { HelpTopic } from '@/models/miscellaneous';
|
|
|
|
import { SyntaxTree } from '@/models/rslang';
|
2024-11-21 21:38:32 +03:00
|
|
|
|
|
|
|
import ASTFlow from './ASTFlow';
|
2024-06-07 20:17:03 +03:00
|
|
|
|
|
|
|
interface DlgShowASTProps extends Pick<ModalProps, 'hideWindow'> {
|
|
|
|
syntaxTree: SyntaxTree;
|
|
|
|
expression: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
function DlgShowAST({ hideWindow, syntaxTree, expression }: DlgShowASTProps) {
|
2024-11-21 21:38:32 +03:00
|
|
|
const { colors } = useConceptOptions();
|
2024-06-07 20:17:03 +03:00
|
|
|
const [hoverID, setHoverID] = useState<number | undefined>(undefined);
|
|
|
|
const hoverNode = useMemo(() => syntaxTree.find(node => node.uid === hoverID), [hoverID, syntaxTree]);
|
|
|
|
|
2024-11-21 21:38:32 +03:00
|
|
|
const handleHoverIn = useCallback((node: Node) => setHoverID(Number(node.id)), []);
|
2024-06-07 20:17:03 +03:00
|
|
|
const handleHoverOut = useCallback(() => setHoverID(undefined), []);
|
|
|
|
|
|
|
|
return (
|
2024-09-18 15:53:43 +03:00
|
|
|
<Modal
|
|
|
|
readonly
|
|
|
|
hideWindow={hideWindow}
|
|
|
|
className='flex flex-col justify-stretch w-[calc(100dvw-3rem)] h-[calc(100dvh-6rem)]'
|
2024-10-29 12:05:23 +03:00
|
|
|
helpTopic={HelpTopic.UI_FORMULA_TREE}
|
2024-09-18 15:53:43 +03:00
|
|
|
>
|
|
|
|
<Overlay
|
|
|
|
position='top-2 right-1/2 translate-x-1/2'
|
|
|
|
className='px-2 py-1 rounded-2xl cc-blur max-w-[60ch] text-lg text-center'
|
|
|
|
style={{ backgroundColor: colors.bgBlur }}
|
|
|
|
>
|
2024-06-07 20:17:03 +03:00
|
|
|
{!hoverNode ? expression : null}
|
|
|
|
{hoverNode ? (
|
|
|
|
<div>
|
|
|
|
<span>{expression.slice(0, hoverNode.start)}</span>
|
|
|
|
<span className='clr-selected'>{expression.slice(hoverNode.start, hoverNode.finish)}</span>
|
|
|
|
<span>{expression.slice(hoverNode.finish)}</span>
|
|
|
|
</div>
|
|
|
|
) : null}
|
2024-09-18 15:53:43 +03:00
|
|
|
</Overlay>
|
2024-11-21 21:38:32 +03:00
|
|
|
<ReactFlowProvider>
|
|
|
|
<ASTFlow data={syntaxTree} onNodeEnter={handleHoverIn} onNodeLeave={handleHoverOut} />
|
|
|
|
</ReactFlowProvider>
|
2024-06-07 20:17:03 +03:00
|
|
|
</Modal>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default DlgShowAST;
|