diff --git a/frontend_tests/node_tests/muting.js b/frontend_tests/node_tests/muting.js index ce5164316f..e199fb4c6d 100644 --- a/frontend_tests/node_tests/muting.js +++ b/frontend_tests/node_tests/muting.js @@ -2,6 +2,7 @@ const {strict: assert} = require("assert"); +const {visibility_policy} = require("../../static/js/user_topics"); const {zrequire} = require("../zjsunit/namespace"); const {run_test} = require("../zjsunit/test"); const blueslip = require("../zjsunit/zblueslip"); @@ -209,6 +210,64 @@ test("unknown streams", () => { ]); }); +test("set_user_topics", () => { + blueslip.expect("warn", "Unknown stream ID in set_user_topic: 999"); + + user_topics.set_muted_topics([]); + assert.ok(!user_topics.is_topic_muted(social.stream_id, "breakfast")); + assert.ok(!user_topics.is_topic_muted(design.stream_id, "typography")); + + const user_topic_events = [ + { + stream_id: social.stream_id, + topic_name: "breakfast", + last_updated: "1577836800", + visibility_policy: visibility_policy.MUTED, + }, + { + stream_id: design.stream_id, + topic_name: "typography", + last_updated: "1577836800", + visibility_policy: visibility_policy.MUTED, + }, + { + stream_id: 999, // BOGUS STREAM ID + topic_name: "random", + last_updated: "1577836800", + visibility_policy: visibility_policy.MUTED, + }, + ]; + + for (const user_topic of user_topic_events) { + user_topics.set_user_topic(user_topic); + } + + assert.deepEqual(user_topics.get_muted_topics().sort(), [ + { + date_muted: 1577836800000, + date_muted_str: "Jan\u00A001,\u00A02020", + stream: social.name, + stream_id: social.stream_id, + topic: "breakfast", + }, + { + date_muted: 1577836800000, + date_muted_str: "Jan\u00A001,\u00A02020", + stream: design.name, + stream_id: design.stream_id, + topic: "typography", + }, + ]); + + user_topics.set_user_topic({ + stream_id: design.stream_id, + topic_name: "typography", + last_updated: "1577836800", + visibility_policy: visibility_policy.VISIBILITY_POLICY_INHERIT, + }); + assert.ok(!user_topics.is_topic_muted(design.stream_id, "typography")); +}); + test("case_insensitivity", () => { user_topics.set_muted_topics([]); assert.ok(!user_topics.is_topic_muted(social.stream_id, "breakfast")); diff --git a/static/js/user_topics.js b/static/js/user_topics.js index a59a9073b1..125cbfe003 100644 --- a/static/js/user_topics.js +++ b/static/js/user_topics.js @@ -7,6 +7,13 @@ import {get_time_from_date_muted} from "./util"; const muted_topics = new Map(); +export const visibility_policy = { + VISIBILITY_POLICY_INHERIT: 0, + MUTED: 1, + UNMUTED: 2, + FOLLOWED: 3, +}; + export function add_muted_topic(stream_id, topic, date_muted) { let sub_dict = muted_topics.get(stream_id); if (!sub_dict) { @@ -51,6 +58,28 @@ export function get_muted_topics() { return topics; } +export function set_user_topic(user_topic) { + const stream_id = user_topic.stream_id; + const topic = user_topic.topic_name; + const date_muted = user_topic.last_updated; + + const stream_name = stream_data.maybe_get_stream_name(stream_id); + + if (!stream_name) { + blueslip.warn("Unknown stream ID in set_user_topic: " + stream_id); + return; + } + + switch (user_topic.visibility_policy) { + case visibility_policy.MUTED: + add_muted_topic(stream_id, topic, date_muted); + break; + case visibility_policy.VISIBILITY_POLICY_INHERIT: + remove_muted_topic(stream_id, topic); + break; + } +} + export function set_muted_topics(tuples) { muted_topics.clear();