11import { isChromium , isLinux } from '@craftjs/utils' ;
22import { isFunction } from 'lodash' ;
3+ import React from 'react' ;
34
45import { CoreEventHandlers , CreateHandlerOptions } from './CoreEventHandlers' ;
56import { Positioner } from './Positioner' ;
67import { createShadow } from './createShadow' ;
78
8- import { Indicator , NodeId , DragTarget } from '../interfaces' ;
9+ import { Indicator , NodeId , DragTarget , NodeTree } from '../interfaces' ;
910
1011export type DefaultEventHandlersOptions = {
1112 isMultiSelectEnabled : ( e : MouseEvent ) => boolean ;
@@ -260,7 +261,7 @@ export class DefaultEventHandlers<O = {}> extends CoreEventHandlers<
260261 } ,
261262 create : (
262263 el : HTMLElement ,
263- userElement : React . ReactElement ,
264+ userElement : React . ReactElement | ( ( ) => NodeTree | React . ReactElement ) ,
264265 options ?: Partial < CreateHandlerOptions >
265266 ) => {
266267 el . setAttribute ( 'draggable' , 'true' ) ;
@@ -270,9 +271,17 @@ export class DefaultEventHandlers<O = {}> extends CoreEventHandlers<
270271 'dragstart' ,
271272 ( e ) => {
272273 e . craft . stopPropagation ( ) ;
273- const tree = store . query
274- . parseReactElement ( userElement )
275- . toNodeTree ( ) ;
274+ let tree ;
275+ if ( typeof userElement === 'function' ) {
276+ const result = userElement ( ) ;
277+ if ( React . isValidElement ( result ) ) {
278+ tree = store . query . parseReactElement ( result ) . toNodeTree ( ) ;
279+ } else {
280+ tree = result ;
281+ }
282+ } else {
283+ tree = store . query . parseReactElement ( userElement ) . toNodeTree ( ) ;
284+ }
276285
277286 const dom = e . currentTarget as HTMLElement ;
278287 this . draggedElementShadow = createShadow (
0 commit comments