refactor(hooks): rename useUpdateNodeData to useSetNodeData and adjust api

This commit is contained in:
moklick
2023-12-12 13:51:58 +01:00
parent 6cf8589ea8
commit 75979922ea
11 changed files with 72 additions and 50 deletions
@@ -1,10 +1,10 @@
import { memo, ChangeEventHandler } from 'react'; import { memo, ChangeEventHandler } from 'react';
import { Position, NodeProps, useUpdateNodeData, Handle } from '@xyflow/react'; import { Position, NodeProps, useSetNodeData, Handle } from '@xyflow/react';
function TextNode({ id, data }: NodeProps) { function TextNode({ id, data }: NodeProps) {
const updateNodeData = useUpdateNodeData(); const setNodeData = useSetNodeData();
const onChange: ChangeEventHandler<HTMLInputElement> = (evt) => updateNodeData(id, { text: evt.target.value }); const onChange: ChangeEventHandler<HTMLInputElement> = (evt) => setNodeData(id, { text: evt.target.value });
return ( return (
<div style={{ background: '#eee', color: '#222', padding: 10, fontSize: 12, borderRadius: 10 }}> <div style={{ background: '#eee', color: '#222', padding: 10, fontSize: 12, borderRadius: 10 }}>
@@ -1,15 +1,15 @@
import { memo, useEffect } from 'react'; import { memo, useEffect } from 'react';
import { Position, NodeProps, useUpdateNodeData, Handle, useHandleConnections, useNodesData } from '@xyflow/react'; import { Position, NodeProps, useSetNodeData, Handle, useHandleConnections, useNodesData } from '@xyflow/react';
function UppercaseNode({ id }: NodeProps) { function UppercaseNode({ id }: NodeProps) {
const connections = useHandleConnections({ const connections = useHandleConnections({
type: 'target', type: 'target',
}); });
const nodeData = useNodesData(connections[0]?.source); const nodeData = useNodesData(connections[0]?.source);
const updateNodeData = useUpdateNodeData(); const setNodeData = useSetNodeData();
useEffect(() => { useEffect(() => {
updateNodeData(id, { text: nodeData?.text.toUpperCase() }); setNodeData(id, { text: nodeData?.text.toUpperCase() });
}, [nodeData]); }, [nodeData]);
return ( return (
@@ -4,7 +4,6 @@
Position, Position,
useHandleConnections, useHandleConnections,
useNodesData, useNodesData,
useUpdateNodeData,
type NodeProps type NodeProps
} from '@xyflow/svelte'; } from '@xyflow/svelte';
@@ -1,12 +1,12 @@
<script lang="ts"> <script lang="ts">
import { Handle, Position, type NodeProps, useUpdateNodeData } from '@xyflow/svelte'; import { Handle, Position, type NodeProps, useSetNodeData } from '@xyflow/svelte';
type $$Props = NodeProps; type $$Props = NodeProps;
export let id: $$Props['id']; export let id: $$Props['id'];
export let data: $$Props['data']; export let data: $$Props['data'];
const updateNodeData = useUpdateNodeData(); const setNodeData = useSetNodeData();
</script> </script>
<div class="custom"> <div class="custom">
@@ -14,7 +14,7 @@
<div> <div>
<input <input
value={data.text} value={data.text}
on:input={(evt) => updateNodeData(id, { text: evt.currentTarget.value })} on:input={(evt) => setNodeData(id, { text: evt.currentTarget.value })}
/> />
</div> </div>
<Handle type="source" position={Position.Right} /> <Handle type="source" position={Position.Right} />
@@ -5,14 +5,14 @@
type NodeProps, type NodeProps,
useHandleConnections, useHandleConnections,
useNodesData, useNodesData,
useUpdateNodeData useSetNodeData
} from '@xyflow/svelte'; } from '@xyflow/svelte';
type $$Props = NodeProps; type $$Props = NodeProps;
export let id: $$Props['id']; export let id: $$Props['id'];
const updateNodeData = useUpdateNodeData(); const setNodeData = useSetNodeData();
const connections = useHandleConnections({ const connections = useHandleConnections({
nodeId: id, nodeId: id,
type: 'target' type: 'target'
@@ -21,7 +21,7 @@
$: nodeData = useNodesData($connections[0]?.source); $: nodeData = useNodesData($connections[0]?.source);
$: { $: {
updateNodeData(id, { text: $nodeData?.text?.toUpperCase() || '' }); setNodeData(id, { text: $nodeData?.text?.toUpperCase() || '' });
} }
</script> </script>
@@ -0,0 +1,30 @@
import { useCallback } from 'react';
import useReactFlow from './useReactFlow';
import { Node } from '../types';
export function useSetNodeData<NodeType extends Node = Node>() {
const { setNodes } = useReactFlow();
const setNodeData = useCallback(
function setNodesData(
id: string,
dataUpdate: object | ((node: NodeType) => object),
options: { replace: boolean } = { replace: true }
) {
setNodes((prevNodes) =>
prevNodes.map((node) => {
if (node.id === id) {
const nextData = typeof dataUpdate === 'function' ? dataUpdate(node as NodeType) : dataUpdate;
return options.replace ? { ...node, data: nextData } : { ...node, data: { ...node.data, ...nextData } };
}
return node;
})
);
},
[setNodes]
);
return setNodeData;
}
@@ -1,13 +0,0 @@
import { useCallback } from 'react';
import useReactFlow from './useReactFlow';
export function useUpdateNodeData() {
const { setNodes } = useReactFlow();
const updateNodeData = useCallback((id: string, data: unknown) => {
setNodes((prevNodes) => prevNodes.map((node) => (node.id === id ? { ...node, data } : node)));
}, []);
return updateNodeData;
}
+1 -1
View File
@@ -23,7 +23,7 @@ export { default as useOnViewportChange, type UseOnViewportChangeOptions } from
export { default as useOnSelectionChange, type UseOnSelectionChangeOptions } from './hooks/useOnSelectionChange'; export { default as useOnSelectionChange, type UseOnSelectionChangeOptions } from './hooks/useOnSelectionChange';
export { default as useNodesInitialized, type UseNodesInitializedOptions } from './hooks/useNodesInitialized'; export { default as useNodesInitialized, type UseNodesInitializedOptions } from './hooks/useNodesInitialized';
export { useHandleConnections } from './hooks/useHandleConnections'; export { useHandleConnections } from './hooks/useHandleConnections';
export { useUpdateNodeData } from './hooks/useUpdateNodeData'; export { useSetNodeData } from './hooks/useSetNodeData';
export { useNodesData } from './hooks/useNodesData'; export { useNodesData } from './hooks/useNodesData';
export { useNodeId } from './contexts/NodeIdContext'; export { useNodeId } from './contexts/NodeIdContext';
@@ -0,0 +1,28 @@
import { useStore } from '$lib/store';
import type { Node } from '$lib/types';
export function useSetNodeData<NodeType extends Node = Node>() {
const { nodes } = useStore();
const setNodeData = (
id: string,
dataUpdate: object | ((node: NodeType) => object),
options: { replace: boolean } = { replace: true }
) => {
nodes.update((nds) =>
nds.map((node) => {
if (node.id === id) {
const nextData =
typeof dataUpdate === 'function' ? dataUpdate(node as NodeType) : dataUpdate;
return options.replace
? { ...node, data: nextData }
: { ...node, data: { ...node.data, ...nextData } };
}
return node;
})
);
};
return setNodeData;
}
@@ -1,22 +0,0 @@
import { useStore } from '$lib/store';
export function useUpdateNodeData(): (id: string, data: unknown) => void {
const { nodes } = useStore();
const updateNodeData = (id: string, data: unknown) => {
nodes.update((nds) =>
nds.map((node) => {
if (node.id === id) {
return {
...node,
data
};
}
return node;
})
);
};
return updateNodeData;
}
+1 -1
View File
@@ -29,7 +29,7 @@ export * from '$lib/hooks/useConnection';
export * from '$lib/hooks/useNodesEdges'; export * from '$lib/hooks/useNodesEdges';
export * from '$lib/hooks/useHandleConnections'; export * from '$lib/hooks/useHandleConnections';
export * from '$lib/hooks/useNodesData'; export * from '$lib/hooks/useNodesData';
export * from '$lib/hooks/useUpdateNodeData'; export * from '$lib/hooks/useSetNodeData';
// types // types
export type { export type {