Spaces:
Running
Running
import { | |
useCallback, | |
useEffect, | |
} from 'react' | |
import type { TextNode } from 'lexical' | |
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' | |
import { useLexicalTextEntity } from '../../hooks' | |
import { | |
$createVariableValueBlockNode, | |
VariableValueBlockNode, | |
} from './node' | |
import { getHashtagRegexString } from './utils' | |
const REGEX = new RegExp(getHashtagRegexString(), 'i') | |
const VariableValueBlock = () => { | |
const [editor] = useLexicalComposerContext() | |
useEffect(() => { | |
if (!editor.hasNodes([VariableValueBlockNode])) | |
throw new Error('VariableValueBlockPlugin: VariableValueNode not registered on editor') | |
}, [editor]) | |
const createVariableValueBlockNode = useCallback((textNode: TextNode): VariableValueBlockNode => { | |
return $createVariableValueBlockNode(textNode.getTextContent()) | |
}, []) | |
const getVariableValueMatch = useCallback((text: string) => { | |
const matchArr = REGEX.exec(text) | |
if (matchArr === null) | |
return null | |
const hashtagLength = matchArr[0].length | |
const startOffset = matchArr.index | |
const endOffset = startOffset + hashtagLength | |
return { | |
end: endOffset, | |
start: startOffset, | |
} | |
}, []) | |
useLexicalTextEntity<VariableValueBlockNode>( | |
getVariableValueMatch, | |
VariableValueBlockNode, | |
createVariableValueBlockNode, | |
) | |
return null | |
} | |
export default VariableValueBlock | |