skip element mutation on noop updates (#1667)

This commit is contained in:
David Luzar 2020-05-28 09:50:56 +02:00 committed by GitHub
parent 7edcea9a93
commit 4f3bf79708
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 5 deletions

View File

@ -17,22 +17,36 @@ export const mutateElement = <TElement extends Mutable<ExcalidrawElement>>(
element: TElement,
updates: ElementUpdate<TElement>,
) => {
let didChange = false;
// casting to any because can't use `in` operator
// (see https://github.com/microsoft/TypeScript/issues/21732)
const { points } = updates as any;
if (typeof points !== "undefined") {
didChange = true;
updates = { ...getSizeFromPoints(points), ...updates };
}
for (const key in updates) {
const value = (updates as any)[key];
if (typeof value !== "undefined") {
// @ts-ignore
element[key] = value;
if (
(element as any)[key] === value &&
// if object, always update in case its deep prop was mutated
(typeof value !== "object" || value === null)
) {
continue;
}
(element as any)[key] = value;
didChange = true;
}
}
if (!didChange) {
return;
}
if (
typeof updates.height !== "undefined" ||
typeof updates.width !== "undefined" ||

View File

@ -40,8 +40,8 @@ Object {
"strokeStyle": "solid",
"strokeWidth": 1,
"type": "rectangle",
"version": 5,
"versionNonce": 1116226695,
"version": 4,
"versionNonce": 1150084233,
"width": 30,
"x": -10,
"y": 60,

View File

@ -83,7 +83,7 @@ describe("duplicate element on move when ALT is clicked", () => {
fireEvent.pointerMove(canvas, { clientX: 10, clientY: 60 });
fireEvent.pointerUp(canvas);
expect(renderScene).toHaveBeenCalledTimes(5);
expect(renderScene).toHaveBeenCalledTimes(4);
expect(h.state.selectionElement).toBeNull();
expect(h.elements.length).toEqual(2);