Skip to content

Commit a79704a

Browse files
Lalit3716freshpex
authored andcommitted
ts: Migrate user_topics.js to typescript.
1 parent 72b115f commit a79704a

File tree

2 files changed

+64
-31
lines changed

2 files changed

+64
-31
lines changed

Diff for: tools/test-js-with-node

+1-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ EXEMPT_FILES = make_set(
230230
"web/src/user_settings.ts",
231231
"web/src/user_status.js",
232232
"web/src/user_status_ui.js",
233-
"web/src/user_topics.js",
233+
"web/src/user_topics.ts",
234234
"web/src/user_topics_ui.js",
235235
"web/src/webpack_public_path.js",
236236
"web/src/zcommand.js",

Diff for: web/src/user_topics.js renamed to web/src/user_topics.ts

+63-30
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import $ from "jquery";
2+
import {z} from "zod";
23

34
import render_topic_muted from "../templates/topic_muted.hbs";
45

@@ -15,7 +16,32 @@ import * as timerender from "./timerender";
1516
import * as ui_report from "./ui_report";
1617
import {get_time_from_date_muted} from "./util";
1718

18-
const all_user_topics = new Map();
19+
type ServerUserTopic = z.infer<typeof user_topic_schema>;
20+
21+
export type UserTopic = {
22+
stream_id: number;
23+
stream: string | undefined;
24+
topic: string;
25+
date_updated: number;
26+
date_updated_str: string;
27+
visibility_policy: number;
28+
};
29+
30+
const user_topic_schema = z.object({
31+
stream_id: z.number(),
32+
topic_name: z.string(),
33+
last_updated: z.number(),
34+
visibility_policy: z.number(),
35+
stream__name: z.string().optional(),
36+
});
37+
38+
const all_user_topics = new Map<
39+
number,
40+
FoldDict<{
41+
date_updated: number;
42+
visibility_policy: number;
43+
}>
44+
>();
1945

2046
export const all_visibility_policies = {
2147
INHERIT: 0,
@@ -24,7 +50,12 @@ export const all_visibility_policies = {
2450
FOLLOWED: 3,
2551
};
2652

27-
export function update_user_topics(stream_id, topic, visibility_policy, date_updated) {
53+
export function update_user_topics(
54+
stream_id: number,
55+
topic: string,
56+
visibility_policy: number,
57+
date_updated: number,
58+
): void {
2859
let sub_dict = all_user_topics.get(stream_id);
2960
if (visibility_policy === all_visibility_policies.INHERIT && sub_dict) {
3061
sub_dict.delete(topic);
@@ -38,41 +69,41 @@ export function update_user_topics(stream_id, topic, visibility_policy, date_upd
3869
}
3970
}
4071

41-
export function get_topic_visibility_policy(stream_id, topic) {
72+
export function get_topic_visibility_policy(stream_id: number, topic: string): number | boolean {
4273
if (stream_id === undefined) {
4374
return false;
4475
}
4576
const sub_dict = all_user_topics.get(stream_id);
4677
if (sub_dict && sub_dict.get(topic)) {
47-
return sub_dict.get(topic).visibility_policy;
78+
return sub_dict.get(topic)!.visibility_policy;
4879
}
4980

5081
return all_visibility_policies.INHERIT;
5182
}
5283

53-
export function is_topic_followed(stream_id, topic) {
84+
export function is_topic_followed(stream_id: number, topic: string): boolean {
5485
return get_topic_visibility_policy(stream_id, topic) === all_visibility_policies.FOLLOWED;
5586
}
5687

57-
export function is_topic_unmuted(stream_id, topic) {
88+
export function is_topic_unmuted(stream_id: number, topic: string): boolean {
5889
return get_topic_visibility_policy(stream_id, topic) === all_visibility_policies.UNMUTED;
5990
}
6091

61-
export function is_topic_muted(stream_id, topic) {
92+
export function is_topic_muted(stream_id: number, topic: string): boolean {
6293
return get_topic_visibility_policy(stream_id, topic) === all_visibility_policies.MUTED;
6394
}
6495

65-
export function is_topic_unmuted_or_followed(stream_id, topic) {
96+
export function is_topic_unmuted_or_followed(stream_id: number, topic: string): boolean {
6697
return is_topic_unmuted(stream_id, topic) || is_topic_followed(stream_id, topic);
6798
}
6899

69-
export function get_user_topics_for_visibility_policy(visibility_policy) {
70-
const topics = [];
100+
export function get_user_topics_for_visibility_policy(visibility_policy: number): UserTopic[] {
101+
const topics: UserTopic[] = [];
71102
for (const [stream_id, sub_dict] of all_user_topics) {
72103
const stream = sub_store.maybe_get_stream_name(stream_id);
73104
for (const topic of sub_dict.keys()) {
74-
if (sub_dict.get(topic).visibility_policy === visibility_policy) {
75-
const date_updated = sub_dict.get(topic).date_updated;
105+
if (sub_dict.get(topic)!.visibility_policy === visibility_policy) {
106+
const date_updated = sub_dict.get(topic)!.date_updated;
76107
const date_updated_str = timerender.render_now(new Date(date_updated)).time_str;
77108
topics.push({
78109
stream_id,
@@ -89,27 +120,27 @@ export function get_user_topics_for_visibility_policy(visibility_policy) {
89120
}
90121

91122
export function set_user_topic_visibility_policy(
92-
stream_id,
93-
topic,
94-
visibility_policy,
95-
from_hotkey,
96-
from_banner,
97-
status_element,
98-
) {
123+
stream_id: number,
124+
topic: string,
125+
visibility_policy: number,
126+
from_hotkey?: boolean,
127+
from_banner?: boolean,
128+
status_element?: JQuery,
129+
): void {
99130
const data = {
100131
stream_id,
101132
topic,
102133
visibility_policy,
103134
};
104135

105-
let $spinner;
136+
let $spinner: JQuery;
106137
if (status_element) {
107138
$spinner = $(status_element).expectOne();
108139
$spinner.fadeTo(0, 1);
109140
loading.make_indicator($spinner, {text: settings_ui.strings.saving});
110141
}
111142

112-
channel.post({
143+
void channel.post({
113144
url: "/json/user_topics",
114145
data,
115146
success() {
@@ -146,9 +177,9 @@ export function set_user_topic_visibility_policy(
146177
const stream_name = sub_store.maybe_get_stream_name(stream_id);
147178
feedback_widget.show({
148179
populate($container) {
149-
const rendered_html = render_topic_muted();
180+
const rendered_html = render_topic_muted({});
150181
$container.html(rendered_html);
151-
$container.find(".stream").text(stream_name);
182+
$container.find(".stream").text(stream_name ?? "");
152183
$container.find(".topic").text(topic);
153184
},
154185
on_undo() {
@@ -166,13 +197,13 @@ export function set_user_topic_visibility_policy(
166197
});
167198
}
168199

169-
export function set_visibility_policy_for_element($elt, visibility_policy) {
170-
const stream_id = Number.parseInt($elt.attr("data-stream-id"), 10);
171-
const topic = $elt.attr("data-topic-name");
200+
export function set_visibility_policy_for_element($elt: JQuery, visibility_policy: number): void {
201+
const stream_id = Number.parseInt($elt.attr("data-stream-id")!, 10);
202+
const topic = $elt.attr("data-topic-name")!;
172203
set_user_topic_visibility_policy(stream_id, topic, visibility_policy);
173204
}
174205

175-
export function set_user_topic(user_topic) {
206+
export function set_user_topic(user_topic: ServerUserTopic): void {
176207
const stream_id = user_topic.stream_id;
177208
const topic = user_topic.topic_name;
178209
const date_updated = user_topic.last_updated;
@@ -187,14 +218,16 @@ export function set_user_topic(user_topic) {
187218
update_user_topics(stream_id, topic, user_topic.visibility_policy, date_updated);
188219
}
189220

190-
export function set_user_topics(user_topics) {
221+
export function set_user_topics(user_topics: ServerUserTopic[]): void {
191222
all_user_topics.clear();
192223

193224
for (const user_topic of user_topics) {
194225
set_user_topic(user_topic);
195226
}
196227
}
197228

198-
export function initialize(params) {
199-
set_user_topics(params.user_topics);
229+
export function initialize(params: {user_topics: ServerUserTopic[]}): void {
230+
const user_topics = user_topic_schema.array().parse(params.user_topics);
231+
232+
set_user_topics(user_topics);
200233
}

0 commit comments

Comments
 (0)