Skip to content

Commit d4c2164

Browse files
authored
feat: support custom NodeTree in connectors.create() (#317)
* fix: fix create userElement's type to support custom nodeTree * fix: fix type * add type * modify * modify * fix * modify
1 parent 58ec5b2 commit d4c2164

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

packages/core/src/events/CoreEventHandlers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export class CoreEventHandlers<O = {}> extends EventHandlers<
1919
drop: (el: HTMLElement, id: NodeId) => {},
2020
create: (
2121
el: HTMLElement,
22-
UserElement: React.ReactElement,
22+
UserElement: React.ReactElement | (() => NodeTree | React.ReactElement),
2323
options?: Partial<CreateHandlerOptions>
2424
) => {},
2525
};

packages/core/src/events/DefaultEventHandlers.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { isChromium, isLinux } from '@craftjs/utils';
22
import { isFunction } from 'lodash';
3+
import React from 'react';
34

45
import { CoreEventHandlers, CreateHandlerOptions } from './CoreEventHandlers';
56
import { Positioner } from './Positioner';
67
import { createShadow } from './createShadow';
78

8-
import { Indicator, NodeId, DragTarget } from '../interfaces';
9+
import { Indicator, NodeId, DragTarget, NodeTree } from '../interfaces';
910

1011
export 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

Comments
 (0)