mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
recent_view: Make load more fetch substantially more data.
We keep fetching until we reach first unread message or have 50k messages worth of data displayed once user hits `Load more` in recent view.
This commit is contained in:
@@ -52,6 +52,7 @@ const consts = {
|
|||||||
|
|
||||||
// Parameters for asking for more history in the recent view.
|
// Parameters for asking for more history in the recent view.
|
||||||
recent_view_fetch_more_batch_size: 2000,
|
recent_view_fetch_more_batch_size: 2000,
|
||||||
|
recent_view_minimum_load_more_fetch_size: 50000,
|
||||||
};
|
};
|
||||||
|
|
||||||
function process_result(data, opts) {
|
function process_result(data, opts) {
|
||||||
@@ -428,9 +429,41 @@ export function maybe_load_older_messages(opts) {
|
|||||||
if (!msg_list_data.fetch_status.can_load_older_messages()) {
|
if (!msg_list_data.fetch_status.can_load_older_messages()) {
|
||||||
// We may already be loading old messages or already
|
// We may already be loading old messages or already
|
||||||
// got the oldest one.
|
// got the oldest one.
|
||||||
|
if (opts.recent_view) {
|
||||||
|
recent_view_ui.set_backfill_in_progress(false);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opts.recent_view && recent_view_ui.is_backfill_in_progress) {
|
||||||
|
// The recent view "load more" button does a tail-recursive
|
||||||
|
// backfill, so that one doesn't have to click dozens of times
|
||||||
|
// to get a large amount of history.
|
||||||
|
//
|
||||||
|
// We can afford to do this in our server load budget, because
|
||||||
|
// this is a rare operation; prior to May 2024, Zulip fetched
|
||||||
|
// all history since the oldest unread unconditionally.
|
||||||
|
|
||||||
|
let fetched_substantial_history = false;
|
||||||
|
if (msg_list_data.num_items() >= consts.recent_view_minimum_load_more_fetch_size) {
|
||||||
|
fetched_substantial_history = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let found_first_unread = opts.first_unread_message_id === undefined;
|
||||||
|
// This is a soft check because `first_unread_message_id` can be deleted.
|
||||||
|
if (!found_first_unread && msg_list_data.first() <= opts.first_unread_message_id) {
|
||||||
|
found_first_unread = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fetched_substantial_history && found_first_unread) {
|
||||||
|
recent_view_ui.set_backfill_in_progress(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
opts.cont = () =>
|
||||||
|
setTimeout(() => maybe_load_older_messages(opts), consts.catch_up_backfill_delay);
|
||||||
|
}
|
||||||
|
|
||||||
do_backfill({
|
do_backfill({
|
||||||
...opts,
|
...opts,
|
||||||
num_before: opts.recent_view
|
num_before: opts.recent_view
|
||||||
@@ -515,7 +548,7 @@ export function initialize(finished_initial_fetch) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop once we've hit the minimum backfill quantiy of
|
// Stop once we've hit the minimum backfill quantity of
|
||||||
// messages if we've received a message older than
|
// messages if we've received a message older than
|
||||||
// `target_days_of_history`.
|
// `target_days_of_history`.
|
||||||
const latest_message = all_messages_data.first();
|
const latest_message = all_messages_data.first();
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import * as views_util from "./views_util";
|
|||||||
|
|
||||||
let topics_widget;
|
let topics_widget;
|
||||||
let filters_dropdown_widget;
|
let filters_dropdown_widget;
|
||||||
|
export let is_backfill_in_progress = false;
|
||||||
// Sets the number of avatars to display.
|
// Sets the number of avatars to display.
|
||||||
// Rest of the avatars, if present, are displayed as {+x}
|
// Rest of the avatars, if present, are displayed as {+x}
|
||||||
const MAX_AVATAR = 4;
|
const MAX_AVATAR = 4;
|
||||||
@@ -102,6 +103,11 @@ export function set_initial_message_fetch_status(value) {
|
|||||||
is_initial_message_fetch_pending = value;
|
is_initial_message_fetch_pending = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function set_backfill_in_progress(value) {
|
||||||
|
is_backfill_in_progress = value;
|
||||||
|
update_load_more_banner();
|
||||||
|
}
|
||||||
|
|
||||||
export function clear_for_tests() {
|
export function clear_for_tests() {
|
||||||
filters.clear();
|
filters.clear();
|
||||||
dropdown_filters.clear();
|
dropdown_filters.clear();
|
||||||
@@ -199,12 +205,7 @@ function update_load_more_banner() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const $button = $(".recent-view-load-more-container .fetch-messages-button");
|
|
||||||
const $button_label = $(".recent-view-load-more-container .button-label");
|
|
||||||
const $banner_text = $(".recent-view-load-more-container .last-fetched-message");
|
const $banner_text = $(".recent-view-load-more-container .last-fetched-message");
|
||||||
|
|
||||||
$button.toggleClass("notvisible", false);
|
|
||||||
|
|
||||||
const time_obj = new Date(oldest_message_timestamp * 1000);
|
const time_obj = new Date(oldest_message_timestamp * 1000);
|
||||||
const time_string = timerender.get_localized_date_or_time_for_format(
|
const time_string = timerender.get_localized_date_or_time_for_format(
|
||||||
time_obj,
|
time_obj,
|
||||||
@@ -212,6 +213,15 @@ function update_load_more_banner() {
|
|||||||
);
|
);
|
||||||
$banner_text.text($t({defaultMessage: "Showing messages since {time_string}."}, {time_string}));
|
$banner_text.text($t({defaultMessage: "Showing messages since {time_string}."}, {time_string}));
|
||||||
|
|
||||||
|
if (is_backfill_in_progress) {
|
||||||
|
// Keep the button disabled and the loading indicator running
|
||||||
|
// until we've finished our recursive backfill.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const $button = $(".recent-view-load-more-container .fetch-messages-button");
|
||||||
|
const $button_label = $(".recent-view-load-more-container .button-label");
|
||||||
|
$button.toggleClass("notvisible", false);
|
||||||
|
|
||||||
$button_label.toggleClass("invisible", false);
|
$button_label.toggleClass("invisible", false);
|
||||||
$button.prop("disabled", false);
|
$button.prop("disabled", false);
|
||||||
loading.destroy_indicator(
|
loading.destroy_indicator(
|
||||||
@@ -1593,13 +1603,13 @@ export function initialize({
|
|||||||
});
|
});
|
||||||
|
|
||||||
$("body").on("click", ".recent-view-load-more-container .fetch-messages-button", () => {
|
$("body").on("click", ".recent-view-load-more-container .fetch-messages-button", () => {
|
||||||
maybe_load_older_messages();
|
|
||||||
$(".recent-view-load-more-container .button-label").toggleClass("invisible", true);
|
$(".recent-view-load-more-container .button-label").toggleClass("invisible", true);
|
||||||
$(".recent-view-load-more-container .fetch-messages-button").prop("disabled", true);
|
$(".recent-view-load-more-container .fetch-messages-button").prop("disabled", true);
|
||||||
loading.make_indicator(
|
loading.make_indicator(
|
||||||
$(".recent-view-load-more-container .fetch-messages-button .loading-indicator"),
|
$(".recent-view-load-more-container .fetch-messages-button .loading-indicator"),
|
||||||
{width: 20},
|
{width: 20},
|
||||||
);
|
);
|
||||||
|
maybe_load_older_messages();
|
||||||
});
|
});
|
||||||
|
|
||||||
$(document).on("compose_canceled.zulip", () => {
|
$(document).on("compose_canceled.zulip", () => {
|
||||||
|
|||||||
@@ -734,9 +734,16 @@ export function initialize_everything(state_data) {
|
|||||||
on_mark_pm_as_read: unread_ops.mark_pm_as_read,
|
on_mark_pm_as_read: unread_ops.mark_pm_as_read,
|
||||||
on_mark_topic_as_read: unread_ops.mark_topic_as_read,
|
on_mark_topic_as_read: unread_ops.mark_topic_as_read,
|
||||||
maybe_load_older_messages() {
|
maybe_load_older_messages() {
|
||||||
|
recent_view_ui.set_backfill_in_progress(true);
|
||||||
message_fetch.maybe_load_older_messages({
|
message_fetch.maybe_load_older_messages({
|
||||||
msg_list_data: all_messages_data,
|
msg_list_data: all_messages_data,
|
||||||
recent_view: true,
|
recent_view: true,
|
||||||
|
// To have a hard anchor on our target of first unread message id,
|
||||||
|
// we pass it from here, otherwise it might get updated and lead to confusion.
|
||||||
|
//
|
||||||
|
// TODO: Ideally, muted unread messages would not
|
||||||
|
// count for this purpose.
|
||||||
|
first_unread_message_id: unread.get_all_msg_ids()[0],
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user