mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 15:03:34 +00:00
user_events: Convert module to TypeScript (#32658)
This commit is contained in:
@@ -268,7 +268,7 @@ EXEMPT_FILES = make_set(
|
|||||||
"web/src/upload_widget.ts",
|
"web/src/upload_widget.ts",
|
||||||
"web/src/user_card_popover.ts",
|
"web/src/user_card_popover.ts",
|
||||||
"web/src/user_deactivation_ui.ts",
|
"web/src/user_deactivation_ui.ts",
|
||||||
"web/src/user_events.js",
|
"web/src/user_events.ts",
|
||||||
"web/src/user_group_components.ts",
|
"web/src/user_group_components.ts",
|
||||||
"web/src/user_group_create.ts",
|
"web/src/user_group_create.ts",
|
||||||
"web/src/user_group_create_members.ts",
|
"web/src/user_group_create_members.ts",
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export function update_user_full_name(user_id: number, full_name: string): void
|
|||||||
rerender_messages_view_for_user(user_id);
|
rerender_messages_view_for_user(user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function update_avatar(user_id: number, avatar_url: string): void {
|
export function update_avatar(user_id: number, avatar_url: string | null): void {
|
||||||
message_store.update_small_avatar_url(user_id, avatar_url);
|
message_store.update_small_avatar_url(user_id, avatar_url);
|
||||||
rerender_messages_view_for_user(user_id);
|
rerender_messages_view_for_user(user_id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ export type Message = (
|
|||||||
// `convert_raw_message_to_message_with_booleans`
|
// `convert_raw_message_to_message_with_booleans`
|
||||||
flags?: string[];
|
flags?: string[];
|
||||||
|
|
||||||
small_avatar_url?: string; // Used in `message_avatar.hbs`
|
small_avatar_url?: string | null; // Used in `message_avatar.hbs`
|
||||||
status_emoji_info?: UserStatusEmojiInfo | undefined; // Used in `message_body.hbs`
|
status_emoji_info?: UserStatusEmojiInfo | undefined; // Used in `message_body.hbs`
|
||||||
|
|
||||||
local_edit_timestamp?: number; // Used for edited messages
|
local_edit_timestamp?: number; // Used for edited messages
|
||||||
@@ -305,7 +305,7 @@ export function update_sender_full_name(user_id: number, new_name: string): void
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function update_small_avatar_url(user_id: number, new_url: string): void {
|
export function update_small_avatar_url(user_id: number, new_url: string | null): void {
|
||||||
for (const msg of stored_messages.values()) {
|
for (const msg of stored_messages.values()) {
|
||||||
if (msg.sender_id && msg.sender_id === user_id) {
|
if (msg.sender_id && msg.sender_id === user_id) {
|
||||||
msg.small_avatar_url = new_url;
|
msg.small_avatar_url = new_url;
|
||||||
|
|||||||
@@ -1664,7 +1664,7 @@ export function set_full_name(person_obj: User, new_full_name: string): void {
|
|||||||
|
|
||||||
export function set_custom_profile_field_data(
|
export function set_custom_profile_field_data(
|
||||||
user_id: number,
|
user_id: number,
|
||||||
field: {id: number} & ProfileDatum,
|
field: {id: number; value: string | null; rendered_value?: string},
|
||||||
): void {
|
): void {
|
||||||
if (field.id === undefined) {
|
if (field.id === undefined) {
|
||||||
blueslip.error("Trying to set undefined field id");
|
blueslip.error("Trying to set undefined field id");
|
||||||
@@ -1672,10 +1672,15 @@ export function set_custom_profile_field_data(
|
|||||||
}
|
}
|
||||||
const person = get_by_user_id(user_id);
|
const person = get_by_user_id(user_id);
|
||||||
assert(person.profile_data !== undefined);
|
assert(person.profile_data !== undefined);
|
||||||
|
if (field.value === null) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
||||||
|
delete person.profile_data[field.id];
|
||||||
|
} else {
|
||||||
person.profile_data[field.id] = {
|
person.profile_data[field.id] = {
|
||||||
value: field.value,
|
value: field.value,
|
||||||
rendered_value: field.rendered_value,
|
rendered_value: field.rendered_value,
|
||||||
};
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function is_current_user(email?: string | null): boolean {
|
export function is_current_user(email?: string | null): boolean {
|
||||||
@@ -1704,7 +1709,7 @@ export function my_current_user_id(): number {
|
|||||||
return my_user_id;
|
return my_user_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function my_custom_profile_data(field_id: number): ProfileDatum | null | undefined {
|
export function my_custom_profile_data(field_id: number): ProfileDatum | undefined {
|
||||||
if (field_id === undefined) {
|
if (field_id === undefined) {
|
||||||
blueslip.error("Undefined field id");
|
blueslip.error("Undefined field id");
|
||||||
return undefined;
|
return undefined;
|
||||||
@@ -1715,23 +1720,19 @@ export function my_custom_profile_data(field_id: number): ProfileDatum | null |
|
|||||||
export function get_custom_profile_data(
|
export function get_custom_profile_data(
|
||||||
user_id: number,
|
user_id: number,
|
||||||
field_id: number,
|
field_id: number,
|
||||||
): ProfileDatum | null | undefined {
|
): ProfileDatum | undefined {
|
||||||
const person = get_by_user_id(user_id);
|
const person = get_by_user_id(user_id);
|
||||||
const profile_data = person.profile_data;
|
return person.profile_data?.[field_id];
|
||||||
if (profile_data === undefined) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return profile_data[field_id];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function get_custom_fields_by_type(
|
export function get_custom_fields_by_type(
|
||||||
user_id: number,
|
user_id: number,
|
||||||
field_type: number,
|
field_type: number,
|
||||||
): (ProfileDatum | undefined)[] | null {
|
): (ProfileDatum | undefined)[] | undefined {
|
||||||
const person = get_by_user_id(user_id);
|
const person = get_by_user_id(user_id);
|
||||||
const profile_data = person.profile_data;
|
const profile_data = person.profile_data;
|
||||||
if (profile_data === undefined) {
|
if (profile_data === undefined) {
|
||||||
return null;
|
return undefined;
|
||||||
}
|
}
|
||||||
const filteredProfileData: (ProfileDatum | undefined)[] = [];
|
const filteredProfileData: (ProfileDatum | undefined)[] = [];
|
||||||
for (const field of realm.custom_profile_fields) {
|
for (const field of realm.custom_profile_fields) {
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ import * as theme from "./theme.ts";
|
|||||||
import * as typing_events from "./typing_events.ts";
|
import * as typing_events from "./typing_events.ts";
|
||||||
import * as unread_ops from "./unread_ops.ts";
|
import * as unread_ops from "./unread_ops.ts";
|
||||||
import * as unread_ui from "./unread_ui.ts";
|
import * as unread_ui from "./unread_ui.ts";
|
||||||
import * as user_events from "./user_events.js";
|
import * as user_events from "./user_events.ts";
|
||||||
import * as user_group_edit from "./user_group_edit.ts";
|
import * as user_group_edit from "./user_group_edit.ts";
|
||||||
import * as user_groups from "./user_groups.ts";
|
import * as user_groups from "./user_groups.ts";
|
||||||
import {user_settings} from "./user_settings.ts";
|
import {user_settings} from "./user_settings.ts";
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ function delete_profile_field(this: HTMLElement, e: JQuery.ClickEvent): void {
|
|||||||
|
|
||||||
for (const user_id of active_user_ids) {
|
for (const user_id of active_user_ids) {
|
||||||
const user_profile_data = people.get_custom_profile_data(user_id, profile_field_id);
|
const user_profile_data = people.get_custom_profile_data(user_id, profile_field_id);
|
||||||
if (user_profile_data) {
|
if (user_profile_data !== undefined) {
|
||||||
users_using_deleting_profile_field += 1;
|
users_using_deleting_profile_field += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -327,7 +327,7 @@ function show_modal_for_deleting_options(
|
|||||||
let users_count_with_deleted_option_selected = 0;
|
let users_count_with_deleted_option_selected = 0;
|
||||||
for (const user_id of active_user_ids) {
|
for (const user_id of active_user_ids) {
|
||||||
const field_value = people.get_custom_profile_data(user_id, field.id);
|
const field_value = people.get_custom_profile_data(user_id, field.id);
|
||||||
if (field_value && deleted_values[field_value.value]) {
|
if (field_value !== undefined && deleted_values[field_value.value]) {
|
||||||
users_count_with_deleted_option_selected += 1;
|
users_count_with_deleted_option_selected += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
// dependencies that existed when this code was in people.js.
|
// dependencies that existed when this code was in people.js.
|
||||||
// (We should do bot updates here too.)
|
// (We should do bot updates here too.)
|
||||||
import $ from "jquery";
|
import $ from "jquery";
|
||||||
|
import assert from "minimalistic-assert";
|
||||||
|
|
||||||
import * as activity_ui from "./activity_ui.ts";
|
import * as activity_ui from "./activity_ui.ts";
|
||||||
import * as blueslip from "./blueslip.ts";
|
import * as blueslip from "./blueslip.ts";
|
||||||
@@ -28,7 +29,31 @@ import * as stream_events from "./stream_events.ts";
|
|||||||
import * as user_group_edit from "./user_group_edit.ts";
|
import * as user_group_edit from "./user_group_edit.ts";
|
||||||
import * as user_profile from "./user_profile.ts";
|
import * as user_profile from "./user_profile.ts";
|
||||||
|
|
||||||
export const update_person = function update(person) {
|
type UserUpdate = {user_id: number} & (
|
||||||
|
| {
|
||||||
|
avatar_source: string;
|
||||||
|
avatar_url: string | null;
|
||||||
|
avatar_url_medium: string | null;
|
||||||
|
avatar_version: number;
|
||||||
|
}
|
||||||
|
| {bot_owner_id: number}
|
||||||
|
| {
|
||||||
|
custom_profile_field: {
|
||||||
|
id: number;
|
||||||
|
value: string | null;
|
||||||
|
rendered_value?: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
| {delivery_email: string | null}
|
||||||
|
| {new_email: string}
|
||||||
|
| {full_name: string}
|
||||||
|
| {is_billing_admin: boolean}
|
||||||
|
| {role: number}
|
||||||
|
| {email: string; timezone: string}
|
||||||
|
| {is_active: boolean}
|
||||||
|
);
|
||||||
|
|
||||||
|
export const update_person = function update(person: UserUpdate): void {
|
||||||
const person_obj = people.maybe_get_user_by_id(person.user_id);
|
const person_obj = people.maybe_get_user_by_id(person.user_id);
|
||||||
|
|
||||||
if (!person_obj) {
|
if (!person_obj) {
|
||||||
@@ -36,7 +61,7 @@ export const update_person = function update(person) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "new_email")) {
|
if ("new_email" in person) {
|
||||||
const user_id = person.user_id;
|
const user_id = person.user_id;
|
||||||
const new_email = person.new_email;
|
const new_email = person.new_email;
|
||||||
|
|
||||||
@@ -49,18 +74,19 @@ export const update_person = function update(person) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "delivery_email")) {
|
if ("delivery_email" in person) {
|
||||||
const delivery_email = person.delivery_email;
|
const delivery_email = person.delivery_email;
|
||||||
person_obj.delivery_email = delivery_email;
|
person_obj.delivery_email = delivery_email;
|
||||||
user_profile.update_profile_modal_ui(person_obj, person);
|
user_profile.update_profile_modal_ui(person_obj, person);
|
||||||
if (people.is_my_user_id(person.user_id)) {
|
if (people.is_my_user_id(person.user_id)) {
|
||||||
|
assert(delivery_email !== null);
|
||||||
settings_account.update_email(delivery_email);
|
settings_account.update_email(delivery_email);
|
||||||
current_user.delivery_email = delivery_email;
|
current_user.delivery_email = delivery_email;
|
||||||
settings_account.hide_confirm_email_banner();
|
settings_account.hide_confirm_email_banner();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "full_name")) {
|
if ("full_name" in person) {
|
||||||
people.set_full_name(person_obj, person.full_name);
|
people.set_full_name(person_obj, person.full_name);
|
||||||
|
|
||||||
settings_users.update_user_data(person.user_id, person);
|
settings_users.update_user_data(person.user_id, person);
|
||||||
@@ -74,7 +100,7 @@ export const update_person = function update(person) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "role")) {
|
if ("role" in person) {
|
||||||
person_obj.role = person.role;
|
person_obj.role = person.role;
|
||||||
person_obj.is_owner = person.role === settings_config.user_role_values.owner.code;
|
person_obj.is_owner = person.role === settings_config.user_role_values.owner.code;
|
||||||
person_obj.is_admin =
|
person_obj.is_admin =
|
||||||
@@ -111,14 +137,14 @@ export const update_person = function update(person) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "is_billing_admin")) {
|
if ("is_billing_admin" in person) {
|
||||||
person_obj.is_billing_admin = person.is_billing_admin;
|
person_obj.is_billing_admin = person.is_billing_admin;
|
||||||
if (people.is_my_user_id(person.user_id)) {
|
if (people.is_my_user_id(person.user_id)) {
|
||||||
current_user.is_billing_admin = person_obj.is_billing_admin;
|
current_user.is_billing_admin = person_obj.is_billing_admin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "avatar_url")) {
|
if ("avatar_url" in person) {
|
||||||
const url = person.avatar_url;
|
const url = person.avatar_url;
|
||||||
person_obj.avatar_url = url;
|
person_obj.avatar_url = url;
|
||||||
person_obj.avatar_version = person.avatar_version;
|
person_obj.avatar_version = person.avatar_version;
|
||||||
@@ -135,7 +161,7 @@ export const update_person = function update(person) {
|
|||||||
user_profile.update_profile_modal_ui(person_obj, person);
|
user_profile.update_profile_modal_ui(person_obj, person);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "custom_profile_field")) {
|
if ("custom_profile_field" in person) {
|
||||||
people.set_custom_profile_field_data(person.user_id, person.custom_profile_field);
|
people.set_custom_profile_field_data(person.user_id, person.custom_profile_field);
|
||||||
user_profile.update_user_custom_profile_fields(person_obj);
|
user_profile.update_user_custom_profile_fields(person_obj);
|
||||||
if (person.user_id === people.my_current_user_id()) {
|
if (person.user_id === people.my_current_user_id()) {
|
||||||
@@ -148,7 +174,7 @@ export const update_person = function update(person) {
|
|||||||
)?.required;
|
)?.required;
|
||||||
if (is_field_required) {
|
if (is_field_required) {
|
||||||
const $custom_user_field = $(
|
const $custom_user_field = $(
|
||||||
`.profile-settings-form .custom_user_field[data-field-id="${CSS.escape(field_id)}"]`,
|
`.profile-settings-form .custom_user_field[data-field-id="${CSS.escape(`${field_id}`)}"]`,
|
||||||
);
|
);
|
||||||
const $field = $custom_user_field.find(".settings-profile-user-field");
|
const $field = $custom_user_field.find(".settings-profile-user-field");
|
||||||
const $required_symbol = $custom_user_field.find(".required-symbol");
|
const $required_symbol = $custom_user_field.find(".required-symbol");
|
||||||
@@ -167,16 +193,17 @@ export const update_person = function update(person) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "timezone")) {
|
if ("timezone" in person) {
|
||||||
person_obj.timezone = person.timezone;
|
person_obj.timezone = person.timezone;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "bot_owner_id")) {
|
if ("bot_owner_id" in person) {
|
||||||
|
assert(person_obj.is_bot);
|
||||||
person_obj.bot_owner_id = person.bot_owner_id;
|
person_obj.bot_owner_id = person.bot_owner_id;
|
||||||
user_profile.update_profile_modal_ui(person_obj, person);
|
user_profile.update_profile_modal_ui(person_obj, person);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(person, "is_active")) {
|
if ("is_active" in person) {
|
||||||
if (person.is_active) {
|
if (person.is_active) {
|
||||||
people.add_active_user(person_obj);
|
people.add_active_user(person_obj);
|
||||||
settings_users.update_view_on_reactivate(person.user_id);
|
settings_users.update_view_on_reactivate(person.user_id);
|
||||||
@@ -137,9 +137,9 @@ export function update_profile_modal_ui(
|
|||||||
user: User,
|
user: User,
|
||||||
new_data: {
|
new_data: {
|
||||||
user_id?: number;
|
user_id?: number;
|
||||||
bot_owner_id?: string;
|
bot_owner_id?: number;
|
||||||
avatar_url?: string;
|
avatar_url?: string | null;
|
||||||
delivery_email?: string;
|
delivery_email?: string | null;
|
||||||
role?: number;
|
role?: number;
|
||||||
full_name?: string;
|
full_name?: string;
|
||||||
},
|
},
|
||||||
@@ -166,7 +166,7 @@ export function update_profile_modal_ui(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (new_data.delivery_email !== undefined) {
|
if (new_data.delivery_email !== undefined) {
|
||||||
$("#email").find(".value").text(new_data.delivery_email);
|
$("#email .value").text(new_data.delivery_email ?? "");
|
||||||
}
|
}
|
||||||
if (new_data.role !== undefined && !user.is_bot) {
|
if (new_data.role !== undefined && !user.is_bot) {
|
||||||
const user_type = settings_config.user_role_map.get(new_data.role);
|
const user_type = settings_config.user_role_map.get(new_data.role);
|
||||||
@@ -397,7 +397,7 @@ export function get_custom_profile_field_data(
|
|||||||
const field_value = people.get_custom_profile_data(user.user_id, field.id);
|
const field_value = people.get_custom_profile_data(user.user_id, field.id);
|
||||||
const field_type = field.type;
|
const field_type = field.type;
|
||||||
|
|
||||||
if (!field_value) {
|
if (field_value === undefined) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
if (!field_value.value) {
|
if (!field_value.value) {
|
||||||
|
|||||||
@@ -636,7 +636,7 @@ test_people("bot_custom_profile_data", () => {
|
|||||||
// http://localhost:9991/#organization/bot-list-admin
|
// http://localhost:9991/#organization/bot-list-admin
|
||||||
// and then try to edit any of the bots.
|
// and then try to edit any of the bots.
|
||||||
people.add_active_user(bot_botson);
|
people.add_active_user(bot_botson);
|
||||||
assert.equal(people.get_custom_profile_data(bot_botson.user_id, 3), null);
|
assert.equal(people.get_custom_profile_data(bot_botson.user_id, 3), undefined);
|
||||||
});
|
});
|
||||||
|
|
||||||
test_people("user_timezone", ({override}) => {
|
test_people("user_timezone", ({override}) => {
|
||||||
@@ -718,14 +718,15 @@ test_people("set_custom_profile_field_data", () => {
|
|||||||
person.profile_data = {};
|
person.profile_data = {};
|
||||||
const field = {
|
const field = {
|
||||||
id: 3,
|
id: 3,
|
||||||
name: "Custom long field",
|
|
||||||
type: "text",
|
|
||||||
value: "Field value",
|
value: "Field value",
|
||||||
rendered_value: "<p>Field value</p>",
|
rendered_value: "<p>Field value</p>",
|
||||||
};
|
};
|
||||||
people.set_custom_profile_field_data(person.user_id, field);
|
people.set_custom_profile_field_data(person.user_id, field);
|
||||||
assert.equal(person.profile_data[field.id].value, "Field value");
|
assert.equal(person.profile_data[field.id].value, "Field value");
|
||||||
assert.equal(person.profile_data[field.id].rendered_value, "<p>Field value</p>");
|
assert.equal(person.profile_data[field.id].rendered_value, "<p>Field value</p>");
|
||||||
|
|
||||||
|
people.set_custom_profile_field_data(person.user_id, {id: 3, value: null});
|
||||||
|
assert.ok(!(field.id in person.profile_data));
|
||||||
});
|
});
|
||||||
|
|
||||||
test_people("is_current_user_only_owner", ({override}) => {
|
test_people("is_current_user_only_owner", ({override}) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user