Scroll: Fix scroll to unread divider (#5388)

This commit is contained in:
Alexander Zinchuk 2024-12-31 03:14:27 +01:00
parent 8d995f7db7
commit 31db2eed8f
3 changed files with 18 additions and 17 deletions

View File

@ -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<OwnProps & StateProps> = ({
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 {

View File

@ -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,

15
src/util/scroll.ts Normal file
View File

@ -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 };
}