in packages/x-flow/src/components/CustomEdge/index.tsx [17:160]
export default memo((edge: any) => {
const {
id,
selected,
sourceX,
sourceY,
targetX,
targetY,
source,
target,
sourceHandleId,
} = edge;
const reactflow = useReactFlow();
const [isHovered, setIsHovered] = useState(false);
const [edgePath, labelX, labelY] = getBezierPath({
sourceX,
sourceY,
targetX,
targetY,
});
const { globalConfig, settingMap, readOnly } = useContext(ConfigContext);
const hideEdgeAddBtn = globalConfig?.edge?.hideEdgeAddBtn ?? false;
const hideEdgeDelBtn = globalConfig?.edge?.hideEdgeDelBtn ?? false;
const deletable = globalConfig?.edge?.deletable ?? true;
const { nodes, edges, addEdges, mousePosition, onEdgesChange, layout } =
useStore(
(state: any) => ({
layout: state.layout,
nodes: state.nodes,
edges: state.edges,
mousePosition: state.mousePosition,
addEdges: state.addEdges,
onEdgesChange: state.onEdgesChange,
}),
shallow
);
const { addNodes } = useFlow();
const handleAddNode = (data: any) => {
const { screenToFlowPosition } = reactflow;
const { x, y } = screenToFlowPosition({
x: mousePosition.pageX,
y: mousePosition.pageY,
});
const targetId = uuid();
const title = settingMap[data?._nodeType]?.title || data?._nodeType;
const newNodes = {
id: targetId,
type: 'custom',
data: {
title: `${title}_${uuid4()}`,
...data,
},
position: { x, y },
};
const newEdges = [
{
id: uuid(),
source,
target: targetId,
deletable: deletable,
...(sourceHandleId && { sourceHandle: sourceHandleId }),
},
{
id: uuid(),
source: targetId,
deletable: deletable,
target,
},
];
addNodes(newNodes as any);
addEdges(newEdges);
onEdgesChange([{ id, type: 'remove' }]);
};
let edgeExtra: any = {
sourceX: edge.sourceX - 15,
targetX: edge.targetX + 15,
};
if (layout === 'TB') {
edgeExtra = {
sourceY: edge.sourceY - 15,
targetY: edge.targetY + 13,
};
}
return (
<g
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
>
<BezierEdge
{...edge}
{...edgeExtra}
edgePath={edgePath}
label={
isHovered && (
<EdgeLabelRenderer>
<div
className="custom-edge-line"
style={{
transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,
}}
>
<div className="line-content">
{!hideEdgeDelBtn && !readOnly && (
<div
className="line-icon-box"
onClick={() => {
if (readOnly) {
return;
}
onEdgesChange([{ id, type: 'remove' }]);
}}
>
<CloseOutlined style={{ color: '#fff', fontSize: 10 }} />
</div>
)}
{!hideEdgeAddBtn && !readOnly && (
<NodeSelectPopover
placement="right"
addNode={handleAddNode}
>
<div className="line-icon-box">
<PlusOutlined style={{ color: '#fff', fontSize: 10 }} />
</div>
</NodeSelectPopover>
)}
</div>
</div>
</EdgeLabelRenderer>
)
}
/>
</g>
);
});