Files
zulip/static/js/settings_data.ts
Ganesh Pawar fa928d5cd1 streams: Split setting for stream creation policy.
Users wanted a feature where they could specify
which users can create public streams and which users can
create private streams.

This splits stream creation code into two parts,
public and private stream creation.

Fixes #17009.
2021-10-01 10:26:42 -07:00

224 lines
6.4 KiB
TypeScript

import {page_params} from "./page_params";
import * as settings_config from "./settings_config";
import {user_settings} from "./user_settings";
let user_join_date: Date;
export function initialize(current_user_join_date: Date): void {
// We keep the `user_join_date` as the present day's date if the user is a spectator
user_join_date = current_user_join_date;
}
/*
This is a close cousin of settings_config,
but this has a bit more logic, and we
ensure 100% line coverage on it.
Our main goal with this code is to isolate
some key modules from having to know
about page_params and settings_config details.
*/
function user_can_access_delivery_email(): boolean {
// This function checks whether the current user should expect to
// see .delivery_email fields on user objects that it can access.
//
// If false, either everyone has access to emails (and there is no
// delivery_email field for anyone) or this user does not have
// access to emails (and this client will never receive a user
// object with a delivery_email field).
if (
page_params.realm_email_address_visibility ===
settings_config.email_address_visibility_values.admins_only.code
) {
return page_params.is_admin;
}
if (
page_params.realm_email_address_visibility ===
settings_config.email_address_visibility_values.moderators.code
) {
return page_params.is_admin || page_params.is_moderator;
}
return false;
}
export function show_email(): boolean {
if (
page_params.realm_email_address_visibility ===
settings_config.email_address_visibility_values.everyone.code
) {
return true;
}
return user_can_access_delivery_email();
}
// TODO: Move this to people when converting it
// to TypeScript.
interface Person {
delivery_email: string;
email: string;
}
export function email_for_user_settings(person: Person): string | undefined {
if (!show_email()) {
return undefined;
}
if (person.delivery_email && user_can_access_delivery_email()) {
return person.delivery_email;
}
return person.email;
}
export function get_time_preferences(user_timezone: string): {
timezone: string;
format: string;
} {
if (user_settings.twenty_four_hour_time) {
return {
timezone: user_timezone,
format: "H:mm",
};
}
return {
timezone: user_timezone,
format: "h:mm a",
};
}
export function user_can_change_name(): boolean {
if (page_params.is_admin) {
return true;
}
if (page_params.realm_name_changes_disabled || page_params.server_name_changes_disabled) {
return false;
}
return true;
}
export function user_can_change_avatar(): boolean {
if (page_params.is_admin) {
return true;
}
if (page_params.realm_avatar_changes_disabled || page_params.server_avatar_changes_disabled) {
return false;
}
return true;
}
export function user_can_change_logo(): boolean {
return page_params.is_admin && page_params.zulip_plan_is_not_limited;
}
function user_has_permission(policy_value: number): boolean {
if (page_params.is_admin) {
return true;
}
if (page_params.is_spectator) {
return false;
}
/* At present, by_everyone is not present in common_policy_values,
* but we include a check for it here, so that code using
* common_message_policy_values or other supersets can use this function. */
if (policy_value === settings_config.common_message_policy_values.by_everyone.code) {
return true;
}
if (page_params.is_guest) {
return false;
}
if (policy_value === settings_config.common_policy_values.by_admins_only.code) {
return false;
}
if (page_params.is_moderator) {
return true;
}
if (policy_value === settings_config.common_policy_values.by_moderators_only.code) {
return false;
}
if (policy_value === settings_config.common_policy_values.by_members.code) {
return true;
}
const current_datetime = new Date();
const person_date_joined = new Date(user_join_date);
const user_join_days =
(current_datetime.getTime() - person_date_joined.getTime()) / 1000 / 86400;
return user_join_days >= page_params.realm_waiting_period_threshold;
}
export function user_can_invite_others_to_realm(): boolean {
if (
page_params.realm_invite_to_realm_policy ===
settings_config.invite_to_realm_policy_values.nobody.code
) {
return false;
}
return user_has_permission(page_params.realm_invite_to_realm_policy);
}
export function user_can_subscribe_other_users(): boolean {
return user_has_permission(page_params.realm_invite_to_stream_policy);
}
export function user_can_unsubscribe_other_users(): boolean {
return page_params.is_admin;
}
export function user_can_create_private_streams(): boolean {
return user_has_permission(page_params.realm_create_private_stream_policy);
}
export function user_can_create_public_streams(): boolean {
return user_has_permission(page_params.realm_create_public_stream_policy);
}
export function user_can_move_messages_between_streams(): boolean {
return user_has_permission(page_params.realm_move_messages_between_streams_policy);
}
export function user_can_edit_user_groups(): boolean {
return user_has_permission(page_params.realm_user_group_edit_policy);
}
export function user_can_add_custom_emoji(): boolean {
return user_has_permission(page_params.realm_add_custom_emoji_policy);
}
export function user_can_edit_topic_of_any_message(): boolean {
if (
page_params.realm_edit_topic_policy ===
settings_config.common_message_policy_values.by_everyone.code
) {
return true;
}
return user_has_permission(page_params.realm_edit_topic_policy);
}
export function user_can_delete_own_message(): boolean {
return user_has_permission(page_params.realm_delete_own_message_policy);
}
export function using_dark_theme(): boolean {
if (user_settings.color_scheme === settings_config.color_scheme_values.night.code) {
return true;
}
if (
user_settings.color_scheme === settings_config.color_scheme_values.automatic.code &&
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
) {
return true;
}
return false;
}