diff --git a/packages/core/package.json b/packages/core/package.json index 025abc98..a5622a09 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -22,7 +22,7 @@ "d3-drag": "^3.0.0", "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0", - "zustand": "^3.7.2" + "zustand": "^4.0.0" }, "peerDependencies": { "react": ">=18", diff --git a/packages/core/src/components/ConnectionLine/index.tsx b/packages/core/src/components/ConnectionLine/index.tsx index 8858a197..3f6b96ab 100644 --- a/packages/core/src/components/ConnectionLine/index.tsx +++ b/packages/core/src/components/ConnectionLine/index.tsx @@ -1,10 +1,10 @@ import React, { CSSProperties, useCallback } from 'react'; import shallow from 'zustand/shallow'; -import { useStore } from '../../store'; +import { useStore } from '../../hooks/useStore'; import { getBezierPath } from '../Edges/BezierEdge'; import { getSmoothStepPath } from '../Edges/SmoothStepEdge'; -import { ConnectionLineType, ConnectionLineComponent, HandleType, Position } from '../../types'; +import { ConnectionLineType, ConnectionLineComponent, HandleType, Position, ReactFlowStore } from '../../types'; import { getSimpleBezierPath } from '../Edges/SimpleBezierEdge'; import { internalsSymbol } from '../../utils'; @@ -34,7 +34,7 @@ export default ({ }: ConnectionLineProps) => { const { fromNode, handleId, toX, toY } = useStore( useCallback( - (s) => ({ + (s: ReactFlowStore) => ({ fromNode: s.nodeInternals.get(connectionNodeId), handleId: s.connectionHandleId, toX: (s.connectionPosition.x - s.transform[0]) / s.transform[2], diff --git a/packages/core/src/components/Edges/wrapEdge.tsx b/packages/core/src/components/Edges/wrapEdge.tsx index 7c394f11..f1ed3285 100644 --- a/packages/core/src/components/Edges/wrapEdge.tsx +++ b/packages/core/src/components/Edges/wrapEdge.tsx @@ -1,7 +1,7 @@ import React, { memo, ComponentType, useState, useMemo, KeyboardEvent, useRef } from 'react'; import cc from 'classcat'; -import { useStoreApi } from '../../store'; +import { useStoreApi } from '../../hooks/useStore'; import { ARIA_EDGE_DESC_KEY } from '../A11yDescriptions'; import { handleMouseDown } from '../Handle/handler'; import { EdgeAnchor } from './EdgeAnchor'; diff --git a/packages/core/src/components/Handle/index.tsx b/packages/core/src/components/Handle/index.tsx index 357eac76..7f514843 100644 --- a/packages/core/src/components/Handle/index.tsx +++ b/packages/core/src/components/Handle/index.tsx @@ -2,7 +2,7 @@ import React, { memo, useContext, HTMLAttributes, forwardRef } from 'react'; import cc from 'classcat'; import shallow from 'zustand/shallow'; -import { useStore, useStoreApi } from '../../store'; +import { useStore, useStoreApi } from '../../hooks/useStore'; import NodeIdContext from '../../contexts/NodeIdContext'; import { HandleProps, Connection, ReactFlowState, Position } from '../../types'; import { checkElementBelowIsValid, handleMouseDown } from './handler'; diff --git a/packages/core/src/components/Nodes/wrapNode.tsx b/packages/core/src/components/Nodes/wrapNode.tsx index d8a67c23..0b7d619c 100644 --- a/packages/core/src/components/Nodes/wrapNode.tsx +++ b/packages/core/src/components/Nodes/wrapNode.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, memo, ComponentType, MouseEvent, KeyboardEvent } from 'react'; import cc from 'classcat'; -import { useStoreApi } from '../../store'; +import { useStoreApi } from '../../hooks/useStore'; import { Provider } from '../../contexts/NodeIdContext'; import { ARIA_NODE_DESC_KEY } from '../A11yDescriptions'; import useDrag from '../../hooks/useDrag'; diff --git a/packages/core/src/components/NodesSelection/index.tsx b/packages/core/src/components/NodesSelection/index.tsx index 0febc5c2..80a07288 100644 --- a/packages/core/src/components/NodesSelection/index.tsx +++ b/packages/core/src/components/NodesSelection/index.tsx @@ -7,7 +7,7 @@ import React, { memo, useRef, MouseEvent, KeyboardEvent, useEffect } from 'react import cc from 'classcat'; import shallow from 'zustand/shallow'; -import { useStore, useStoreApi } from '../../store'; +import { useStore, useStoreApi } from '../../hooks/useStore'; import { Node, ReactFlowState } from '../../types'; import { getRectOfNodes } from '../../utils/graph'; import useDrag from '../../hooks/useDrag'; diff --git a/packages/core/src/components/ReactFlowProvider/index.tsx b/packages/core/src/components/ReactFlowProvider/index.tsx index 3f765eed..7c4862a4 100644 --- a/packages/core/src/components/ReactFlowProvider/index.tsx +++ b/packages/core/src/components/ReactFlowProvider/index.tsx @@ -1,10 +1,19 @@ -import React, { FC, PropsWithChildren } from 'react'; +import React, { FC, PropsWithChildren, useRef } from 'react'; +import { StoreApi } from 'zustand'; -import { Provider, createStore } from '../../store'; +import { Provider } from '../../contexts/RFStoreContext'; +import { createRFStore } from '../../store'; +import { ReactFlowState } from '../../types'; -const ReactFlowProvider: FC> = ({ children }) => ( - {children} -); +const ReactFlowProvider: FC> = ({ children }) => { + const storeRef = useRef | null>(null); + + if (!storeRef.current) { + storeRef.current = createRFStore(); + } + + return {children}; +}; ReactFlowProvider.displayName = 'ReactFlowProvider'; diff --git a/packages/core/src/components/SelectionListener/index.tsx b/packages/core/src/components/SelectionListener/index.tsx index 6f052a3a..be00831a 100644 --- a/packages/core/src/components/SelectionListener/index.tsx +++ b/packages/core/src/components/SelectionListener/index.tsx @@ -2,7 +2,7 @@ import { memo, useEffect } from 'react'; import shallow from 'zustand/shallow'; import { ReactFlowState, OnSelectionChangeFunc, Node, Edge } from '../../types'; -import { useStore } from '../../store'; +import { useStore } from '../../hooks/useStore'; interface SelectionListenerProps { onSelectionChange: OnSelectionChangeFunc; diff --git a/packages/core/src/components/StoreUpdater/index.tsx b/packages/core/src/components/StoreUpdater/index.tsx index 2ccc56cc..43ae7ea6 100644 --- a/packages/core/src/components/StoreUpdater/index.tsx +++ b/packages/core/src/components/StoreUpdater/index.tsx @@ -1,8 +1,8 @@ import { useEffect } from 'react'; -import { SetState } from 'zustand'; +import { StoreApi } from 'zustand'; import shallow from 'zustand/shallow'; -import { useStore, useStoreApi } from '../../store'; +import { useStore, useStoreApi } from '../../hooks/useStore'; import { Node, Edge, ReactFlowState, CoordinateExtent, ReactFlowProps } from '../../types'; type StoreUpdaterProps = Pick< @@ -61,7 +61,7 @@ function useStoreUpdater(value: T | undefined, setStoreState: (param: T) => v }, [value]); } -function useDirectStoreUpdater(key: keyof ReactFlowState, value: any, setState: SetState) { +function useDirectStoreUpdater(key: keyof ReactFlowState, value: any, setState: StoreApi['setState']) { useEffect(() => { if (typeof value !== 'undefined') { // @ts-ignore diff --git a/packages/core/src/components/UserSelection/index.tsx b/packages/core/src/components/UserSelection/index.tsx index 76ee7085..6a0e8a5a 100644 --- a/packages/core/src/components/UserSelection/index.tsx +++ b/packages/core/src/components/UserSelection/index.tsx @@ -5,7 +5,7 @@ import React, { memo, useState, useRef } from 'react'; import shallow from 'zustand/shallow'; -import { useStore, useStoreApi } from '../../store'; +import { useStore, useStoreApi } from '../../hooks/useStore'; import { getSelectionChanges } from '../../utils/changes'; import { XYPosition, ReactFlowState, NodeChange, EdgeChange, Rect } from '../../types'; import { getConnectedEdges, getNodesInside } from '../../utils/graph'; diff --git a/packages/core/src/container/EdgeRenderer/MarkerDefinitions.tsx b/packages/core/src/container/EdgeRenderer/MarkerDefinitions.tsx index 7ce597ef..d887df90 100644 --- a/packages/core/src/container/EdgeRenderer/MarkerDefinitions.tsx +++ b/packages/core/src/container/EdgeRenderer/MarkerDefinitions.tsx @@ -1,6 +1,6 @@ import React, { memo, useCallback } from 'react'; -import { useStore } from '../../store'; +import { useStore } from '../../hooks/useStore'; import { EdgeMarker, ReactFlowState } from '../../types'; import { getMarkerId } from '../../utils/graph'; import { useMarkerSymbol } from './MarkerSymbols'; diff --git a/packages/core/src/container/EdgeRenderer/index.tsx b/packages/core/src/container/EdgeRenderer/index.tsx index cc293d70..8830a400 100644 --- a/packages/core/src/container/EdgeRenderer/index.tsx +++ b/packages/core/src/container/EdgeRenderer/index.tsx @@ -2,7 +2,7 @@ import React, { memo, CSSProperties } from 'react'; import shallow from 'zustand/shallow'; import cc from 'classcat'; -import { useStore } from '../../store'; +import { useStore } from '../../hooks/useStore'; import ConnectionLine from '../../components/ConnectionLine/index'; import MarkerDefinitions from './MarkerDefinitions'; import { getEdgePositions, getHandle, getNodeData } from './utils'; diff --git a/packages/core/src/container/FlowRenderer/index.tsx b/packages/core/src/container/FlowRenderer/index.tsx index ba55e988..7666d5ff 100644 --- a/packages/core/src/container/FlowRenderer/index.tsx +++ b/packages/core/src/container/FlowRenderer/index.tsx @@ -1,6 +1,6 @@ import React, { memo, ReactNode, WheelEvent, MouseEvent } from 'react'; -import { useStore, useStoreApi } from '../../store'; +import { useStore, useStoreApi } from '../../hooks/useStore'; import useGlobalKeyHandler from '../../hooks/useGlobalKeyHandler'; import useKeyPress from '../../hooks/useKeyPress'; import { GraphViewProps } from '../GraphView'; diff --git a/packages/core/src/container/NodeRenderer/index.tsx b/packages/core/src/container/NodeRenderer/index.tsx index 302bb3d9..a465e195 100644 --- a/packages/core/src/container/NodeRenderer/index.tsx +++ b/packages/core/src/container/NodeRenderer/index.tsx @@ -2,10 +2,10 @@ import React, { memo, useMemo, ComponentType, useEffect, useRef } from 'react'; import shallow from 'zustand/shallow'; import useVisibleNodes from '../../hooks/useVisibleNodes'; -import { useStore } from '../../store'; +import { useStore } from '../../hooks/useStore'; +import { internalsSymbol } from '../../utils'; import { containerStyle } from '../../styles'; import { NodeMouseHandler, NodeTypesWrapped, Position, ReactFlowState, WrapNodeProps } from '../../types'; -import { internalsSymbol } from '../../utils'; interface NodeRendererProps { nodeTypes: NodeTypesWrapped; diff --git a/packages/core/src/container/ReactFlow/Wrapper.tsx b/packages/core/src/container/ReactFlow/Wrapper.tsx index 23414ec4..e7bd27f3 100644 --- a/packages/core/src/container/ReactFlow/Wrapper.tsx +++ b/packages/core/src/container/ReactFlow/Wrapper.tsx @@ -1,6 +1,7 @@ import React, { FC, PropsWithChildren } from 'react'; -import { Provider, createStore, useStoreApi } from '../../store'; +import { useStoreApi } from '../../hooks/useStore'; +import ReactFlowProvider from '../../components/ReactFlowProvider'; const Wrapper: FC> = ({ children }) => { let isWrapped = true; @@ -17,7 +18,7 @@ const Wrapper: FC> = ({ children }) => { return <>{children}; } - return {children}; + return {children}; }; Wrapper.displayName = 'ReactFlowWrapper'; diff --git a/packages/core/src/container/Viewport/index.tsx b/packages/core/src/container/Viewport/index.tsx index ec6877bd..32880b10 100644 --- a/packages/core/src/container/Viewport/index.tsx +++ b/packages/core/src/container/Viewport/index.tsx @@ -1,6 +1,6 @@ import React, { ReactNode } from 'react'; -import { useStore } from '../../store'; +import { useStore } from '../../hooks/useStore'; import { ReactFlowState } from '../../types'; const selector = (s: ReactFlowState) => `translate(${s.transform[0]}px,${s.transform[1]}px) scale(${s.transform[2]})`; diff --git a/packages/core/src/container/ZoomPane/index.tsx b/packages/core/src/container/ZoomPane/index.tsx index 4d0dd67f..3f5be28e 100644 --- a/packages/core/src/container/ZoomPane/index.tsx +++ b/packages/core/src/container/ZoomPane/index.tsx @@ -6,10 +6,10 @@ import shallow from 'zustand/shallow'; import { clamp } from '../../utils'; import useKeyPress from '../../hooks/useKeyPress'; import useResizeHandler from '../../hooks/useResizeHandler'; -import { useStore, useStoreApi } from '../../store'; -import { Viewport, PanOnScrollMode, ReactFlowState } from '../../types'; +import { useStore, useStoreApi } from '../../hooks/useStore'; import { FlowRendererProps } from '../FlowRenderer'; import { containerStyle } from '../../styles'; +import { Viewport, PanOnScrollMode, ReactFlowState } from '../../types'; type ZoomPaneProps = Omit< FlowRendererProps, diff --git a/packages/core/src/contexts/RFStoreContext.ts b/packages/core/src/contexts/RFStoreContext.ts new file mode 100644 index 00000000..7f0d8be8 --- /dev/null +++ b/packages/core/src/contexts/RFStoreContext.ts @@ -0,0 +1,8 @@ +import { createContext } from 'react'; + +import { createRFStore } from '../store'; + +const StoreContext = createContext | null>(null); + +export const Provider = StoreContext.Provider; +export default StoreContext; diff --git a/packages/core/src/hooks/useDrag/index.ts b/packages/core/src/hooks/useDrag/index.ts index a43c43b9..025621d4 100644 --- a/packages/core/src/hooks/useDrag/index.ts +++ b/packages/core/src/hooks/useDrag/index.ts @@ -2,7 +2,7 @@ import { RefObject, useEffect, useRef, MouseEvent, useState, useCallback } from import { D3DragEvent, drag, SubjectPosition } from 'd3-drag'; import { select } from 'd3-selection'; -import { useStoreApi } from '../../store'; +import { useStoreApi } from '../../hooks/useStore'; import { pointToRendererPoint } from '../../utils/graph'; import { NodeDragItem, Node, SelectionDragHandler } from '../../types'; import { getDragItems, getEventHandlerParams, hasSelector, calcNextPosition } from './utils'; diff --git a/packages/core/src/hooks/useEdges.ts b/packages/core/src/hooks/useEdges.ts index eb2fa464..eee73eb0 100644 --- a/packages/core/src/hooks/useEdges.ts +++ b/packages/core/src/hooks/useEdges.ts @@ -1,4 +1,4 @@ -import { useStore } from '../store'; +import { useStore } from '../hooks/useStore'; import { Edge, ReactFlowState } from '../types'; const edgesSelector = (state: ReactFlowState) => state.edges; diff --git a/packages/core/src/hooks/useGlobalKeyHandler.ts b/packages/core/src/hooks/useGlobalKeyHandler.ts index 208d893b..742c9cee 100644 --- a/packages/core/src/hooks/useGlobalKeyHandler.ts +++ b/packages/core/src/hooks/useGlobalKeyHandler.ts @@ -1,6 +1,6 @@ import { useEffect } from 'react'; -import { useStoreApi } from '../store'; +import { useStoreApi } from '../hooks/useStore'; import useKeyPress from './useKeyPress'; import { getConnectedEdges } from '../utils/graph'; import { KeyCode, NodeChange, Node } from '../types'; diff --git a/packages/core/src/hooks/useNodes.ts b/packages/core/src/hooks/useNodes.ts index 8a728a2d..684becea 100644 --- a/packages/core/src/hooks/useNodes.ts +++ b/packages/core/src/hooks/useNodes.ts @@ -1,4 +1,4 @@ -import { useStore } from '../store'; +import { useStore } from '../hooks/useStore'; import { Node, ReactFlowState } from '../types'; const nodesSelector = (state: ReactFlowState) => Array.from(state.nodeInternals.values()); diff --git a/packages/core/src/hooks/useReactFlow.ts b/packages/core/src/hooks/useReactFlow.ts index 69d25cb9..0925c7ce 100644 --- a/packages/core/src/hooks/useReactFlow.ts +++ b/packages/core/src/hooks/useReactFlow.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react'; import useViewportHelper from './useViewportHelper'; -import { useStoreApi } from '../store'; +import { useStoreApi } from '../hooks/useStore'; import { ReactFlowInstance, Instance, diff --git a/packages/core/src/hooks/useResizeHandler.ts b/packages/core/src/hooks/useResizeHandler.ts index 6ce1848b..7d148db9 100644 --- a/packages/core/src/hooks/useResizeHandler.ts +++ b/packages/core/src/hooks/useResizeHandler.ts @@ -1,6 +1,6 @@ import { useEffect, MutableRefObject } from 'react'; -import { useStoreApi } from '../store'; +import { useStoreApi } from '../hooks/useStore'; import { getDimensions } from '../utils'; function useResizeHandler(rendererNode: MutableRefObject): void { diff --git a/packages/core/src/hooks/useStore.ts b/packages/core/src/hooks/useStore.ts new file mode 100644 index 00000000..87ae9304 --- /dev/null +++ b/packages/core/src/hooks/useStore.ts @@ -0,0 +1,42 @@ +import { useContext, useMemo } from 'react'; +import { StoreApi, useStore as useZustandStore } from 'zustand'; + +import StoreContext from '../contexts/RFStoreContext'; +import { ReactFlowState } from '../types'; + +const errorMessage = 'Seems like you have not used zustand provider as an ancestor.'; + +type ExtractState = StoreApi extends { getState: () => infer T } ? T : never; + +function useStore( + selector: (state: ExtractState) => StateSlice, + equalityFn?: (a: StateSlice, b: StateSlice) => boolean +) { + const store = useContext(StoreContext); + + if (store === null) { + throw new Error(errorMessage); + } + + return useZustandStore(store, selector, equalityFn); +} + +const useStoreApi = () => { + const store = useContext(StoreContext); + + if (store === null) { + throw new Error(errorMessage); + } + + return useMemo( + () => ({ + getState: store.getState, + setState: store.setState, + subscribe: store.subscribe, + destroy: store.destroy, + }), + [store] + ); +}; + +export { useStore, useStoreApi }; diff --git a/packages/core/src/hooks/useUpdateNodeInternals.ts b/packages/core/src/hooks/useUpdateNodeInternals.ts index 71861036..8165eb77 100644 --- a/packages/core/src/hooks/useUpdateNodeInternals.ts +++ b/packages/core/src/hooks/useUpdateNodeInternals.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react'; -import { useStore, useStoreApi } from '../store'; +import { useStore, useStoreApi } from '../hooks/useStore'; import { UpdateNodeInternals, ReactFlowState } from '../types'; const selector = (state: ReactFlowState) => state.updateNodeDimensions; diff --git a/packages/core/src/hooks/useUpdateNodePositions.ts b/packages/core/src/hooks/useUpdateNodePositions.ts index 4bc7c0aa..a77d50a0 100644 --- a/packages/core/src/hooks/useUpdateNodePositions.ts +++ b/packages/core/src/hooks/useUpdateNodePositions.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react'; -import { useStoreApi } from '../store'; +import { useStoreApi } from '../hooks/useStore'; import { calcNextPosition } from './useDrag/utils'; import { XYPosition } from '../types'; diff --git a/packages/core/src/hooks/useViewport.ts b/packages/core/src/hooks/useViewport.ts index f4e61587..025040bd 100644 --- a/packages/core/src/hooks/useViewport.ts +++ b/packages/core/src/hooks/useViewport.ts @@ -1,6 +1,6 @@ import shallow from 'zustand/shallow'; -import { useStore } from '../store'; +import { useStore } from '../hooks/useStore'; import { Viewport, ReactFlowState } from '../types'; const viewportSelector = (state: ReactFlowState) => ({ diff --git a/packages/core/src/hooks/useViewportHelper.ts b/packages/core/src/hooks/useViewportHelper.ts index 10e21193..e1fc08a3 100644 --- a/packages/core/src/hooks/useViewportHelper.ts +++ b/packages/core/src/hooks/useViewportHelper.ts @@ -2,7 +2,7 @@ import { useMemo } from 'react'; import { zoomIdentity } from 'd3-zoom'; import shallow from 'zustand/shallow'; -import { useStoreApi, useStore } from '../store'; +import { useStoreApi, useStore } from '../hooks/useStore'; import { pointToRendererPoint, getTransformForBounds, getD3Transition } from '../utils/graph'; import { FitViewOptions, Viewport, ViewportHelperFunctions, ReactFlowState, Rect, XYPosition } from '../types'; import { fitView as fitViewStore } from '../store/utils'; diff --git a/packages/core/src/hooks/useVisibleEdges.ts b/packages/core/src/hooks/useVisibleEdges.ts index f7b8534a..4f061a4b 100644 --- a/packages/core/src/hooks/useVisibleEdges.ts +++ b/packages/core/src/hooks/useVisibleEdges.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react'; -import { useStore } from '../store'; +import { useStore } from '../hooks/useStore'; import { isEdgeVisible } from '../container/EdgeRenderer/utils'; import { ReactFlowState, NodeInternals, Edge } from '../types'; import { internalsSymbol, isNumeric } from '../utils'; diff --git a/packages/core/src/hooks/useVisibleNodes.ts b/packages/core/src/hooks/useVisibleNodes.ts index 8c8b7190..ad81e3be 100644 --- a/packages/core/src/hooks/useVisibleNodes.ts +++ b/packages/core/src/hooks/useVisibleNodes.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react'; -import { useStore } from '../store'; +import { useStore } from '../hooks/useStore'; import { getNodesInside } from '../utils/graph'; import { ReactFlowState } from '../types'; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3e4dc8c2..0edee1cc 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -39,6 +39,6 @@ export { default as useEdges } from './hooks/useEdges'; export { default as useViewport } from './hooks/useViewport'; export { default as useKeyPress } from './hooks/useKeyPress'; export * from './hooks/useNodesEdgesState'; -export { useStore, useStoreApi } from './store'; +export { useStore, useStoreApi } from './hooks/useStore'; export * from './types'; diff --git a/packages/core/src/store/index.ts b/packages/core/src/store/index.ts index 5a54116e..ed83e72b 100644 --- a/packages/core/src/store/index.ts +++ b/packages/core/src/store/index.ts @@ -1,5 +1,4 @@ -import create from 'zustand'; -import createContext from 'zustand/context'; +import { createStore } from 'zustand'; import { clampPosition, getDimensions, internalsSymbol } from '../utils'; import { applyNodeChanges } from '../utils/changes'; @@ -21,10 +20,8 @@ import { createSelectionChange, getSelectionChanges } from '../utils/changes'; import { createNodeInternals, fitView, updateNodesAndEdgesSelections } from './utils'; import initialState from './initialState'; -const { Provider, useStore, useStoreApi } = createContext(); - -const createStore = () => - create((set, get) => ({ +const createRFStore = () => + createStore((set, get) => ({ ...initialState, setNodes: (nodes: Node[]) => { set({ nodeInternals: createNodeInternals(nodes, get().nodeInternals) }); @@ -236,4 +233,4 @@ const createStore = () => reset: () => set({ ...initialState }), })); -export { Provider, useStore, createStore, useStoreApi }; +export { createRFStore }; diff --git a/packages/minimap/package.json b/packages/minimap/package.json index 8d474845..e6f0803f 100644 --- a/packages/minimap/package.json +++ b/packages/minimap/package.json @@ -9,7 +9,7 @@ "@react-flow/core": "^11.0.0", "@react-flow/css-utils": "^11.0.0", "classcat": "^5.0.3", - "zustand": "^3.7.2" + "zustand": "^4.0.0" }, "peerDependencies": { "react": "^18.1.0", diff --git a/yarn.lock b/yarn.lock index c479a6d5..e97c7f3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1938,7 +1938,7 @@ __metadata: postcss-cli: ^10.0.0 postcss-import: ^14.1.0 postcss-nested: ^5.0.6 - zustand: ^3.7.2 + zustand: ^4.0.0 peerDependencies: react: ">=18" react-dom: ">=18" @@ -1958,7 +1958,7 @@ __metadata: "@react-flow/core": ^11.0.0 "@react-flow/css-utils": ^11.0.0 classcat: ^5.0.3 - zustand: ^3.7.2 + zustand: ^4.0.0 peerDependencies: react: ^18.1.0 react-dom: ">=18" @@ -8216,6 +8216,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 5c639e0f8da3521d605f59ce5be9e094ca772bd44a4ce7322b055a6f58eeed8dda3c94cabd90c7a41fb6fa852210092008afe48f7038792fd47501f33299116a + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -8414,14 +8423,19 @@ __metadata: languageName: node linkType: hard -"zustand@npm:^3.7.2": - version: 3.7.2 - resolution: "zustand@npm:3.7.2" +"zustand@npm:^4.0.0": + version: 4.0.0 + resolution: "zustand@npm:4.0.0" + dependencies: + use-sync-external-store: 1.2.0 peerDependencies: + immer: ">=9.0" react: ">=16.8" peerDependenciesMeta: + immer: + optional: true react: optional: true - checksum: 18f025b1b666a311121d3855303ff58e6a21fd107920ca474307e86984c13338d6c4cfa5cdf13382a9e0f76821f2554a12d4d200a98a66b58637e729f149797b + checksum: b8ae5971dff79a1007d46f9a6bfa39ed5cc5b101a877eeec069ebdb6c8285ec8e3463e40cfa7c0f1507a41f43fe26ffb44b556063cb70ac03bccf1ea6e0f69d6 languageName: node linkType: hard