diff --git a/example/src/Basic/index.tsx b/example/src/Basic/index.tsx index a3cebcbf..7641efa9 100644 --- a/example/src/Basic/index.tsx +++ b/example/src/Basic/index.tsx @@ -1,15 +1,12 @@ -import { useState, MouseEvent } from 'react'; +import { MouseEvent } from 'react'; import ReactFlow, { - addEdge, + ReactFlowProvider, Background, BackgroundVariant, Node, Edge, - Connection, - useNodesState, - useEdgesState, - ReactFlowInstance, + useReactFlow, } from 'react-flow-renderer'; const onNodeDragStop = (_: MouseEvent, node: Node) => console.log('drag stop', node); @@ -28,52 +25,45 @@ const initialEdges: Edge[] = [ ]; const BasicFlow = () => { - const [rfInstance, setRfInstance] = useState(null); - const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes); - const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges); - const onConnect = (params: Edge | Connection) => setEdges((els) => addEdge(params, els)); - const onPaneReady = (reactFlowInstance: ReactFlowInstance) => setRfInstance(reactFlowInstance); + const instance = useReactFlow(); const updatePos = () => { - setNodes((nds) => { - return nds.map((node) => { + instance.setNodes((nodes) => + nodes.map((node) => { node.position = { x: Math.random() * 400, y: Math.random() * 400, }; return node; - }); - }); + }) + ); }; - const logToObject = () => console.log(rfInstance?.toObject()); - const resetTransform = () => rfInstance?.setTransform({ x: 0, y: 0, zoom: 1 }); + const logToObject = () => console.log(instance.toObject()); + const resetTransform = () => instance.setViewport({ x: 0, y: 0, zoom: 1 }); const toggleClassnames = () => { - setNodes((nds) => { - return nds.map((node) => { + instance.setNodes((nodes) => + nodes.map((node) => { node.className = node.className === 'light' ? 'dark' : 'light'; return node; - }); - }); + }) + ); }; return ( @@ -93,4 +83,10 @@ const BasicFlow = () => { ); }; -export default BasicFlow; +export default function App() { + return ( + + + + ); +} diff --git a/example/src/DefaultNodes/index.tsx b/example/src/DefaultNodes/index.tsx index 3e2f8dcf..8c69926d 100644 --- a/example/src/DefaultNodes/index.tsx +++ b/example/src/DefaultNodes/index.tsx @@ -1,13 +1,10 @@ -import { useState } from 'react'; import ReactFlow, { + useReactFlow, Background, BackgroundVariant, Node, Edge, - ReactFlowInstance, ReactFlowProvider, - useUpdateNodes, - useUpdateEdges, } from 'react-flow-renderer'; const defaultNodes: Node[] = [ @@ -27,40 +24,34 @@ const defaultEdgeOptions = { }; const DefaultNodes = () => { - const [rfInstance, setRfInstance] = useState(null); - const updateNodes = useUpdateNodes(); - const updateEdges = useUpdateEdges(); + const instance = useReactFlow(); - const logToObject = () => console.log(rfInstance?.toObject()); - const resetTransform = () => rfInstance?.setTransform({ x: 0, y: 0, zoom: 1 }); + const logToObject = () => console.log(instance.toObject()); + const resetTransform = () => instance.setViewport({ x: 0, y: 0, zoom: 1 }); const updateNodePositions = () => { - updateNodes((nodes, setNodes) => { - setNodes( - nodes.map((node) => { - node.position = { - x: Math.random() * 400, - y: Math.random() * 400, - }; + instance.setNodes((nodes) => + nodes.map((node) => { + node.position = { + x: Math.random() * 400, + y: Math.random() * 400, + }; - return node; - }) - ); - }); + return node; + }) + ); }; const updateEdgeColors = () => { - updateEdges((edges, setEdges) => { - setEdges( - edges.map((edge) => { - edge.style = { - stroke: '#ff5050', - }; + instance.setEdges((edges) => + edges.map((edge) => { + edge.style = { + stroke: '#ff5050', + }; - return edge; - }) - ); - }); + return edge; + }) + ); }; return ( @@ -68,7 +59,6 @@ const DefaultNodes = () => { defaultNodes={defaultNodes} defaultEdges={defaultEdges} defaultEdgeOptions={defaultEdgeOptions} - onPaneReady={setRfInstance} fitViewOnInit > diff --git a/example/src/Interaction/index.tsx b/example/src/Interaction/index.tsx index 6862b280..c31add29 100644 --- a/example/src/Interaction/index.tsx +++ b/example/src/Interaction/index.tsx @@ -7,7 +7,7 @@ import ReactFlow, { Connection, Edge, PanOnScrollMode, - FlowTransform, + Viewport, useNodesState, useEdgesState, } from 'react-flow-renderer'; @@ -31,7 +31,7 @@ const onEdgeClick = (_: MouseEvent, edge: Edge) => console.log('click', edge); const onPaneClick = (event: MouseEvent) => console.log('onPaneClick', event); const onPaneScroll = (event?: WheelEvent) => console.log('onPaneScroll', event); const onPaneContextMenu = (event: MouseEvent) => console.log('onPaneContextMenu', event); -const onMoveEnd = (flowTranasform?: FlowTransform) => console.log('onMoveEnd', flowTranasform); +const onMoveEnd = (viewport?: Viewport) => console.log('onMoveEnd', viewport); const InteractionFlow = () => { const [nodes, , onNodesChange] = useNodesState(initialNodes); diff --git a/example/src/NestedNodes/index.tsx b/example/src/NestedNodes/index.tsx index 1e4115ac..d213c202 100644 --- a/example/src/NestedNodes/index.tsx +++ b/example/src/NestedNodes/index.tsx @@ -107,7 +107,7 @@ const NestedFlow = () => { }; const logToObject = () => console.log(rfInstance?.toObject()); - const resetTransform = () => rfInstance?.setTransform({ x: 0, y: 0, zoom: 1 }); + const resetTransform = () => rfInstance?.setViewport({ x: 0, y: 0, zoom: 1 }); const toggleClassnames = () => { setNodes((nds) => { diff --git a/example/src/Overview/index.tsx b/example/src/Overview/index.tsx index f7ca917f..dc2ea238 100644 --- a/example/src/Overview/index.tsx +++ b/example/src/Overview/index.tsx @@ -5,7 +5,7 @@ import ReactFlow, { Controls, Background, Node, - FlowTransform, + Viewport, SnapGrid, Connection, Edge, @@ -36,8 +36,8 @@ const onPaneReady = (reactFlowInstance: ReactFlowInstance) => { console.log('pane ready:', reactFlowInstance); }; -const onMoveStart = (transform?: FlowTransform) => console.log('zoom/move start', transform); -const onMoveEnd = (transform?: FlowTransform) => console.log('zoom/move end', transform); +const onMoveStart = (transform?: Viewport) => console.log('zoom/move start', transform); +const onMoveEnd = (transform?: Viewport) => console.log('zoom/move end', transform); const onEdgeContextMenu = (_: MouseEvent, edge: Edge) => console.log('edge context menu', edge); const onEdgeMouseEnter = (_: MouseEvent, edge: Edge) => console.log('edge mouse enter', edge); const onEdgeMouseMove = (_: MouseEvent, edge: Edge) => console.log('edge mouse move', edge); diff --git a/example/src/SaveRestore/Controls.tsx b/example/src/SaveRestore/Controls.tsx index e7576832..4c4537c7 100644 --- a/example/src/SaveRestore/Controls.tsx +++ b/example/src/SaveRestore/Controls.tsx @@ -1,5 +1,5 @@ import React, { memo, useCallback, Dispatch, FC } from 'react'; -import { useZoomPanHelper, ReactFlowInstance, Edge, Node, FlowExportObject } from 'react-flow-renderer'; +import { useReactFlow, ReactFlowInstance, Edge, Node, ReactFlowJsonObject } from 'react-flow-renderer'; import localforage from 'localforage'; localforage.config({ @@ -18,7 +18,7 @@ type ControlsProps = { }; const Controls: FC = ({ rfInstance, setNodes, setEdges }) => { - const { setTransform } = useZoomPanHelper(); + const { setViewport } = useReactFlow(); const onSave = useCallback(() => { if (rfInstance) { @@ -29,18 +29,18 @@ const Controls: FC = ({ rfInstance, setNodes, setEdges }) => { const onRestore = useCallback(() => { const restoreFlow = async () => { - const flow: FlowExportObject | null = await localforage.getItem(flowKey); + const flow: ReactFlowJsonObject | null = await localforage.getItem(flowKey); if (flow) { - const [x = 0, y = 0] = flow.position; + const { x, y, zoom } = flow.viewport; setNodes(flow.nodes || []); setEdges(flow.edges || []); - setTransform({ x, y, zoom: flow.zoom || 0 }); + setViewport({ x, y, zoom: zoom || 0 }); } }; restoreFlow(); - }, [setNodes, setEdges, setTransform]); + }, [setNodes, setEdges, setViewport]); const onAdd = useCallback(() => { const newNode = { diff --git a/example/src/Subflow/index.tsx b/example/src/Subflow/index.tsx index aa3ad9b3..c624ca0d 100644 --- a/example/src/Subflow/index.tsx +++ b/example/src/Subflow/index.tsx @@ -129,7 +129,7 @@ const BasicFlow = () => { }; const logToObject = () => console.log(rfInstance?.toObject()); - const resetTransform = () => rfInstance?.setTransform({ x: 0, y: 0, zoom: 1 }); + const resetTransform = () => rfInstance?.setViewport({ x: 0, y: 0, zoom: 1 }); const toggleClassnames = () => { setNodes((nds) => { diff --git a/example/src/Undirectional/index.tsx b/example/src/Undirectional/index.tsx index 79b5615a..26ad5ad6 100644 --- a/example/src/Undirectional/index.tsx +++ b/example/src/Undirectional/index.tsx @@ -1,9 +1,9 @@ import { useCallback } from 'react'; import ReactFlow, { + useReactFlow, NodeTypesType, addEdge, - useZoomPanHelper, ReactFlowProvider, Node, Connection, @@ -184,7 +184,7 @@ const UpdateNodeInternalsFlow = () => { const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges); const onConnect = (params: Edge | Connection) => setEdges((els) => addEdge(params, els)); - const { project } = useZoomPanHelper(); + const { project } = useReactFlow(); const onEdgeUpdate = (oldEdge: Edge, newConnection: Connection) => setEdges((els) => updateEdge(oldEdge, newConnection, els)); diff --git a/example/src/UseUpdateNodeInternals/index.tsx b/example/src/UseUpdateNodeInternals/index.tsx index e04593b6..3fc6555f 100644 --- a/example/src/UseUpdateNodeInternals/index.tsx +++ b/example/src/UseUpdateNodeInternals/index.tsx @@ -3,7 +3,7 @@ import { useCallback, CSSProperties } from 'react'; import ReactFlow, { NodeTypesType, addEdge, - useZoomPanHelper, + useReactFlow, ReactFlowProvider, Node, Connection, @@ -41,7 +41,7 @@ const UpdateNodeInternalsFlow = () => { const onConnect = (params: Edge | Connection) => setEdges((els) => addEdge(params, els)); const updateNodeInternals = useUpdateNodeInternals(); - const { project } = useZoomPanHelper(); + const { project } = useReactFlow(); const onPaneClick = useCallback( (evt) => diff --git a/example/src/UseZoomPanHelper/index.tsx b/example/src/UseZoomPanHelper/index.tsx index 996a35f7..32fd0eba 100644 --- a/example/src/UseZoomPanHelper/index.tsx +++ b/example/src/UseZoomPanHelper/index.tsx @@ -5,7 +5,7 @@ import ReactFlow, { addEdge, Background, MiniMap, - useZoomPanHelper, + useReactFlow, ReactFlowProvider, Connection, Edge, @@ -33,7 +33,7 @@ const UseZoomPanHelperFlow = () => { const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes); const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges); const onConnect = (params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)); - const { project, setCenter, zoomIn, zoomOut } = useZoomPanHelper(); + const { project, setCenter, zoomIn, zoomOut } = useReactFlow(); const onPaneClick = useCallback( (evt) => { diff --git a/src/additional-components/Background/index.tsx b/src/additional-components/Background/index.tsx index 8f73da12..89b87e46 100644 --- a/src/additional-components/Background/index.tsx +++ b/src/additional-components/Background/index.tsx @@ -1,16 +1,9 @@ -import React, { memo, useMemo, FC, HTMLAttributes } from 'react'; +import React, { memo, useMemo, FC } from 'react'; import cc from 'classcat'; import { useStore } from '../../store'; -import { BackgroundVariant, ReactFlowState } from '../../types'; import { createGridLinesPath, createGridDotsPath } from './utils'; - -export interface BackgroundProps extends HTMLAttributes { - variant?: BackgroundVariant; - gap?: number; - color?: string; - size?: number; -} +import { BackgroundVariant, ReactFlowState, BackgroundProps } from '../../types'; const defaultColors = { [BackgroundVariant.Dots]: '#81818a', diff --git a/src/additional-components/Controls/index.tsx b/src/additional-components/Controls/index.tsx index 1068d02a..04048d3e 100644 --- a/src/additional-components/Controls/index.tsx +++ b/src/additional-components/Controls/index.tsx @@ -1,7 +1,8 @@ -import React, { memo, useCallback, HTMLAttributes, FC, useEffect, useState } from 'react'; +import React, { memo, useCallback, FC, useEffect, useState } from 'react'; import cc from 'classcat'; import { useStore, useStoreApi } from '../../store'; +import useViewportHelper from '../../hooks/useViewportHelper'; import PlusIcon from '../../../assets/icons/plus.svg'; import MinusIcon from '../../../assets/icons/minus.svg'; @@ -9,21 +10,7 @@ import FitviewIcon from '../../../assets/icons/fitview.svg'; import LockIcon from '../../../assets/icons/lock.svg'; import UnlockIcon from '../../../assets/icons/unlock.svg'; -import useZoomPanHelper from '../../hooks/useZoomPanHelper'; -import { FitViewParams, ReactFlowState } from '../../types'; - -export interface ControlProps extends HTMLAttributes { - showZoom?: boolean; - showFitView?: boolean; - showInteractive?: boolean; - fitViewParams?: FitViewParams; - onZoomIn?: () => void; - onZoomOut?: () => void; - onFitView?: () => void; - onInteractiveChange?: (interactiveStatus: boolean) => void; -} - -export interface ControlButtonProps extends HTMLAttributes {} +import { ControlProps, ControlButtonProps, ReactFlowState } from '../../types'; export const ControlButton: FC = ({ children, className, ...rest }) => (