index.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import {
  2. memo,
  3. useEffect,
  4. } from 'react'
  5. import {
  6. $insertNodes,
  7. COMMAND_PRIORITY_EDITOR,
  8. createCommand,
  9. } from 'lexical'
  10. import { mergeRegister } from '@lexical/utils'
  11. import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
  12. import type { QueryBlockType } from '../../types'
  13. import {
  14. $createQueryBlockNode,
  15. QueryBlockNode,
  16. } from './node'
  17. export const INSERT_QUERY_BLOCK_COMMAND = createCommand('INSERT_QUERY_BLOCK_COMMAND')
  18. export const DELETE_QUERY_BLOCK_COMMAND = createCommand('DELETE_QUERY_BLOCK_COMMAND')
  19. export type QueryBlockProps = {
  20. onInsert?: () => void
  21. onDelete?: () => void
  22. }
  23. const QueryBlock = memo(({
  24. onInsert,
  25. onDelete,
  26. }: QueryBlockType) => {
  27. const [editor] = useLexicalComposerContext()
  28. useEffect(() => {
  29. if (!editor.hasNodes([QueryBlockNode]))
  30. throw new Error('QueryBlockPlugin: QueryBlock not registered on editor')
  31. return mergeRegister(
  32. editor.registerCommand(
  33. INSERT_QUERY_BLOCK_COMMAND,
  34. () => {
  35. const contextBlockNode = $createQueryBlockNode()
  36. $insertNodes([contextBlockNode])
  37. if (onInsert)
  38. onInsert()
  39. return true
  40. },
  41. COMMAND_PRIORITY_EDITOR,
  42. ),
  43. editor.registerCommand(
  44. DELETE_QUERY_BLOCK_COMMAND,
  45. () => {
  46. if (onDelete)
  47. onDelete()
  48. return true
  49. },
  50. COMMAND_PRIORITY_EDITOR,
  51. ),
  52. )
  53. }, [editor, onInsert, onDelete])
  54. return null
  55. })
  56. QueryBlock.displayName = 'QueryBlock'
  57. export { QueryBlock }
  58. export { QueryBlockNode } from './node'
  59. export { default as QueryBlockReplacementBlock } from './query-block-replacement-block'