AutoHandle.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { useEffect, useRef, useState } from "react";
  2. import { Graph, Node } from "@antv/x6";
  3. import img from "@/assets/wf_icon_autohandle.gif";
  4. import { MenuProps } from "antd";
  5. import Port from "./Port";
  6. import Content from "./Content";
  7. export default ({ node, graph }: { node: Node; graph: Graph }) => {
  8. const ref = useRef<HTMLDivElement>(null);
  9. const { width, height } = node.getSize();
  10. const [hovered, setHovered] = useState(false);
  11. const [isSelected, setIsSelected] = useState(false);
  12. const items: MenuProps["items"] = [
  13. { key: "copy", label: "复制" },
  14. { key: "delete", label: "删除" },
  15. ];
  16. useEffect(() => {
  17. const { offsetWidth = 0, offsetHeight = 0 } = ref.current || {};
  18. if (offsetHeight !== height || offsetWidth !== width) {
  19. node.resize(offsetWidth, offsetHeight);
  20. }
  21. }, []);
  22. graph?.on("selection:changed", (args) => {
  23. setIsSelected(graph.isSelected(node));
  24. });
  25. return (
  26. <div
  27. className="flow-node text-14px relative"
  28. style={{ borderColor: isSelected || hovered ? "#0e52e0" : "#d9d9d9" }}
  29. ref={ref}
  30. onMouseEnter={() => setHovered(true)}
  31. onMouseLeave={() => setHovered(false)}
  32. >
  33. <Content
  34. img={img}
  35. node={node}
  36. graph={graph}
  37. items={items}
  38. headerStyle={{
  39. backgroundImage:
  40. "linear-gradient(to bottom, rgba(32, 139, 226, 0.2), #ffffff)",
  41. }}
  42. />
  43. <Port hovered={hovered} out={false} style={{ left: -7, cursor: "default" }} node={node} graph={graph} />
  44. <Port hovered={hovered} style={{ right: -7, cursor: "crosshair" }} node={node} graph={graph} />
  45. </div>
  46. );
  47. };