message scrolling: Add started_scrolled_up logic.

Figuring out whether we started scrolled up
**BEFORE** rendering is more accurate than trying
to subtract out heights of new messages after
rendering.
This commit is contained in:
Steve Howell
2019-01-06 16:44:48 +00:00
committed by Tim Abbott
parent 632262e484
commit a8fe6a864d
2 changed files with 33 additions and 11 deletions

View File

@@ -555,6 +555,12 @@ MessageListView.prototype = {
var self = this;
// If we start with the message feed scrolled up (i.e.
// the bottom message is not visible), then we will respect
// the user's current position after rendering, rather
// than auto-scrolling.
var started_scrolled_up = message_viewport.is_scrolled_up();
// The messages we are being asked to render are shared with between
// all messages lists. To prevent having both list views overwriting
// each others data we will make a new message object to add data to
@@ -742,6 +748,9 @@ MessageListView.prototype = {
}
if (list === current_msg_list && messages_are_new) {
if (started_scrolled_up) {
return;
}
var new_messages_height = self._new_messages_height(new_dom_elements);
self._maybe_autoscroll(new_messages_height);
}
@@ -841,17 +850,6 @@ MessageListView.prototype = {
scroll_amount = scroll_limit;
}
// Let's work our way back to whether the user was already dealing
// with messages off the screen, in which case we shouldn't autoscroll.
var bottom_last_visible = last_visible.offset().top + last_visible.height();
var bottom_old_last_visible = bottom_last_visible - new_messages_height;
var bottom_viewport = info.visible_top + info.visible_height;
// Exit if the user was already past the bottom.
if (bottom_old_last_visible > bottom_viewport) {
return;
}
// Ok, we are finally ready to actually scroll.
if (scroll_amount > 0) {
message_viewport.system_initiated_animate_scroll(scroll_amount);

View File

@@ -65,6 +65,30 @@ exports.is_below_visible_bottom = function (offset) {
return offset > exports.scrollTop() + exports.height() - $("#compose").height();
};
exports.is_scrolled_up = function () {
// Let's determine whether the user was already dealing
// with messages off the screen, which can guide auto
// scrolling decisions.
var last_row = rows.last_visible();
if (last_row.length === 0) {
return false;
}
var offset = exports.offset_from_bottom(last_row);
return offset > 0;
};
exports.offset_from_bottom = function (last_row) {
// A positive return value here means the last row is
// below the bottom of the feed (i.e. obscured by the compose
// box or even further below the bottom).
var message_bottom = last_row.offset().top + last_row.height();
var info = exports.message_viewport_info();
return message_bottom - info.visible_bottom;
};
exports.set_message_position = function (message_top, message_height, viewport_info, ratio) {
// message_top = offset of the top of a message that you are positioning
// message_height = height of the message that you are positioning