@@ -1,4 +1,4 @@
|
|||||||
import React, { memo, useContext, useCallback, FC, HTMLAttributes } from 'react';
|
import React, { memo, useContext, useCallback, HTMLAttributes, forwardRef } from 'react';
|
||||||
import cc from 'classcat';
|
import cc from 'classcat';
|
||||||
|
|
||||||
import { useStoreActions, useStoreState } from '../../store/hooks';
|
import { useStoreActions, useStoreState } from '../../store/hooks';
|
||||||
@@ -9,95 +9,103 @@ import { onMouseDown, SetSourceIdFunc, SetPosition } from './handler';
|
|||||||
|
|
||||||
const alwaysValid = () => true;
|
const alwaysValid = () => true;
|
||||||
|
|
||||||
const Handle: FC<HandleProps & Omit<HTMLAttributes<HTMLDivElement>, 'id'>> = ({
|
export type HandleComponentProps = HandleProps & Omit<HTMLAttributes<HTMLDivElement>, 'id'>;
|
||||||
type = 'source',
|
|
||||||
position = Position.Top,
|
|
||||||
isValidConnection = alwaysValid,
|
|
||||||
isConnectable = true,
|
|
||||||
id,
|
|
||||||
onConnect,
|
|
||||||
children,
|
|
||||||
className,
|
|
||||||
...rest
|
|
||||||
}) => {
|
|
||||||
const nodeId = useContext(NodeIdContext) as ElementId;
|
|
||||||
const setPosition = useStoreActions((actions) => actions.setConnectionPosition);
|
|
||||||
const setConnectionNodeId = useStoreActions((actions) => actions.setConnectionNodeId);
|
|
||||||
const onConnectAction = useStoreState((state) => state.onConnect);
|
|
||||||
const onConnectStart = useStoreState((state) => state.onConnectStart);
|
|
||||||
const onConnectStop = useStoreState((state) => state.onConnectStop);
|
|
||||||
const onConnectEnd = useStoreState((state) => state.onConnectEnd);
|
|
||||||
const connectionMode = useStoreState((state) => state.connectionMode);
|
|
||||||
const handleId = id || null;
|
|
||||||
const isTarget = type === 'target';
|
|
||||||
|
|
||||||
const onConnectExtended = useCallback(
|
const Handle = forwardRef<HTMLDivElement, HandleComponentProps>(
|
||||||
(params: Connection) => {
|
(
|
||||||
onConnectAction?.(params);
|
{
|
||||||
onConnect?.(params);
|
type = 'source',
|
||||||
|
position = Position.Top,
|
||||||
|
isValidConnection = alwaysValid,
|
||||||
|
isConnectable = true,
|
||||||
|
id,
|
||||||
|
onConnect,
|
||||||
|
children,
|
||||||
|
className,
|
||||||
|
...rest
|
||||||
},
|
},
|
||||||
[onConnectAction, onConnect]
|
ref
|
||||||
);
|
) => {
|
||||||
|
const nodeId = useContext(NodeIdContext) as ElementId;
|
||||||
|
const setPosition = useStoreActions((actions) => actions.setConnectionPosition);
|
||||||
|
const setConnectionNodeId = useStoreActions((actions) => actions.setConnectionNodeId);
|
||||||
|
const onConnectAction = useStoreState((state) => state.onConnect);
|
||||||
|
const onConnectStart = useStoreState((state) => state.onConnectStart);
|
||||||
|
const onConnectStop = useStoreState((state) => state.onConnectStop);
|
||||||
|
const onConnectEnd = useStoreState((state) => state.onConnectEnd);
|
||||||
|
const connectionMode = useStoreState((state) => state.connectionMode);
|
||||||
|
const handleId = id || null;
|
||||||
|
const isTarget = type === 'target';
|
||||||
|
|
||||||
const onMouseDownHandler = useCallback(
|
const onConnectExtended = useCallback(
|
||||||
(event: React.MouseEvent) => {
|
(params: Connection) => {
|
||||||
onMouseDown(
|
onConnectAction?.(params);
|
||||||
event,
|
onConnect?.(params);
|
||||||
|
},
|
||||||
|
[onConnectAction, onConnect]
|
||||||
|
);
|
||||||
|
|
||||||
|
const onMouseDownHandler = useCallback(
|
||||||
|
(event: React.MouseEvent) => {
|
||||||
|
onMouseDown(
|
||||||
|
event,
|
||||||
|
handleId,
|
||||||
|
nodeId,
|
||||||
|
setConnectionNodeId as unknown as SetSourceIdFunc,
|
||||||
|
setPosition as unknown as SetPosition,
|
||||||
|
onConnectExtended,
|
||||||
|
isTarget,
|
||||||
|
isValidConnection,
|
||||||
|
connectionMode,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
onConnectStart,
|
||||||
|
onConnectStop,
|
||||||
|
onConnectEnd
|
||||||
|
);
|
||||||
|
},
|
||||||
|
[
|
||||||
handleId,
|
handleId,
|
||||||
nodeId,
|
nodeId,
|
||||||
setConnectionNodeId as unknown as SetSourceIdFunc,
|
setConnectionNodeId,
|
||||||
setPosition as unknown as SetPosition,
|
setPosition,
|
||||||
onConnectExtended,
|
onConnectExtended,
|
||||||
isTarget,
|
isTarget,
|
||||||
isValidConnection,
|
isValidConnection,
|
||||||
connectionMode,
|
connectionMode,
|
||||||
undefined,
|
|
||||||
undefined,
|
|
||||||
onConnectStart,
|
onConnectStart,
|
||||||
onConnectStop,
|
onConnectStop,
|
||||||
onConnectEnd
|
onConnectEnd,
|
||||||
);
|
]
|
||||||
},
|
);
|
||||||
[
|
|
||||||
handleId,
|
|
||||||
nodeId,
|
|
||||||
setConnectionNodeId,
|
|
||||||
setPosition,
|
|
||||||
onConnectExtended,
|
|
||||||
isTarget,
|
|
||||||
isValidConnection,
|
|
||||||
connectionMode,
|
|
||||||
onConnectStart,
|
|
||||||
onConnectStop,
|
|
||||||
onConnectEnd,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
const handleClasses = cc([
|
const handleClasses = cc([
|
||||||
'react-flow__handle',
|
'react-flow__handle',
|
||||||
`react-flow__handle-${position}`,
|
`react-flow__handle-${position}`,
|
||||||
'nodrag',
|
'nodrag',
|
||||||
className,
|
className,
|
||||||
{
|
{
|
||||||
source: !isTarget,
|
source: !isTarget,
|
||||||
target: isTarget,
|
target: isTarget,
|
||||||
connectable: isConnectable,
|
connectable: isConnectable,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
data-handleid={handleId}
|
data-handleid={handleId}
|
||||||
data-nodeid={nodeId}
|
data-nodeid={nodeId}
|
||||||
data-handlepos={position}
|
data-handlepos={position}
|
||||||
className={handleClasses}
|
className={handleClasses}
|
||||||
onMouseDown={onMouseDownHandler}
|
onMouseDown={onMouseDownHandler}
|
||||||
{...rest}
|
ref={ref}
|
||||||
>
|
{...rest}
|
||||||
{children}
|
>
|
||||||
</div>
|
{children}
|
||||||
);
|
</div>
|
||||||
};
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
Handle.displayName = 'Handle';
|
Handle.displayName = 'Handle';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user