From fadfd6fb746be0c4801f80b8692430434b9243fa Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Sat, 4 Dec 2021 13:44:41 +0100 Subject: [PATCH] Message List: Disable scrolling in small lists --- src/components/middle/MessageList.tsx | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/components/middle/MessageList.tsx b/src/components/middle/MessageList.tsx index 4f6f004f2..7157d09fd 100644 --- a/src/components/middle/MessageList.tsx +++ b/src/components/middle/MessageList.tsx @@ -97,7 +97,7 @@ const BOTTOM_THRESHOLD = 20; const UNREAD_DIVIDER_TOP = 10; const UNREAD_DIVIDER_TOP_WITH_TOOLS = 60; const SCROLL_DEBOUNCE = 200; -const FOCUSING_DURATION = 1000; +const MESSAGE_ANIMATION_DURATION = 500; const BOTTOM_FOCUS_MARGIN = 20; const SELECT_MODE_ANIMATION_DURATION = 200; const UNREAD_DIVIDER_CLASS = 'unread-divider'; @@ -325,10 +325,20 @@ const MessageList: FC = ({ return; } + const hasLastMessageChanged = ( + messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1] + ); + const hasViewportShifted = ( + messageIds?.[0] !== prevMessageIds?.[0] && messageIds?.length === (MESSAGE_LIST_SLICE / 2 + 1) + ); + const wasMessageAdded = hasLastMessageChanged && !hasViewportShifted; + const isAlreadyFocusing = messageIds && memoFocusingIdRef.current === messageIds[messageIds.length - 1]; + // Add extra height when few messages to allow smooth scroll animation. Uses assumption that `parentElement` // is a Transition slide and its CSS class can not be reset in a declarative way. const shouldForceScroll = ( isViewportNewest + && wasMessageAdded && (messageIds && messageIds.length < MESSAGE_LIST_SLICE / 2) && !container.parentElement!.classList.contains('force-messages-scroll') && (container.firstElementChild as HTMLDivElement)!.clientHeight <= container.offsetHeight * 2 @@ -341,18 +351,9 @@ const MessageList: FC = ({ if (container.parentElement) { container.parentElement.classList.remove('force-messages-scroll'); } - }, FOCUSING_DURATION); + }, MESSAGE_ANIMATION_DURATION); } - const hasLastMessageChanged = ( - messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1] - ); - const hasViewportShifted = ( - messageIds?.[0] !== prevMessageIds?.[0] && messageIds?.length === (MESSAGE_LIST_SLICE / 2 + 1) - ); - const wasMessageAdded = hasLastMessageChanged && !hasViewportShifted; - const isAlreadyFocusing = messageIds && memoFocusingIdRef.current === messageIds[messageIds.length - 1]; - const { scrollTop, scrollHeight, offsetHeight } = container; const scrollOffset = scrollOffsetRef.current!; const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];