zulip/web/src/stream_create_subscribers.js
Anders Kaseorg e96ede0ef6 page_params: Split out state data for current user.
For spectators, the chunk of page_params that originates from
do_events_register isn’t assigned until ui_init.js.  That means the
TypeScript type of page_params is mostly a lie during module load
time: reading a parameter too early silently results in undefined
rather than the declared type, with unpredictable results later on.

We want to make such an early read into an immediate runtime error,
for both users and spectators consistently, and pave the way for
runtime validation of the page_params type.  As a first step, split
out the subset of fields that pertain to the current user.

Signed-off-by: Anders Kaseorg <[email protected]>
2024-02-15 10:22:52 -08:00

125 lines
4.3 KiB
JavaScript

import $ from "jquery";
import render_new_stream_user from "../templates/stream_settings/new_stream_user.hbs";
import render_new_stream_users from "../templates/stream_settings/new_stream_users.hbs";
import * as add_subscribers_pill from "./add_subscribers_pill";
import * as ListWidget from "./list_widget";
import * as people from "./people";
import {current_user} from "./state_data";
import * as stream_create_subscribers_data from "./stream_create_subscribers_data";
import * as user_sort from "./user_sort";
let pill_widget;
let all_users_list_widget;
export function get_principals() {
return stream_create_subscribers_data.get_principals();
}
function redraw_subscriber_list() {
all_users_list_widget.replace_list_data(stream_create_subscribers_data.sorted_user_ids());
}
function add_user_ids(user_ids) {
stream_create_subscribers_data.add_user_ids(user_ids);
redraw_subscriber_list();
}
function add_all_users() {
const user_ids = stream_create_subscribers_data.get_all_user_ids();
add_user_ids(user_ids);
}
function remove_user_ids(user_ids) {
stream_create_subscribers_data.remove_user_ids(user_ids);
redraw_subscriber_list();
}
function build_pill_widget({$parent_container}) {
const $pill_container = $parent_container.find(".pill-container");
const get_potential_subscribers = stream_create_subscribers_data.get_potential_subscribers;
pill_widget = add_subscribers_pill.create({$pill_container, get_potential_subscribers});
}
export function create_handlers($container) {
$container.on("click", ".add_all_users_to_stream", (e) => {
e.preventDefault();
add_all_users();
$(".add-user-list-filter").trigger("focus");
});
$container.on("click", ".remove_potential_subscriber", (e) => {
e.preventDefault();
const $elem = $(e.target);
const user_id = Number.parseInt($elem.attr("data-user-id"), 10);
remove_user_ids([user_id]);
});
const button_selector = ".add_subscribers_container button.add-subscriber-button";
function add_users({pill_user_ids}) {
add_user_ids(pill_user_ids);
// eslint-disable-next-line unicorn/no-array-callback-reference
const $pill_widget_button = $container.find(button_selector);
$pill_widget_button.prop("disabled", true);
pill_widget.clear();
}
add_subscribers_pill.set_up_handlers({
get_pill_widget: () => pill_widget,
$parent_container: $container,
pill_selector: ".add_subscribers_container .input",
button_selector,
action: add_users,
});
}
export function build_widgets() {
const $add_people_container = $("#people_to_add");
$add_people_container.html(render_new_stream_users({}));
const $simplebar_container = $add_people_container.find(".subscriber_list_container");
build_pill_widget({$parent_container: $add_people_container});
stream_create_subscribers_data.initialize_with_current_user();
const current_user_id = current_user.user_id;
all_users_list_widget = ListWidget.create($("#create_stream_subscribers"), [current_user_id], {
name: "new_stream_add_users",
get_item: people.get_by_user_id,
$parent_container: $add_people_container,
modifier_html(user) {
const item = {
email: user.delivery_email,
user_id: user.user_id,
full_name: user.full_name,
is_current_user: user.user_id === current_user_id,
disabled: stream_create_subscribers_data.must_be_subscribed(user.user_id),
};
return render_new_stream_user(item);
},
sort_fields: {
email: user_sort.sort_email,
id: user_sort.sort_user_id,
...ListWidget.generic_sort_functions("alphabetic", ["full_name"]),
},
filter: {
$element: $("#people_to_add .add-user-list-filter"),
predicate(user, search_term) {
return people.build_person_matcher(search_term)(user);
},
},
$simplebar_container,
html_selector(user) {
return $(`#${CSS.escape("user_checkbox_" + user.user_id)}`);
},
});
}
export function add_user_id_to_new_stream(user_id) {
// This is only used by puppeteer tests.
add_user_ids([user_id]);
}