Replace flawed objectHasValueChange usage with objectHasDiff
Fixes https://github.com/vector-im/riot-web/issues/14782 We need to check if the keys changed, not just the values.pull/21833/head
parent
e810a31fe3
commit
e953bfbf88
|
@ -47,7 +47,7 @@ import { polyfillTouchEvent } from "../../../@types/polyfill";
|
||||||
import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore";
|
import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore";
|
||||||
import RoomListLayoutStore from "../../../stores/room-list/RoomListLayoutStore";
|
import RoomListLayoutStore from "../../../stores/room-list/RoomListLayoutStore";
|
||||||
import { arrayHasOrderChange } from "../../../utils/arrays";
|
import { arrayHasOrderChange } from "../../../utils/arrays";
|
||||||
import { objectExcluding, objectHasValueChange } from "../../../utils/objects";
|
import { objectExcluding, objectHasDiff } from "../../../utils/objects";
|
||||||
import TemporaryTile from "./TemporaryTile";
|
import TemporaryTile from "./TemporaryTile";
|
||||||
import { ListNotificationState } from "../../../stores/notifications/ListNotificationState";
|
import { ListNotificationState } from "../../../stores/notifications/ListNotificationState";
|
||||||
|
|
||||||
|
@ -181,7 +181,7 @@ export default class RoomSublist extends React.Component<IProps, IState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public shouldComponentUpdate(nextProps: Readonly<IProps>, nextState: Readonly<IState>): boolean {
|
public shouldComponentUpdate(nextProps: Readonly<IProps>, nextState: Readonly<IState>): boolean {
|
||||||
if (objectHasValueChange(this.props, nextProps)) {
|
if (objectHasDiff(this.props, nextProps)) {
|
||||||
// Something we don't care to optimize has updated, so update.
|
// Something we don't care to optimize has updated, so update.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -189,7 +189,7 @@ export default class RoomSublist extends React.Component<IProps, IState> {
|
||||||
// Do the same check used on props for state, without the rooms we're going to no-op
|
// Do the same check used on props for state, without the rooms we're going to no-op
|
||||||
const prevStateNoRooms = objectExcluding(this.state, ['rooms']);
|
const prevStateNoRooms = objectExcluding(this.state, ['rooms']);
|
||||||
const nextStateNoRooms = objectExcluding(nextState, ['rooms']);
|
const nextStateNoRooms = objectExcluding(nextState, ['rooms']);
|
||||||
if (objectHasValueChange(prevStateNoRooms, nextStateNoRooms)) {
|
if (objectHasDiff(prevStateNoRooms, nextStateNoRooms)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,20 +58,6 @@ export function objectShallowClone(a: any, propertyCloner?: (k: string, v: any)
|
||||||
return newObj;
|
return newObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if the two objects, which are assumed to be of the same
|
|
||||||
* key shape, have a difference in their values. If a difference is
|
|
||||||
* determined, true is returned.
|
|
||||||
* @param a The first object. Must be defined.
|
|
||||||
* @param b The second object. Must be defined.
|
|
||||||
* @returns True if there's a perceptual difference in the object's values.
|
|
||||||
*/
|
|
||||||
export function objectHasValueChange(a: any, b: any): boolean {
|
|
||||||
const aValues = Object.values(a);
|
|
||||||
const bValues = Object.values(b);
|
|
||||||
return arrayHasDiff(aValues, bValues);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if any keys were added, removed, or changed between two objects.
|
* Determines if any keys were added, removed, or changed between two objects.
|
||||||
* For changes, simple triple equal comparisons are done, not in-depth
|
* For changes, simple triple equal comparisons are done, not in-depth
|
||||||
|
|
Loading…
Reference in New Issue