feat(elementUpdater): apply position and style changes #220

This commit is contained in:
moklick
2020-05-14 10:56:50 +02:00
parent 1cc4e2676d
commit 267187b8d1
+29 -15
View File
@@ -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;