| import { useCallback } from 'react' |
| import produce from 'immer' |
| import { useStoreApi } from 'reactflow' |
| import { useNodesSyncDraft } from './use-nodes-sync-draft' |
| import { useNodesReadOnly } from './use-workflow' |
|
|
| type NodeDataUpdatePayload = { |
| id: string |
| data: Record<string, any> |
| } |
|
|
| export const useNodeDataUpdate = () => { |
| const store = useStoreApi() |
| const { handleSyncWorkflowDraft } = useNodesSyncDraft() |
| const { getNodesReadOnly } = useNodesReadOnly() |
|
|
| const handleNodeDataUpdate = useCallback(({ id, data }: NodeDataUpdatePayload) => { |
| const { |
| getNodes, |
| setNodes, |
| } = store.getState() |
| const newNodes = produce(getNodes(), (draft) => { |
| const currentNode = draft.find(node => node.id === id)! |
|
|
| if (currentNode) |
| currentNode.data = { ...currentNode.data, ...data } |
| }) |
| setNodes(newNodes) |
| }, [store]) |
|
|
| const handleNodeDataUpdateWithSyncDraft = useCallback((payload: NodeDataUpdatePayload) => { |
| if (getNodesReadOnly()) |
| return |
|
|
| handleNodeDataUpdate(payload) |
| handleSyncWorkflowDraft() |
| }, [handleSyncWorkflowDraft, handleNodeDataUpdate, getNodesReadOnly]) |
|
|
| return { |
| handleNodeDataUpdate, |
| handleNodeDataUpdateWithSyncDraft, |
| } |
| } |
|
|