feat(elementUpdater): apply position and style changes #220
This commit is contained in:
@@ -6,7 +6,7 @@ import { parseElement, isNode, isEdge } from '../utils/graph';
|
|||||||
import { Elements, Node, Edge } from '../types';
|
import { Elements, Node, Edge } from '../types';
|
||||||
|
|
||||||
const useElementUpdater = (elements: Elements): void => {
|
const useElementUpdater = (elements: Elements): void => {
|
||||||
const state = useStoreState(s => ({
|
const state = useStoreState((s) => ({
|
||||||
nodes: s.nodes,
|
nodes: s.nodes,
|
||||||
edges: s.edges,
|
edges: s.edges,
|
||||||
transform: s.transform,
|
transform: s.transform,
|
||||||
@@ -14,37 +14,51 @@ const useElementUpdater = (elements: Elements): void => {
|
|||||||
snapGrid: s.snapGrid,
|
snapGrid: s.snapGrid,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const setNodes = useStoreActions(a => a.setNodes);
|
const setNodes = useStoreActions((a) => a.setNodes);
|
||||||
const setEdges = useStoreActions(a => a.setEdges);
|
const setEdges = useStoreActions((a) => a.setEdges);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const nodes = elements.filter(isNode) as Node[];
|
const nodes = elements.filter(isNode) as Node[];
|
||||||
const edges = elements
|
const edges = elements
|
||||||
.filter(isEdge)
|
.filter(isEdge)
|
||||||
.map(e =>
|
.map((e) => parseElement(e, state.transform, state.snapToGrid, state.snapGrid)) as Edge[];
|
||||||
parseElement(e, state.transform, state.snapToGrid, state.snapGrid)
|
|
||||||
) as Edge[];
|
|
||||||
|
|
||||||
const nextNodes = nodes.map(propNode => {
|
const nextNodes = nodes.map((propNode) => {
|
||||||
const existingNode = state.nodes.find(n => n.id === propNode.id);
|
const existingNode = state.nodes.find((n) => n.id === propNode.id);
|
||||||
|
|
||||||
if (existingNode) {
|
if (existingNode) {
|
||||||
const data = !isEqual(existingNode.data, propNode.data)
|
const data = !isEqual(existingNode.data, propNode.data)
|
||||||
? { ...existingNode.data, ...propNode.data }
|
? { ...existingNode.data, ...propNode.data }
|
||||||
: existingNode.data;
|
: existingNode.data;
|
||||||
|
|
||||||
|
const style = !isEqual(existingNode.style, propNode.style)
|
||||||
|
? { ...existingNode.style, ...propNode.style }
|
||||||
|
: existingNode.style;
|
||||||
|
|
||||||
|
const positionChanged =
|
||||||
|
existingNode.position.x !== propNode.position.x || existingNode.position.y !== propNode.position.y;
|
||||||
|
|
||||||
|
if (positionChanged) {
|
||||||
|
return {
|
||||||
|
...existingNode,
|
||||||
|
__rg: {
|
||||||
|
...existingNode.__rg,
|
||||||
|
position: propNode.position,
|
||||||
|
},
|
||||||
|
position: propNode.position,
|
||||||
|
data,
|
||||||
|
style,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...existingNode,
|
...existingNode,
|
||||||
data,
|
data,
|
||||||
|
style,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return parseElement(
|
return parseElement(propNode, state.transform, state.snapToGrid, state.snapGrid);
|
||||||
propNode,
|
|
||||||
state.transform,
|
|
||||||
state.snapToGrid,
|
|
||||||
state.snapGrid
|
|
||||||
);
|
|
||||||
}) as Node[];
|
}) as Node[];
|
||||||
|
|
||||||
const nodesChanged: boolean = !isEqual(state.nodes, nextNodes);
|
const nodesChanged: boolean = !isEqual(state.nodes, nextNodes);
|
||||||
@@ -57,7 +71,7 @@ const useElementUpdater = (elements: Elements): void => {
|
|||||||
if (edgesChanged) {
|
if (edgesChanged) {
|
||||||
setEdges(edges);
|
setEdges(edges);
|
||||||
}
|
}
|
||||||
});
|
}, [elements, state.nodes, state.edges]);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default useElementUpdater;
|
export default useElementUpdater;
|
||||||
|
|||||||
Reference in New Issue
Block a user