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