| 
									
										
										
										
											2023-10-12 23:14:28 +08:00
										 |  |  | import { | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |   memo, | 
					
						
							| 
									
										
										
										
											2023-10-12 23:14:28 +08:00
										 |  |  |   useCallback, | 
					
						
							|  |  |  |   useEffect, | 
					
						
							|  |  |  | } from 'react' | 
					
						
							|  |  |  | import { $applyNodeReplacement } from 'lexical' | 
					
						
							|  |  |  | import { mergeRegister } from '@lexical/utils' | 
					
						
							|  |  |  | import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import { decoratorTransform } from '../../utils' | 
					
						
							|  |  |  | import { QUERY_PLACEHOLDER_TEXT } from '../../constants' | 
					
						
							|  |  |  | import type { QueryBlockType } from '../../types' | 
					
						
							| 
									
										
										
										
											2023-10-12 23:14:28 +08:00
										 |  |  | import { | 
					
						
							|  |  |  |   $createQueryBlockNode, | 
					
						
							|  |  |  |   QueryBlockNode, | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | } from '../query-block/node' | 
					
						
							|  |  |  | import { CustomTextNode } from '../custom-text/node' | 
					
						
							| 
									
										
										
										
											2023-10-12 23:14:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const REGEX = new RegExp(QUERY_PLACEHOLDER_TEXT) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | const QueryBlockReplacementBlock = ({ | 
					
						
							| 
									
										
										
										
											2023-10-12 23:14:28 +08:00
										 |  |  |   onInsert, | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | }: QueryBlockType) => { | 
					
						
							| 
									
										
										
										
											2023-10-12 23:14:28 +08:00
										 |  |  |   const [editor] = useLexicalComposerContext() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     if (!editor.hasNodes([QueryBlockNode])) | 
					
						
							|  |  |  |       throw new Error('QueryBlockNodePlugin: QueryBlockNode not registered on editor') | 
					
						
							|  |  |  |   }, [editor]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const createQueryBlockNode = useCallback((): QueryBlockNode => { | 
					
						
							|  |  |  |     if (onInsert) | 
					
						
							|  |  |  |       onInsert() | 
					
						
							|  |  |  |     return $applyNodeReplacement($createQueryBlockNode()) | 
					
						
							|  |  |  |   }, [onInsert]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const getMatch = useCallback((text: string) => { | 
					
						
							|  |  |  |     const matchArr = REGEX.exec(text) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (matchArr === null) | 
					
						
							|  |  |  |       return null | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const startOffset = matchArr.index | 
					
						
							|  |  |  |     const endOffset = startOffset + QUERY_PLACEHOLDER_TEXT.length | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       end: endOffset, | 
					
						
							|  |  |  |       start: startOffset, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, []) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     REGEX.lastIndex = 0 | 
					
						
							| 
									
										
										
										
											2023-10-12 23:14:28 +08:00
										 |  |  |     return mergeRegister( | 
					
						
							|  |  |  |       editor.registerNodeTransform(CustomTextNode, textNode => decoratorTransform(textNode, getMatch, createQueryBlockNode)), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |   }, []) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return null | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | export default memo(QueryBlockReplacementBlock) |