Git Product home page Git Product logo

Comments (2)

buchananwill avatar buchananwill commented on June 2, 2024

Moments later, I found a solution! Using the dragging callbacks, I pass the currently drag-engaged node into a ref. In the tick() function, I directly copy the position properties from this ref for the node with matching ID.

    const draggingNodeRef = useRef<Node | undefined>(undefined);
    const {dispatchWithoutListen} = useGlobalDispatch(draggingNodeKey);

    useEffect(() => {
        dispatchWithoutListen(draggingNodeRef)
    }, [draggingNodeRef, dispatchWithoutListen])

    const handleDragStart = useCallback(
        (event: ReactMouseEvent, node: Node, nodes: Node[]) => {


            draggingNodeRef.current = {...node}
    }, [draggingNodeRef])

    const handleDragStop = useCallback(
        (event: ReactMouseEvent, node: Node, nodes: Node[]) => {
        console.log(node, nodes)

            draggingNodeRef.current = undefined
    }, [draggingNodeRef])

    const handleDrag = useCallback(
        (event: ReactMouseEvent, node: Node, nodes: Node[]) => {
        console.log(node, nodes)
            draggingNodeRef.current = {...node}
    }, [draggingNodeRef])

    useEffect(() => {
        setNodes(initialNodes as FlowNode[])
        setEdges(initialEdges as FlowEdge[])
    }, [initialNodes, initialEdges, setEdges, setNodes])

    return (

        <ReactFlow
            nodes={nodes}
            edges={edges}
            onNodesChange={onNodesChange}
            onEdgesChange={onEdgesChange}
            fitView
            onNodeDragStart={handleDragStart}
            onNodeDrag={handleDrag}
            onNodeDragStop={handleDragStop}
        >{children}
            simulation = simRef.current
            const scopedNodes = nodeListRef.current;

            let foundDrag = false
            for (let i = 0; i < scopedNodes.length; i++){
                const node = scopedNodes[i];

                const dragging = draggingNode?.current?.id === node?.id
                // Setting the fx/fy properties of a node tells the simulation to "fix"
                // the node at that position and ignore any forces that would normally
                // cause it to move.

                if (dragging) {
                    foundDrag = true
                    nodeIndex = i
                    // Copy the current position from the ref
                    node.fx = draggingNode?.current.position.x;
                    node.fy = draggingNode?.current.position.y;
                } else if (node) {
                   delete node.fx
                    delete node.fy
                }
            }

from xyflow.

peterkogo avatar peterkogo commented on June 2, 2024

Glad you solved your issue! Thanks for posting a solution for future travelers.

from xyflow.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.