Optimize scrolling: resize only changed row index and higher

This commit is contained in:
Scott Nonnenberg 2019-08-23 12:56:49 -07:00 committed by Ken Powers
parent 1f7c78eb0e
commit 979841f36c
4 changed files with 205 additions and 101 deletions

View file

@ -1,5 +1,5 @@
import memoizee from 'memoizee';
import { isNumber } from 'lodash';
import { fromPairs, isNumber } from 'lodash';
import { createSelector } from 'reselect';
import { format } from '../../types/PhoneNumber';
@ -370,9 +370,15 @@ export function _conversationMessagesSelector(
!metrics.oldest || !firstId || firstId === metrics.oldest.id;
const items = messageIds;
const messageHeightChanges = Boolean(
const messageHeightChangeLookup =
heightChangeMessageIds && heightChangeMessageIds.length
);
? fromPairs(heightChangeMessageIds.map(id => [id, true]))
: null;
const messageHeightChangeIndex = messageHeightChangeLookup
? messageIds.findIndex(id => messageHeightChangeLookup[id])
: undefined;
const oldestUnreadIndex = oldestUnread
? messageIds.findIndex(id => id === oldestUnread.id)
: undefined;
@ -387,14 +393,17 @@ export function _conversationMessagesSelector(
isLoadingMessages,
loadCountdownStart,
items,
messageHeightChanges,
messageHeightChangeIndex:
isNumber(messageHeightChangeIndex) && messageHeightChangeIndex >= 0
? messageHeightChangeIndex
: undefined,
oldestUnreadIndex:
isNumber(oldestUnreadIndex) && oldestUnreadIndex >= 0
? oldestUnreadIndex
: undefined,
resetCounter,
scrollToIndex:
scrollToIndex && scrollToIndex >= 0 ? scrollToIndex : undefined,
isNumber(scrollToIndex) && scrollToIndex >= 0 ? scrollToIndex : undefined,
scrollToIndexCounter: scrollToMessageCounter,
totalUnread,
};