From 31db2eed8fb739042c24b04438434d6769753e40 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Tue, 31 Dec 2024 03:14:27 +0100 Subject: [PATCH] Scroll: Fix scroll to unread divider (#5388) --- src/components/middle/MessageList.tsx | 3 ++- src/util/animateScroll.ts | 17 +---------------- src/util/scroll.ts | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 src/util/scroll.ts diff --git a/src/components/middle/MessageList.tsx b/src/components/middle/MessageList.tsx index bb35cdb21..e7cf2febb 100644 --- a/src/components/middle/MessageList.tsx +++ b/src/components/middle/MessageList.tsx @@ -56,6 +56,7 @@ import { orderBy } from '../../util/iteratees'; import { isLocalMessageId } from '../../util/keys/messageKey'; import resetScroll from '../../util/resetScroll'; import { debounce, onTickEnd } from '../../util/schedulers'; +import { getOffsetToContainer } from '../../util/scroll'; import { groupMessages } from './helpers/groupMessages'; import { preventMessageInputBlur } from './helpers/preventMessageInputBlur'; @@ -585,7 +586,7 @@ const MessageList: FC = ({ newScrollTop = scrollTop + (newAnchorTop - (anchorTopRef.current || 0)); } else if (unreadDivider) { newScrollTop = Math.min( - unreadDivider.offsetTop - UNREAD_DIVIDER_TOP, + getOffsetToContainer(unreadDivider, container).top - UNREAD_DIVIDER_TOP, scrollHeight - scrollOffset, ); } else { diff --git a/src/util/animateScroll.ts b/src/util/animateScroll.ts index f9234c199..f071419bb 100644 --- a/src/util/animateScroll.ts +++ b/src/util/animateScroll.ts @@ -13,6 +13,7 @@ import { import { requestMeasure, requestMutation } from '../lib/fasterdom/fasterdom'; import { selectCanAnimateInterface } from '../global/selectors'; import { animateSingle, cancelSingleAnimation } from './animation'; +import { getOffsetToContainer } from './scroll'; import { IS_ANDROID } from './windowEnvironment'; export type AnimateScrollArgs = { @@ -55,22 +56,6 @@ export function restartCurrentScrollAnimation() { }); } -function getOffsetToContainer(element: HTMLElement, container: HTMLElement) { - let offsetTop = 0; - let offsetLeft = 0; - - let current: HTMLElement | null = element; - - while (current && current !== container && !current.contains(container)) { - offsetTop += current.offsetTop; - offsetLeft += current.offsetLeft; - - current = current.offsetParent as HTMLElement; - } - - return { top: offsetTop, left: offsetLeft }; -} - function createMutateFunction(args: AnimateScrollArgs) { const { container, diff --git a/src/util/scroll.ts b/src/util/scroll.ts new file mode 100644 index 000000000..4fea01b75 --- /dev/null +++ b/src/util/scroll.ts @@ -0,0 +1,15 @@ +export function getOffsetToContainer(element: HTMLElement, container: HTMLElement) { + let offsetTop = 0; + let offsetLeft = 0; + + let current: HTMLElement | null = element; + + while (current && current !== container && !current.contains(container)) { + offsetTop += current.offsetTop; + offsetLeft += current.offsetLeft; + + current = current.offsetParent as HTMLElement; + } + + return { top: offsetTop, left: offsetLeft }; +}