mirror of
https://github.com/langgenius/dify.git
synced 2026-04-25 01:26:57 +08:00
add setNodes and setEdges of collaboration store
This commit is contained in:
parent
965b65db6e
commit
af6df05685
@ -1471,11 +1471,10 @@ export const useNodesInteractions = () => {
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
getNodes,
|
getNodes,
|
||||||
setNodes,
|
|
||||||
edges,
|
edges,
|
||||||
setEdges,
|
|
||||||
} = store.getState()
|
} = store.getState()
|
||||||
const nodes = getNodes()
|
const nodes = getNodes()
|
||||||
|
const { setNodes, setEdges } = useCollaborationStore.getState()
|
||||||
const currentNode = nodes.find(node => node.id === nodeId)!
|
const currentNode = nodes.find(node => node.id === nodeId)!
|
||||||
const connectedEdges = getConnectedEdges([currentNode], edges)
|
const connectedEdges = getConnectedEdges([currentNode], edges)
|
||||||
const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
|
const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
|
||||||
@ -1497,18 +1496,6 @@ export const useNodesInteractions = () => {
|
|||||||
return draft.filter(edge => !connectedEdges.find(connectedEdge => connectedEdge.id === edge.id))
|
return draft.filter(edge => !connectedEdges.find(connectedEdge => connectedEdge.id === edge.id))
|
||||||
})
|
})
|
||||||
setEdges(newEdges)
|
setEdges(newEdges)
|
||||||
|
|
||||||
const { nodesMap, edgesMap, loroDoc } = useCollaborationStore.getState()
|
|
||||||
if (nodesMap && edgesMap && loroDoc) {
|
|
||||||
// newNodes.forEach((node) => {
|
|
||||||
// nodesMap.set(node.id, node)
|
|
||||||
// })
|
|
||||||
connectedEdges.forEach((edge) => {
|
|
||||||
edgesMap.delete(edge.id)
|
|
||||||
})
|
|
||||||
loroDoc.commit()
|
|
||||||
}
|
|
||||||
|
|
||||||
handleSyncWorkflowDraft()
|
handleSyncWorkflowDraft()
|
||||||
saveStateToHistory(WorkflowHistoryEvent.EdgeDelete)
|
saveStateToHistory(WorkflowHistoryEvent.EdgeDelete)
|
||||||
}, [store, getNodesReadOnly, handleSyncWorkflowDraft, saveStateToHistory])
|
}, [store, getNodesReadOnly, handleSyncWorkflowDraft, saveStateToHistory])
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { create } from 'zustand'
|
import { create } from 'zustand'
|
||||||
|
|
||||||
import { LoroDoc } from 'loro-crdt'
|
import { LoroDoc } from 'loro-crdt'
|
||||||
|
import { isEqual } from 'lodash-es'
|
||||||
import type { Edge, Node } from '../types'
|
import type { Edge, Node } from '../types'
|
||||||
import { useWebSocketStore } from './websocket-store'
|
import { useWebSocketStore } from './websocket-store'
|
||||||
|
|
||||||
@ -48,6 +49,9 @@ type CollaborationStore = {
|
|||||||
edges: Edge[]
|
edges: Edge[]
|
||||||
updateNodes?: () => void
|
updateNodes?: () => void
|
||||||
updateEdges?: () => void
|
updateEdges?: () => void
|
||||||
|
|
||||||
|
setNodes: (newNodes: Node[]) => void
|
||||||
|
setEdges: (newEdges: Edge[]) => void
|
||||||
initCollaboration: (appId: string) => void
|
initCollaboration: (appId: string) => void
|
||||||
destroyCollaboration: () => void
|
destroyCollaboration: () => void
|
||||||
}
|
}
|
||||||
@ -60,6 +64,78 @@ export const useCollaborationStore = create<CollaborationStore>((set, get) => ({
|
|||||||
nodes: [],
|
nodes: [],
|
||||||
edges: [],
|
edges: [],
|
||||||
|
|
||||||
|
setNodes: (newNodes: Node[]) => {
|
||||||
|
const { nodes: oldNodes, nodesMap, loroDoc } = get()
|
||||||
|
|
||||||
|
const oldNodesMap = new Map(oldNodes.map(node => [node.id, node]))
|
||||||
|
const newNodesMap = new Map(newNodes.map(node => [node.id, node]))
|
||||||
|
|
||||||
|
const getPersistentNodeData = (node: Node) => {
|
||||||
|
const { data, ...rest } = node
|
||||||
|
const filteredData = Object.fromEntries(
|
||||||
|
Object.entries(data).filter(([key]) =>
|
||||||
|
!key.startsWith('_') && key !== 'selected',
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
...rest,
|
||||||
|
data: filteredData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete
|
||||||
|
oldNodes.forEach((oldNode) => {
|
||||||
|
if (!newNodesMap.has(oldNode.id))
|
||||||
|
nodesMap.delete(oldNode.id)
|
||||||
|
})
|
||||||
|
|
||||||
|
newNodes.forEach((newNode) => {
|
||||||
|
const oldNode = oldNodesMap.get(newNode.id)
|
||||||
|
if (!oldNode) {
|
||||||
|
// add
|
||||||
|
nodesMap.set(newNode.id, getPersistentNodeData(newNode))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const oldPersistentData = getPersistentNodeData(oldNode)
|
||||||
|
const newPersistentData = getPersistentNodeData(newNode)
|
||||||
|
|
||||||
|
if (!isEqual(oldPersistentData, newPersistentData)) {
|
||||||
|
// update
|
||||||
|
nodesMap.set(newNode.id, newPersistentData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
loroDoc.commit()
|
||||||
|
},
|
||||||
|
|
||||||
|
setEdges: (newEdges: Edge[]) => {
|
||||||
|
const { edges: oldEdges, edgesMap, loroDoc } = get()
|
||||||
|
|
||||||
|
const oldEdgesMap = new Map(oldEdges.map(edge => [edge.id, edge]))
|
||||||
|
const newEdgesMap = new Map(newEdges.map(edge => [edge.id, edge]))
|
||||||
|
|
||||||
|
// delete
|
||||||
|
oldEdges.forEach((oldEdge) => {
|
||||||
|
if (!newEdgesMap.has(oldEdge.id))
|
||||||
|
edgesMap.delete(oldEdge.id)
|
||||||
|
})
|
||||||
|
|
||||||
|
newEdges.forEach((newEdge) => {
|
||||||
|
const oldEdge = oldEdgesMap.get(newEdge.id)
|
||||||
|
if (!oldEdge) {
|
||||||
|
// add
|
||||||
|
edgesMap.set(newEdge.id, newEdge)
|
||||||
|
}
|
||||||
|
else if (!isEqual(oldEdge, newEdge)) {
|
||||||
|
// update
|
||||||
|
edgesMap.set(newEdge.id, newEdge)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
loroDoc.commit()
|
||||||
|
},
|
||||||
|
|
||||||
initCollaboration: (appId: string) => {
|
initCollaboration: (appId: string) => {
|
||||||
const { getSocket } = useWebSocketStore.getState()
|
const { getSocket } = useWebSocketStore.getState()
|
||||||
const socket = getSocket(appId)
|
const socket = getSocket(appId)
|
||||||
|
|||||||
@ -28,7 +28,7 @@ export const createWorkflowDraftSlice: StateCreator<WorkflowDraftSliceShape> = s
|
|||||||
setBackupDraft: backupDraft => set(() => ({ backupDraft })),
|
setBackupDraft: backupDraft => set(() => ({ backupDraft })),
|
||||||
debouncedSyncWorkflowDraft: debounce((syncWorkflowDraft) => {
|
debouncedSyncWorkflowDraft: debounce((syncWorkflowDraft) => {
|
||||||
syncWorkflowDraft()
|
syncWorkflowDraft()
|
||||||
}, 5000),
|
}, 500000),
|
||||||
syncWorkflowDraftHash: '',
|
syncWorkflowDraftHash: '',
|
||||||
setSyncWorkflowDraftHash: syncWorkflowDraftHash => set(() => ({ syncWorkflowDraftHash })),
|
setSyncWorkflowDraftHash: syncWorkflowDraftHash => set(() => ({ syncWorkflowDraftHash })),
|
||||||
isSyncingWorkflowDraft: false,
|
isSyncingWorkflowDraft: false,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user