From 596ddd21bc03d0b89e36a03608b08b3150a23944 Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 30 Aug 2022 22:00:55 +0200 Subject: [PATCH 1/2] feat(hooks): add useNodesInitialized --- packages/core/src/hooks/useNodesInitialized.ts | 12 ++++++++++++ packages/core/src/index.ts | 2 ++ 2 files changed, 14 insertions(+) create mode 100644 packages/core/src/hooks/useNodesInitialized.ts diff --git a/packages/core/src/hooks/useNodesInitialized.ts b/packages/core/src/hooks/useNodesInitialized.ts new file mode 100644 index 00000000..3612253d --- /dev/null +++ b/packages/core/src/hooks/useNodesInitialized.ts @@ -0,0 +1,12 @@ +import { ReactFlowState } from '../types'; +import { useStore } from './useStore'; + +const selector = (s: ReactFlowState) => Array.from(s.nodeInternals.values()).every((n) => n.width && n.height); + +function useNodesInitialized(): boolean { + const initialized = useStore(selector); + + return initialized; +} + +export default useNodesInitialized; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 0f2ce6a6..4777566e 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -41,5 +41,7 @@ export { default as useKeyPress } from './hooks/useKeyPress'; export * from './hooks/useNodesEdgesState'; export { useStore, useStoreApi } from './hooks/useStore'; export { default as useOnViewportChange } from './hooks/useOnViewportChange'; +export { default as useOnSelectionChange } from './hooks/useOnSelectionChange'; +export { default as useNodesInitialized } from './hooks/useNodesInitialized'; export * from './types'; From f40788ba4b520ac77efd82282246e1634c4b1ede Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 30 Aug 2022 22:15:14 +0200 Subject: [PATCH 2/2] refactor(useNodesInit): check for handleBounds, false for no nodes --- packages/core/src/hooks/useNodesInitialized.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/core/src/hooks/useNodesInitialized.ts b/packages/core/src/hooks/useNodesInitialized.ts index 3612253d..1f2b1f56 100644 --- a/packages/core/src/hooks/useNodesInitialized.ts +++ b/packages/core/src/hooks/useNodesInitialized.ts @@ -1,7 +1,14 @@ import { ReactFlowState } from '../types'; +import { internalsSymbol } from '../utils'; import { useStore } from './useStore'; -const selector = (s: ReactFlowState) => Array.from(s.nodeInternals.values()).every((n) => n.width && n.height); +const selector = (s: ReactFlowState) => { + if (s.nodeInternals.size === 0) { + return false; + } + + return Array.from(s.nodeInternals.values()).every((n) => n[internalsSymbol]?.handleBounds !== undefined); +}; function useNodesInitialized(): boolean { const initialized = useStore(selector);