import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; import React, { forwardRef, useEffect, useImperativeHandle, useRef, } from 'react'; import RelationSvg from '../MonacoDiffEditorRelation/RelationSvg'; import { RelationTypeEnum } from '../types'; import createEditor from './createEditor'; import './index.scss'; export interface UpdateRelationOption { label: string; value: string; content: string; range?: [number, number]; } export interface UpdateRelationProps { fromOptionValue: string; fromRange: [number, number]; toOptionValue: string; toRange: [number, number]; fromOptions: UpdateRelationOption[]; toOptions: UpdateRelationOption[]; onFromOptionValueChange?: (rev: string) => void; onFromRangeChange?: (range: [number, number]) => void; onToOptionValueChange?: (rev: string) => void; onToRangeChange?: (editor: [number, number]) => void; } export interface UpdateRelationRef { layout: () => void; } const UpdateRelation = forwardRef( ( { fromOptionValue, fromRange, toOptionValue, toRange, fromOptions, toOptions, onFromOptionValueChange, onFromRangeChange, onToOptionValueChange, onToRangeChange, }, ref ) => { const fromEditorElRef = useRef(null); const toEditorElRef = useRef(null); const relationSvgElRef = useRef(null); const fromEditorRef = useRef( null ); const toEditorRef = useRef( null ); const relationSvgRef = useRef(null); useImperativeHandle( ref, () => ({ layout: () => { fromEditorRef.current?.layout(); toEditorRef.current?.layout(); }, }), [] ); useEffect(() => { fromEditorRef.current = createEditor(fromEditorElRef.current); toEditorRef.current = createEditor(toEditorElRef.current); }, []); useEffect(() => { fromEditorRef.current?.setValue( fromOptions.find(o => o.value === fromOptionValue)?.content || '' ); }, [fromOptionValue]); useEffect(() => { toEditorRef.current?.setValue( toOptions.find(o => o.value === toOptionValue)?.content || '' ); }, [toOptionValue]); useEffect(() => { if (!relationSvgElRef.current) return; relationSvgRef.current = new RelationSvg( { getOriginalEditor() { return fromEditorRef.current; }, getModifiedEditor() { return fromEditorRef.current; }, } as any, { getOriginalEditor() { return toEditorRef.current; }, getModifiedEditor() { return toEditorRef.current; }, } as any, [], relationSvgElRef.current, { fromContainerDomNode: fromEditorRef.current!.getContainerDomNode(), toContainerDomNode: toEditorRef.current!.getContainerDomNode(), } ); }, []); useEffect(() => { relationSvgRef.current?.setRelations([ { fromRange: fromRange, toRange: toRange, type: RelationTypeEnum.relate, }, ]); relationSvgRef.current?.renderLinks(); }, [fromRange, toRange]); return (
Content:
    {fromOptions.map(option => { return (
  • ); })}
Range: L { onFromRangeChange?.([Number(e.target.value), fromRange?.[1]]); }} value={fromRange?.[0]} /> -L { onFromRangeChange?.([fromRange?.[0], Number(e.target.value)]); }} value={fromRange?.[1]} />
Content:
    {toOptions.map(option => { return (
  • ); })}
Range: L { onToRangeChange?.([Number(e.target.value), toRange?.[1]]); }} value={toRange?.[0]} /> -L { onToRangeChange?.([toRange?.[0], Number(e.target.value)]); }} value={toRange?.[1]} />
); } ); export default UpdateRelation;