mirror of https://github.com/zulip/zulip.git
Fix issue where arrowing-down near end of page would skip a message.
We had this fascinating behavior where pressing a down arrow near the end of the page would advance the pointer, call recenter_view, which would trigger a scroll event, which would call keep_pointer_in_view, which would notice that we were at the end of the page and advance the pointer again! I split out that last part into its own function which is only called on mousewheel events. (imported from commit bc85443e762356e3055f8f88585940a1f11f9124)
This commit is contained in:
parent
a0bb0d257b
commit
48cda57d84
|
@ -39,7 +39,8 @@ var globals =
|
||||||
// zephyr.js
|
// zephyr.js
|
||||||
+ ' message_array message_dict'
|
+ ' message_array message_dict'
|
||||||
+ ' status_classes clear_table add_to_table instance_list'
|
+ ' status_classes clear_table add_to_table instance_list'
|
||||||
+ ' keep_pointer_in_view respond_to_message'
|
+ ' keep_pointer_in_view move_pointer_at_page_top_and_bottom'
|
||||||
|
+ ' respond_to_message'
|
||||||
+ ' select_message select_message_by_id'
|
+ ' select_message select_message_by_id'
|
||||||
+ ' scroll_to_selected select_and_show_by_id'
|
+ ' scroll_to_selected select_and_show_by_id'
|
||||||
+ ' selected_message selected_message_id'
|
+ ' selected_message selected_message_id'
|
||||||
|
|
|
@ -138,9 +138,15 @@ $(function () {
|
||||||
sub_from_home(compose_class_name(), $('#class-nosub'));
|
sub_from_home(compose_class_name(), $('#class-nosub'));
|
||||||
});
|
});
|
||||||
|
|
||||||
var throttled_scrollhandler = $.throttle(50, function() {
|
var throttled_scrollhandler = $.throttle(50, function(e) {
|
||||||
if ($('#home').hasClass('active')) {
|
if ($('#home').hasClass('active')) {
|
||||||
keep_pointer_in_view();
|
keep_pointer_in_view();
|
||||||
|
if (e.type === 'mousewheel') {
|
||||||
|
// If we mousewheel (or trackpad-scroll) when
|
||||||
|
// we're at the top and bottom of the page, the
|
||||||
|
// pointer may still want to move.
|
||||||
|
move_pointer_at_page_top_and_bottom();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$(window).mousewheel(throttled_scrollhandler);
|
$(window).mousewheel(throttled_scrollhandler);
|
||||||
|
|
|
@ -515,6 +515,16 @@ function keep_pointer_in_view() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
update_selected_message(next_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The idea here is when you've scrolled to the very
|
||||||
|
// bottom of the page, e.g., the scroll handler isn't
|
||||||
|
// going to fire anymore. But if I continue to use
|
||||||
|
// the scrollwheel, the selection should advance until
|
||||||
|
// I'm at the very top or the very bottom of the page.
|
||||||
|
function move_pointer_at_page_top_and_bottom() {
|
||||||
|
var next_message = get_message_row(selected_message_id);
|
||||||
|
|
||||||
if (at_top_of_viewport() && (parseInt(get_id(next_message), 10) >
|
if (at_top_of_viewport() && (parseInt(get_id(next_message), 10) >
|
||||||
parseInt(get_id(get_first_visible()), 10))) {
|
parseInt(get_id(get_first_visible()), 10))) {
|
||||||
|
|
Loading…
Reference in New Issue