typeahead_helper: Fetch full subscriber list while sorting.

Work towards #34244.
This commit is contained in:
Evy Kassirer
2025-05-08 11:51:12 +02:00
committed by Tim Abbott
parent 5b1ddf35ba
commit 9577dc9da7
3 changed files with 21 additions and 1 deletions

View File

@@ -15,6 +15,7 @@ import type {
TopicSuggestion, TopicSuggestion,
} from "./composebox_typeahead.ts"; } from "./composebox_typeahead.ts";
import type {InputPillContainer} from "./input_pill.ts"; import type {InputPillContainer} from "./input_pill.ts";
import * as peer_data from "./peer_data.ts";
import * as people from "./people.ts"; import * as people from "./people.ts";
import type {PseudoMentionUser, User} from "./people.ts"; import type {PseudoMentionUser, User} from "./people.ts";
import * as pm_conversations from "./pm_conversations.ts"; import * as pm_conversations from "./pm_conversations.ts";
@@ -302,6 +303,18 @@ export function compare_people_for_relevance(
// Now handle actual people users. // Now handle actual people users.
// give preference to subscribed users first // give preference to subscribed users first
if (current_stream_id !== undefined) { if (current_stream_id !== undefined) {
// Fetch subscriber data if we don't have it yet, but don't wait for it.
// It's fine to use partial data for now, and hopefully on subsequent
// keystrokes, we'll have the full data to show more subscribers at the
// top of the list.
//
// (We will usually have it, since entering a channel triggers a fetch.)
if (!peer_data.has_full_subscriber_data(current_stream_id)) {
void peer_data.maybe_fetch_stream_subscribers(current_stream_id);
}
// If the client does not yet have complete subscriber data,
// "unknown" and "not subscribed" are both represented as false here.
const a_is_sub = stream_data.is_user_subscribed(current_stream_id, person_a.user.user_id); const a_is_sub = stream_data.is_user_subscribed(current_stream_id, person_a.user.user_id);
const b_is_sub = stream_data.is_user_subscribed(current_stream_id, person_b.user.user_id); const b_is_sub = stream_data.is_user_subscribed(current_stream_id, person_b.user.user_id);

View File

@@ -34,6 +34,9 @@ const message_user_ids = mock_esm("../src/message_user_ids", {
user_ids: () => [], user_ids: () => [],
}); });
const stream_topic_history_util = mock_esm("../src/stream_topic_history_util"); const stream_topic_history_util = mock_esm("../src/stream_topic_history_util");
mock_esm("../src/channel", {
get: () => ({subscribers: []}),
});
let set_timeout_called; let set_timeout_called;
set_global("setTimeout", (f, time) => { set_global("setTimeout", (f, time) => {

View File

@@ -2,7 +2,7 @@
const assert = require("node:assert/strict"); const assert = require("node:assert/strict");
const {zrequire} = require("./lib/namespace.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs");
const {run_test} = require("./lib/test.cjs"); const {run_test} = require("./lib/test.cjs");
const settings_config = zrequire("settings_config"); const settings_config = zrequire("settings_config");
@@ -24,6 +24,10 @@ const th = zrequire("typeahead_helper");
const user_groups = zrequire("user_groups"); const user_groups = zrequire("user_groups");
const {initialize_user_settings} = zrequire("user_settings"); const {initialize_user_settings} = zrequire("user_settings");
mock_esm("../src/channel", {
get: () => ({subscribers: []}),
});
const current_user = {}; const current_user = {};
set_current_user(current_user); set_current_user(current_user);
const realm = {}; const realm = {};