From 3d6af7a3c8b3971995f6682447e6e7b9ce521510 Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Mon, 19 Apr 2021 15:11:23 -0700 Subject: [PATCH] typeahead: Fetch stream topic history from server. Long ago, we changed Zulip to inspect server-provided topic history in our compose and search typeahead modules, but did not trigger a query to the server to fetch data. This could result in confusing experiences where someone thought that a topic doesn't exist that just isn't present in recent history. Once we merge this, we may want to adjust the messaging in typeahead to advertise that the first option will create a new topic, since this change may make it feel more like creating topics is a heavyweight operation. Fixes #9857. --- frontend_tests/node_tests/composebox_typeahead.js | 9 +++++++++ frontend_tests/node_tests/search_suggestion.js | 6 ++++-- frontend_tests/node_tests/search_suggestion_legacy.js | 6 ++++-- static/js/composebox_typeahead.js | 4 ++++ static/js/search_suggestion.js | 3 +++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/frontend_tests/node_tests/composebox_typeahead.js b/frontend_tests/node_tests/composebox_typeahead.js index 4413106726..e8af662f91 100644 --- a/frontend_tests/node_tests/composebox_typeahead.js +++ b/frontend_tests/node_tests/composebox_typeahead.js @@ -18,6 +18,7 @@ const message_user_ids = mock_esm("../../static/js/message_user_ids", { user_ids: () => [], }); const stream_topic_history = mock_esm("../../static/js/stream_topic_history"); +const stream_topic_history_util = mock_esm("../../static/js/stream_topic_history_util"); let autosize_called; @@ -316,6 +317,10 @@ test("topics_seen_for", (override) => { return ["With Twisted Metal", "acceptance", "civil fears"]; }); + override(stream_topic_history_util, "get_server_history", (stream_id) => { + assert.equal(stream_id, denmark_stream.stream_id); + }); + assert.deepEqual(ct.topics_seen_for("Denmark"), [ "With Twisted Metal", "acceptance", @@ -558,6 +563,8 @@ function sorted_names_from(subs) { test("initialize", (override) => { let expected_value; + override(stream_topic_history_util, "get_server_history", () => {}); + let stream_typeahead_called = false; $("#stream_message_recipient_stream").typeahead = (options) => { // options.source() @@ -1109,6 +1116,8 @@ test("initialize", (override) => { }); test("begins_typeahead", (override) => { + override(stream_topic_history_util, "get_server_history", () => {}); + const begin_typehead_this = { options: { completions: { diff --git a/frontend_tests/node_tests/search_suggestion.js b/frontend_tests/node_tests/search_suggestion.js index 6b6d31e018..2f9e440d85 100644 --- a/frontend_tests/node_tests/search_suggestion.js +++ b/frontend_tests/node_tests/search_suggestion.js @@ -2,10 +2,12 @@ const {strict: assert} = require("assert"); -const {with_field, zrequire} = require("../zjsunit/namespace"); +const {mock_esm, with_field, zrequire} = require("../zjsunit/namespace"); const {run_test} = require("../zjsunit/test"); const {page_params} = require("../zjsunit/zpage_params"); +const stream_topic_history_util = mock_esm("../../static/js/stream_topic_history_util"); + const settings_config = zrequire("settings_config"); const huddle_data = zrequire("huddle_data"); @@ -629,8 +631,8 @@ test("topic_suggestions", (override) => { let suggestions; let expected; + override(stream_topic_history_util, "get_server_history", () => {}); override(stream_data, "subscribed_streams", () => ["office"]); - override(narrow_state, "stream", () => "office"); const devel_id = 44; diff --git a/frontend_tests/node_tests/search_suggestion_legacy.js b/frontend_tests/node_tests/search_suggestion_legacy.js index b0b52c138f..4d2079f7d7 100644 --- a/frontend_tests/node_tests/search_suggestion_legacy.js +++ b/frontend_tests/node_tests/search_suggestion_legacy.js @@ -2,10 +2,12 @@ const {strict: assert} = require("assert"); -const {zrequire} = require("../zjsunit/namespace"); +const {mock_esm, zrequire} = require("../zjsunit/namespace"); const {run_test} = require("../zjsunit/test"); const {page_params} = require("../zjsunit/zpage_params"); +const stream_topic_history_util = mock_esm("../../static/js/stream_topic_history_util"); + const settings_config = zrequire("settings_config"); const huddle_data = zrequire("huddle_data"); @@ -596,8 +598,8 @@ test("topic_suggestions", (override) => { let suggestions; let expected; + override(stream_topic_history_util, "get_server_history", () => {}); override(stream_data, "subscribed_streams", () => ["office"]); - override(narrow_state, "stream", () => "office"); const devel_id = 44; diff --git a/static/js/composebox_typeahead.js b/static/js/composebox_typeahead.js index b0464ac25e..a8072ff42b 100644 --- a/static/js/composebox_typeahead.js +++ b/static/js/composebox_typeahead.js @@ -21,6 +21,7 @@ import * as rows from "./rows"; import * as settings_data from "./settings_data"; import * as stream_data from "./stream_data"; import * as stream_topic_history from "./stream_topic_history"; +import * as stream_topic_history_util from "./stream_topic_history_util"; import * as timerender from "./timerender"; import * as typeahead_helper from "./typeahead_helper"; import * as user_groups from "./user_groups"; @@ -68,6 +69,9 @@ export function topics_seen_for(stream_name) { if (!stream_id) { return []; } + + // Fetch topic history from the server, in case we will need it soon. + stream_topic_history_util.get_server_history(stream_id, () => {}); const topic_names = stream_topic_history.get_recent_topic_names(stream_id); return topic_names; } diff --git a/static/js/search_suggestion.js b/static/js/search_suggestion.js index b8389e3232..ed531bd57a 100644 --- a/static/js/search_suggestion.js +++ b/static/js/search_suggestion.js @@ -9,6 +9,7 @@ import * as people from "./people"; import * as settings_data from "./settings_data"; import * as stream_data from "./stream_data"; import * as stream_topic_history from "./stream_topic_history"; +import * as stream_topic_history_util from "./stream_topic_history_util"; import * as typeahead_helper from "./typeahead_helper"; export const max_num_of_search_results = 12; @@ -341,6 +342,8 @@ function get_topic_suggestions(last, operators) { return []; } + // Fetch topic history from the server, in case we will need it. + stream_topic_history_util.get_server_history(stream_id, () => {}); let topics = stream_topic_history.get_recent_topic_names(stream_id); if (!topics || !topics.length) {