Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

last-run-block-replacement-block.tsx 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import {
  2. memo,
  3. useCallback,
  4. useEffect,
  5. } from 'react'
  6. import { $applyNodeReplacement } from 'lexical'
  7. import { mergeRegister } from '@lexical/utils'
  8. import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
  9. import { decoratorTransform } from '../../utils'
  10. import { LAST_RUN_PLACEHOLDER_TEXT } from '../../constants'
  11. import type { LastRunBlockType } from '../../types'
  12. import {
  13. $createLastRunBlockNode,
  14. LastRunBlockNode,
  15. } from './node'
  16. import { CustomTextNode } from '../custom-text/node'
  17. const REGEX = new RegExp(LAST_RUN_PLACEHOLDER_TEXT)
  18. const LastRunReplacementBlock = ({
  19. onInsert,
  20. }: LastRunBlockType) => {
  21. const [editor] = useLexicalComposerContext()
  22. useEffect(() => {
  23. if (!editor.hasNodes([LastRunBlockNode]))
  24. throw new Error('LastRunMessageBlockNodePlugin: LastRunMessageBlockNode not registered on editor')
  25. }, [editor])
  26. const createLastRunBlockNode = useCallback((): LastRunBlockNode => {
  27. if (onInsert)
  28. onInsert()
  29. return $applyNodeReplacement($createLastRunBlockNode())
  30. }, [onInsert])
  31. const getMatch = useCallback((text: string) => {
  32. const matchArr = REGEX.exec(text)
  33. if (matchArr === null)
  34. return null
  35. const startOffset = matchArr.index
  36. const endOffset = startOffset + LAST_RUN_PLACEHOLDER_TEXT.length
  37. return {
  38. end: endOffset,
  39. start: startOffset,
  40. }
  41. }, [])
  42. useEffect(() => {
  43. REGEX.lastIndex = 0
  44. return mergeRegister(
  45. editor.registerNodeTransform(CustomTextNode, textNode => decoratorTransform(textNode, getMatch, createLastRunBlockNode)),
  46. )
  47. }, [])
  48. return null
  49. }
  50. export default memo(LastRunReplacementBlock)