Skip to content

Commit 05dba19

Browse files
committed
fix(react messages): consider scrollMessagesOnEdge when scrolling
fixes #3908
1 parent 2cb535c commit 05dba19

File tree

2 files changed

+50
-20
lines changed

2 files changed

+50
-20
lines changed

src/core/components/messages/messages-class.js

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,24 @@ class Messages extends Framework7Class {
340340
return m.addMessages([messageToAdd], animate, method);
341341
}
342342

343+
setScrollData() {
344+
const m = this;
345+
// Define scroll positions before new messages added
346+
const scrollHeightBefore = m.pageContentEl.scrollHeight;
347+
const heightBefore = m.pageContentEl.offsetHeight;
348+
const scrollBefore = m.pageContentEl.scrollTop;
349+
m.scrollData = {
350+
scrollHeightBefore,
351+
heightBefore,
352+
scrollBefore,
353+
};
354+
return {
355+
scrollHeightBefore,
356+
heightBefore,
357+
scrollBefore,
358+
};
359+
}
360+
343361
addMessages(...args) {
344362
const m = this;
345363
let messagesToAdd;
@@ -357,10 +375,7 @@ class Messages extends Framework7Class {
357375
method = m.params.newMessagesFirst ? 'prepend' : 'append';
358376
}
359377

360-
// Define scroll positions before new messages added
361-
const scrollHeightBefore = m.pageContentEl.scrollHeight;
362-
const heightBefore = m.pageContentEl.offsetHeight;
363-
const scrollBefore = m.pageContentEl.scrollTop;
378+
const { scrollHeightBefore, scrollBefore } = m.setScrollData();
364379

365380
// Add message to DOM and data
366381
let messagesHTML = '';
@@ -409,21 +424,7 @@ class Messages extends Framework7Class {
409424
((method === 'append' && !m.params.newMessagesFirst) ||
410425
(method === 'prepend' && m.params.newMessagesFirst && !typingMessage))
411426
) {
412-
if (m.params.scrollMessagesOnEdge) {
413-
let onEdge = false;
414-
if (m.params.newMessagesFirst && scrollBefore === 0) {
415-
onEdge = true;
416-
}
417-
if (
418-
!m.params.newMessagesFirst &&
419-
scrollBefore - (scrollHeightBefore - heightBefore) >= -10
420-
) {
421-
onEdge = true;
422-
}
423-
if (onEdge) m.scroll(animate ? undefined : 0);
424-
} else {
425-
m.scroll(animate ? undefined : 0);
426-
}
427+
m.scrollWithEdgeCheck(animate);
427428
}
428429

429430
return m;
@@ -469,6 +470,23 @@ class Messages extends Framework7Class {
469470
return m;
470471
}
471472

473+
scrollWithEdgeCheck(animate) {
474+
const m = this;
475+
const { scrollBefore, scrollHeightBefore, heightBefore } = m.scrollData;
476+
if (m.params.scrollMessagesOnEdge) {
477+
let onEdge = false;
478+
if (m.params.newMessagesFirst && scrollBefore === 0) {
479+
onEdge = true;
480+
}
481+
if (!m.params.newMessagesFirst && scrollBefore - (scrollHeightBefore - heightBefore) >= -10) {
482+
onEdge = true;
483+
}
484+
if (onEdge) m.scroll(animate ? undefined : 0);
485+
} else {
486+
m.scroll(animate ? undefined : 0);
487+
}
488+
}
489+
472490
scroll(duration = 300, scrollTop) {
473491
const m = this;
474492
const currentScroll = m.pageContentEl.scrollTop;

src/react/components/messages.jsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ const Messages = forwardRef((props, ref) => {
6262

6363
const elRef = useRef(null);
6464
const childrenBeforeUpdated = useRef(null);
65+
const reactChildrenBefore = useRef(children ? React.Children.count(children) : 0);
6566

6667
useImperativeHandle(ref, () => ({
6768
el: elRef.current,
@@ -107,6 +108,15 @@ const Messages = forwardRef((props, ref) => {
107108
return onDestroy;
108109
}, []);
109110

111+
const currentChildrenLength = children ? React.Children.count(children) : 0;
112+
if (f7Messages.current && scrollMessages) {
113+
const beforeChildrenLength = reactChildrenBefore.current || 0;
114+
if (currentChildrenLength !== beforeChildrenLength) {
115+
f7Messages.current.setScrollData();
116+
}
117+
}
118+
reactChildrenBefore.current = currentChildrenLength;
119+
110120
useIsomorphicLayoutEffect(() => {
111121
const wasMounted = mounted.current;
112122
mounted.current = true;
@@ -135,11 +145,13 @@ const Messages = forwardRef((props, ref) => {
135145
if (
136146
childrenBeforeUpdated.current !== childrenAfterUpdated &&
137147
f7Messages.current.scroll &&
148+
f7Messages.current.scrollData &&
138149
scrollMessages
139150
) {
140-
f7Messages.current.scroll();
151+
f7Messages.current.scrollWithEdgeCheck(true);
141152
}
142153
}
154+
143155
childrenBeforeUpdated.current = childrenAfterUpdated;
144156
});
145157

0 commit comments

Comments
 (0)