evo-ai/frontend/app/agents/workflows/edges/DefaultEdge.tsx

120 lines
4.7 KiB
TypeScript

/*
┌──────────────────────────────────────────────────────────────────────────────┐
│ @author: Davidson Gomes │
│ @file: /app/agents/workflows/edges/DefaultEdge.tsx │
│ Developed by: Davidson Gomes │
│ Creation date: May 13, 2025 │
│ Contact: contato@evolution-api.com │
├──────────────────────────────────────────────────────────────────────────────┤
│ @copyright © Evolution API 2025. All rights reserved. │
│ Licensed under the Apache License, Version 2.0 │
│ │
│ You may not use this file except in compliance with the License. │
│ You may obtain a copy of the License at │
│ │
│ http://www.apache.org/licenses/LICENSE-2.0 │
│ │
│ Unless required by applicable law or agreed to in writing, software │
│ distributed under the License is distributed on an "AS IS" BASIS, │
│ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. │
│ See the License for the specific language governing permissions and │
│ limitations under the License. │
├──────────────────────────────────────────────────────────────────────────────┤
│ @important │
│ For any future changes to the code in this file, it is recommended to │
│ include, together with the modification, the information of the developer │
│ who changed it and the date of modification. │
└──────────────────────────────────────────────────────────────────────────────┘
*/
import {
BaseEdge,
EdgeLabelRenderer,
EdgeProps,
getSmoothStepPath,
useReactFlow,
} from "@xyflow/react";
import { Trash2 } from "lucide-react";
export default function DefaultEdge({
id,
sourceX,
sourceY,
targetX,
targetY,
sourcePosition,
targetPosition,
style = {},
selected,
}: EdgeProps) {
const { setEdges } = useReactFlow();
const [edgePath, labelX, labelY] = getSmoothStepPath({
sourceX,
sourceY,
sourcePosition,
targetX,
targetY,
targetPosition,
borderRadius: 15,
});
const onEdgeClick = () => {
console.log("onEdgeClick", id);
setEdges((edges) => edges.filter((edge) => edge.id !== id));
};
return (
<>
<svg>
<defs>
<marker
id="arrowhead"
viewBox="0 0 10 16"
refX="12"
refY="8"
markerWidth="4"
markerHeight="5"
orient="auto"
>
<path d="M 0 0 L 10 8 L 0 16 z" fill="gray" />
</marker>
</defs>
</svg>
<BaseEdge
id={id}
path={edgePath}
className="edge-dashed-animated"
style={{
...style,
stroke: '#10B981',
strokeWidth: 3,
}}
markerEnd="url(#arrowhead)"
/>
{selected && (
<EdgeLabelRenderer>
<div
style={{
position: "absolute",
transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,
fontSize: 12,
pointerEvents: "all",
zIndex: 1000,
}}
className="nodrag nopan"
>
<button
className="rounded-full bg-white p-1 shadow-md"
onClick={onEdgeClick}
>
<Trash2 className="text-red-500" size={16} />
</button>
</div>
</EdgeLabelRenderer>
)}
</>
);
}