@@ -24,6 +24,7 @@ import {
24
24
import {
25
25
DragEvent as ReactDragEvent ,
26
26
ReactNode ,
27
+ useCallback ,
27
28
useEffect ,
28
29
useRef ,
29
30
useState ,
@@ -269,13 +270,24 @@ function useDraggableBlockMenu(
269
270
menuComponent : ReactNode ,
270
271
targetLineComponent : ReactNode ,
271
272
isOnMenu : ( element : HTMLElement ) => boolean ,
273
+ onElementChanged ?: ( element : HTMLElement | null ) => void ,
272
274
) : JSX . Element {
273
275
const scrollerElem = anchorElem . parentElement ;
274
276
275
277
const isDraggingBlockRef = useRef < boolean > ( false ) ;
276
- const [ draggableBlockElem , setDraggableBlockElem ] =
278
+ const [ draggableBlockElem , setDraggableBlockElemState ] =
277
279
useState < HTMLElement | null > ( null ) ;
278
280
281
+ const setDraggableBlockElem = useCallback (
282
+ ( elem : HTMLElement | null ) => {
283
+ setDraggableBlockElemState ( elem ) ;
284
+ if ( onElementChanged ) {
285
+ onElementChanged ( elem ) ;
286
+ }
287
+ } ,
288
+ [ onElementChanged ] ,
289
+ ) ;
290
+
279
291
useEffect ( ( ) => {
280
292
function onMouseMove ( event : MouseEvent ) {
281
293
const target = event . target ;
@@ -308,7 +320,7 @@ function useDraggableBlockMenu(
308
320
scrollerElem . removeEventListener ( 'mouseleave' , onMouseLeave ) ;
309
321
}
310
322
} ;
311
- } , [ scrollerElem , anchorElem , editor , isOnMenu ] ) ;
323
+ } , [ scrollerElem , anchorElem , editor , isOnMenu , setDraggableBlockElem ] ) ;
312
324
313
325
useEffect ( ( ) => {
314
326
if ( menuRef . current ) {
@@ -401,7 +413,7 @@ function useDraggableBlockMenu(
401
413
COMMAND_PRIORITY_HIGH ,
402
414
) ,
403
415
) ;
404
- } , [ anchorElem , editor , targetLineRef ] ) ;
416
+ } , [ anchorElem , editor , targetLineRef , setDraggableBlockElem ] ) ;
405
417
406
418
function onDragStart ( event : ReactDragEvent < HTMLDivElement > ) : void {
407
419
const dataTransfer = event . dataTransfer ;
@@ -442,13 +454,15 @@ export function DraggableBlockPlugin_EXPERIMENTAL({
442
454
menuComponent,
443
455
targetLineComponent,
444
456
isOnMenu,
457
+ onElementChanged,
445
458
} : {
446
459
anchorElem ?: HTMLElement ;
447
460
menuRef : React . RefObject < HTMLElement > ;
448
461
targetLineRef : React . RefObject < HTMLElement > ;
449
462
menuComponent : ReactNode ;
450
463
targetLineComponent : ReactNode ;
451
464
isOnMenu : ( element : HTMLElement ) => boolean ;
465
+ onElementChanged ?: ( element : HTMLElement | null ) => void ;
452
466
} ) : JSX . Element {
453
467
const [ editor ] = useLexicalComposerContext ( ) ;
454
468
return useDraggableBlockMenu (
@@ -460,5 +474,6 @@ export function DraggableBlockPlugin_EXPERIMENTAL({
460
474
menuComponent ,
461
475
targetLineComponent ,
462
476
isOnMenu ,
477
+ onElementChanged ,
463
478
) ;
464
479
}
0 commit comments