refactor: Extract narrow.update_selection().

The maybe_select_closest helper, when first introduced, was
tiny and close to its callers.

As it's grown, it's become kind of a big hurdle to reading
narrow.activate(), because it's out of chronological order
and it's hard to tell at a glance which variables it's closing
on.

Now we just move it out to module scope.

It's mostly moving code, with these minor changes:

        * we pass in opts for the old closure vars
        * we rename then_select_offset -> select_offset
        * we early-exit on empty lists
This commit is contained in:
Steve Howell 2018-05-03 12:34:29 +00:00 committed by Tim Abbott
parent d359c89b0c
commit e0557046f3
1 changed files with 44 additions and 33 deletions

View File

@ -172,37 +172,6 @@ exports.activate = function (raw_operators, opts) {
message_list.narrowed = msg_list; message_list.narrowed = msg_list;
current_msg_list = message_list.narrowed; current_msg_list = message_list.narrowed;
function maybe_select_closest() {
if (! message_list.narrowed.empty()) {
var msg_id;
if (select_strategy.flavor === 'exact') {
msg_id = select_strategy.msg_id;
} else if (select_strategy.flavor === 'first_unread') {
msg_id = message_list.narrowed.first_unread_message_id();
}
var preserve_pre_narrowing_screen_position =
(message_list.narrowed.get(msg_id) !== undefined) &&
(then_select_offset !== undefined);
var then_scroll = !preserve_pre_narrowing_screen_position;
message_list.narrowed.select_id(msg_id, {then_scroll: then_scroll,
use_closest: true,
force_rerender: true,
});
if (preserve_pre_narrowing_screen_position) {
// Scroll so that the selected message is in the same
// position in the viewport as it was prior to
// narrowing
message_list.narrowed.view.set_message_offset(then_select_offset);
}
unread_ops.process_visible();
}
}
// Populate the message list if we can apply our filter locally (i.e. // Populate the message list if we can apply our filter locally (i.e.
// with no backend help) and we have the message we want to select. // with no backend help) and we have the message we want to select.
if (narrow_state.get_current_filter().can_apply_locally()) { if (narrow_state.get_current_filter().can_apply_locally()) {
@ -236,7 +205,10 @@ exports.activate = function (raw_operators, opts) {
use_first_unread_anchor: use_first_unread, use_first_unread_anchor: use_first_unread,
cont: function () { cont: function () {
if (defer_selecting_closest) { if (defer_selecting_closest) {
maybe_select_closest(); exports.update_selection({
select_strategy: select_strategy,
select_offset: then_select_offset,
});
} }
msg_list.network_time = new Date(); msg_list.network_time = new Date();
maybe_report_narrow_time(msg_list); maybe_report_narrow_time(msg_list);
@ -246,7 +218,10 @@ exports.activate = function (raw_operators, opts) {
if (! defer_selecting_closest) { if (! defer_selecting_closest) {
message_scroll.hide_indicators(); message_scroll.hide_indicators();
maybe_select_closest(); exports.update_selection({
select_strategy: select_strategy,
select_offset: then_select_offset,
});
} else { } else {
message_scroll.show_loading_older(); message_scroll.show_loading_older();
} }
@ -279,6 +254,42 @@ exports.activate = function (raw_operators, opts) {
}, 0); }, 0);
}; };
exports.update_selection = function (opts) {
if (message_list.narrowed.empty()) {
return;
}
var select_strategy = opts.select_strategy;
var select_offset = opts.select_offset;
var msg_id;
if (select_strategy.flavor === 'exact') {
msg_id = select_strategy.msg_id;
} else if (select_strategy.flavor === 'first_unread') {
msg_id = message_list.narrowed.first_unread_message_id();
}
var preserve_pre_narrowing_screen_position =
(message_list.narrowed.get(msg_id) !== undefined) &&
(select_offset !== undefined);
var then_scroll = !preserve_pre_narrowing_screen_position;
message_list.narrowed.select_id(msg_id, {then_scroll: then_scroll,
use_closest: true,
force_rerender: true,
});
if (preserve_pre_narrowing_screen_position) {
// Scroll so that the selected message is in the same
// position in the viewport as it was prior to
// narrowing
message_list.narrowed.view.set_message_offset(select_offset);
}
unread_ops.process_visible();
};
exports.stream_topic = function () { exports.stream_topic = function () {
// This function returns the stream/topic that we most // This function returns the stream/topic that we most
// specifically care about, according (mostly) to the // specifically care about, according (mostly) to the