diff --git a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue index d825e4634..9b4de3651 100644 --- a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue +++ b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue @@ -56,6 +56,7 @@ @@ -72,6 +73,7 @@ @@ -106,6 +108,7 @@ import { getTypingUsersText } from '../../../helper/commons'; import { BUS_EVENTS } from 'shared/constants/busEvents'; import { REPLY_POLICY } from 'shared/constants/links'; import inboxMixin from 'shared/mixins/inboxMixin'; +import { calculateScrollTop } from './helpers/scrollTopCalculationHelper'; export default { components: { @@ -259,7 +262,23 @@ export default { this.conversationPanel.removeEventListener('scroll', this.handleScroll); }, scrollToBottom() { - this.conversationPanel.scrollTop = this.conversationPanel.scrollHeight; + let relevantMessages = []; + if (this.getUnreadCount > 0) { + // capturing only the unread messages + relevantMessages = this.conversationPanel.querySelectorAll( + '.message--unread' + ); + } else { + // capturing last message from the messages list + relevantMessages = Array.from( + this.conversationPanel.querySelectorAll('.message--read') + ).slice(-1); + } + this.conversationPanel.scrollTop = calculateScrollTop( + this.conversationPanel.scrollHeight, + this.$el.scrollHeight, + relevantMessages + ); }, onToggleContactPanel() { this.$emit('contact-panel-toggle'); diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js b/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js new file mode 100644 index 000000000..f588089c3 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js @@ -0,0 +1,18 @@ +const totalMessageHeight = (total, element) => { + return total + element.scrollHeight; +}; + +export const calculateScrollTop = ( + conversationPanelHeight, + parentHeight, + relevantMessages +) => { + // add up scrollHeight of a `relevantMessages` + let combinedMessageScrollHeight = [...relevantMessages].reduce( + totalMessageHeight, + 0 + ); + return ( + conversationPanelHeight - combinedMessageScrollHeight - parentHeight / 2 + ); +}; diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js new file mode 100644 index 000000000..03caf7560 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js @@ -0,0 +1,18 @@ +import { calculateScrollTop } from '../scrollTopCalculationHelper'; + +describe('#calculateScrollTop', () => { + it('returns calculated value of the scrollTop property', () => { + class DOMElement { + constructor(scrollHeight) { + this.scrollHeight = scrollHeight; + } + } + let count = 3; + let relevantMessages = []; + while (count > 0) { + relevantMessages.push(new DOMElement(100)); + count -= 1; + } + expect(calculateScrollTop(1000, 300, relevantMessages)).toEqual(550); + }); +});