|
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, |
|
} |
|
} |
|
|