Revert "fix: React.memo resolvers not accounting for all props (#6042)"

This reverts commit 618442299f.
test-failures
Daniel J. Geiger 2 years ago
parent 157bb7d6d6
commit a07ac46f8d

@ -16,7 +16,7 @@ import {
UIChildrenComponents, UIChildrenComponents,
UIWelcomeScreenComponents, UIWelcomeScreenComponents,
} from "../types"; } from "../types";
import { isShallowEqual, muteFSAbortError, getReactChildren } from "../utils"; import { muteFSAbortError, getReactChildren } from "../utils";
import { SelectedShapeActions, ShapesSwitcher } from "./Actions"; import { SelectedShapeActions, ShapesSwitcher } from "./Actions";
import { ErrorDialog } from "./ErrorDialog"; import { ErrorDialog } from "./ErrorDialog";
import { ExportCB, ImageExportDialog } from "./ImageExportDialog"; import { ExportCB, ImageExportDialog } from "./ImageExportDialog";
@ -480,39 +480,28 @@ const LayerUI = ({
); );
}; };
const stripIrrelevantAppStateProps = ( const areEqual = (prev: LayerUIProps, next: LayerUIProps) => {
appState: AppState, const getNecessaryObj = (appState: AppState): Partial<AppState> => {
): Partial<AppState> => { const {
const { suggestedBindings, startBoundElement, cursorButton, ...ret } = suggestedBindings,
appState; startBoundElement: boundElement,
return ret; ...ret
}; } = appState;
return ret;
const areEqual = (prevProps: LayerUIProps, nextProps: LayerUIProps) => { };
// short-circuit early const prevAppState = getNecessaryObj(prev.appState);
if (prevProps.children !== nextProps.children) { const nextAppState = getNecessaryObj(next.appState);
return false;
}
const { const keys = Object.keys(prevAppState) as (keyof Partial<AppState>)[];
canvas: _prevCanvas,
// not stable, but shouldn't matter in our case
onInsertElements: _prevOnInsertElements,
appState: prevAppState,
...prev
} = prevProps;
const {
canvas: _nextCanvas,
onInsertElements: _nextOnInsertElements,
appState: nextAppState,
...next
} = nextProps;
return ( return (
isShallowEqual( prev.renderTopRightUI === next.renderTopRightUI &&
stripIrrelevantAppStateProps(prevAppState), prev.renderCustomStats === next.renderCustomStats &&
stripIrrelevantAppStateProps(nextAppState), prev.renderCustomSidebar === next.renderCustomSidebar &&
) && isShallowEqual(prev, next) prev.langCode === next.langCode &&
prev.elements === next.elements &&
prev.files === next.files &&
keys.every((key) => prevAppState[key] === nextAppState[key])
); );
}; };

@ -1,7 +1,6 @@
import React, { useEffect, forwardRef } from "react"; import React, { useEffect, forwardRef } from "react";
import { InitializeApp } from "../../components/InitializeApp"; import { InitializeApp } from "../../components/InitializeApp";
import App from "../../components/App"; import App from "../../components/App";
import { isShallowEqual } from "../../utils";
import "../../css/app.scss"; import "../../css/app.scss";
import "../../css/styles.scss"; import "../../css/styles.scss";
@ -130,11 +129,6 @@ const areEqual = (
prevProps: PublicExcalidrawProps, prevProps: PublicExcalidrawProps,
nextProps: PublicExcalidrawProps, nextProps: PublicExcalidrawProps,
) => { ) => {
// short-circuit early
if (prevProps.children !== nextProps.children) {
return false;
}
const { const {
initialData: prevInitialData, initialData: prevInitialData,
UIOptions: prevUIOptions = {}, UIOptions: prevUIOptions = {},
@ -183,7 +177,13 @@ const areEqual = (
return prevUIOptions[key] === nextUIOptions[key]; return prevUIOptions[key] === nextUIOptions[key];
}); });
return isUIOptionsSame && isShallowEqual(prev, next); const prevKeys = Object.keys(prevProps) as (keyof typeof prev)[];
const nextKeys = Object.keys(nextProps) as (keyof typeof next)[];
return (
isUIOptionsSame &&
prevKeys.length === nextKeys.length &&
prevKeys.every((key) => prev[key] === next[key])
);
}; };
const forwardedRefComp = forwardRef< const forwardedRefComp = forwardRef<

@ -728,15 +728,3 @@ export const getReactChildren = <
return [knownChildren, restChildren] as const; return [knownChildren, restChildren] as const;
}; };
export const isShallowEqual = <T extends Record<string, any>>(
objA: T,
objB: T,
) => {
const aKeys = Object.keys(objA);
const bKeys = Object.keys(objA);
if (aKeys.length !== bKeys.length) {
return false;
}
return aKeys.every((key) => objA[key] === objB[key]);
};

Loading…
Cancel
Save