11import $ from "jquery" ;
2+ import { z } from "zod" ;
23
34import render_topic_muted from "../templates/topic_muted.hbs" ;
45
@@ -15,7 +16,32 @@ import * as timerender from "./timerender";
1516import * as ui_report from "./ui_report" ;
1617import { 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
2046export 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
91122export 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