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