diff --git a/examples/svelte/src/components/Header/Header.svelte b/examples/svelte/src/components/Header/Header.svelte index 089aea87..6fa79b68 100644 --- a/examples/svelte/src/components/Header/Header.svelte +++ b/examples/svelte/src/components/Header/Header.svelte @@ -1,46 +1,47 @@
- - + +
diff --git a/examples/svelte/src/routes/useupdatenodeinternals/+page.svelte b/examples/svelte/src/routes/useupdatenodeinternals/+page.svelte new file mode 100644 index 00000000..12dec33c --- /dev/null +++ b/examples/svelte/src/routes/useupdatenodeinternals/+page.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/examples/svelte/src/routes/useupdatenodeinternals/CustomNode.svelte b/examples/svelte/src/routes/useupdatenodeinternals/CustomNode.svelte new file mode 100644 index 00000000..f4d306ac --- /dev/null +++ b/examples/svelte/src/routes/useupdatenodeinternals/CustomNode.svelte @@ -0,0 +1,29 @@ + + + + + +{#each Array.from({ length: handleCount }) as handle, i} + +{/each} diff --git a/examples/svelte/src/routes/useupdatenodeinternals/Flow.svelte b/examples/svelte/src/routes/useupdatenodeinternals/Flow.svelte new file mode 100644 index 00000000..13b48cb3 --- /dev/null +++ b/examples/svelte/src/routes/useupdatenodeinternals/Flow.svelte @@ -0,0 +1,68 @@ + + +
+ + + + + +
+ + diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 36957c68..3b04d4a1 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@xyflow/svelte", - "version": "0.0.18", + "version": "0.0.19", "description": "Svelte Flow - A highly customizable Svelte library for building node-based editors, workflow systems, diagrams and more.", "keywords": [ "svelte", diff --git a/packages/svelte/src/lib/hooks/useSvelteFlow.ts b/packages/svelte/src/lib/hooks/useSvelteFlow.ts index a0dc8cb8..d4a40ac3 100644 --- a/packages/svelte/src/lib/hooks/useSvelteFlow.ts +++ b/packages/svelte/src/lib/hooks/useSvelteFlow.ts @@ -27,7 +27,6 @@ export function useSvelteFlow(): { nodes: SvelteFlowStore['nodes']; edges: SvelteFlowStore['edges']; } { - // how to get the new context here? fit view doesn't work, because the store is not updated (uses old nodes store) const { zoomIn, zoomOut, diff --git a/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts b/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts new file mode 100644 index 00000000..9de90763 --- /dev/null +++ b/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts @@ -0,0 +1,28 @@ +import { get } from 'svelte/store'; +import type { UpdateNodeInternals, NodeDimensionUpdate } from '@xyflow/system'; + +import { useStore } from '$lib/store'; + +export function useUpdateNodeInternals(): UpdateNodeInternals { + const { domNode, updateNodeDimensions } = useStore(); + + // @todo: do we want to add this to system? + const updateInternals = (id: string | string[]) => { + const updateIds = Array.isArray(id) ? id : [id]; + const updates = updateIds.reduce((res, updateId) => { + const nodeElement = get(domNode)?.querySelector( + `.svelte-flow__node[data-id="${updateId}"]` + ) as HTMLDivElement; + + if (nodeElement) { + res.push({ id: updateId, nodeElement, forceUpdate: true }); + } + + return res; + }, []); + + requestAnimationFrame(() => updateNodeDimensions(updates)); + }; + + return updateInternals; +} diff --git a/packages/svelte/src/lib/index.ts b/packages/svelte/src/lib/index.ts index b3048f18..66b1af10 100644 --- a/packages/svelte/src/lib/index.ts +++ b/packages/svelte/src/lib/index.ts @@ -20,6 +20,7 @@ export { useStore } from '$lib/store'; // utils export * from '$lib/utils'; export * from '$lib/hooks/useSvelteFlow'; +export * from '$lib/hooks/useUpdateNodeInternals'; // types export type { Edge, EdgeProps, EdgeTypes, DefaultEdgeOptions } from '$lib/types/edges';