Files
zulip/static/js/user_pill.js
YashRE42 fa7c8f8c32 status_emoji: Show status emoji in compose_pm pills.
Previously the emoji_status set by the user would only be seen in a
few places, it was decided that it would be useful to show the
emoji_status in a couple of other additional places as well.

As such this commit uses the status_emoji template to show the status
emoji in the compose_pm pills. Due to the fact that we use the same
pills system to render in the user_group, we need to add a
conditional to prevent rendering there since the user status is not
valuable there.

Status emoji changes do not live update these, but neither do user
renames, so there's bigger problems if that's a concern.
2022-02-11 13:30:08 -08:00

142 lines
4.0 KiB
JavaScript

import * as blueslip from "./blueslip";
import * as input_pill from "./input_pill";
import {page_params} from "./page_params";
import * as people from "./people";
import * as user_status from "./user_status";
// This will be used for pills for things like composing PMs
// or adding users to a stream/group.
export function create_item_from_email(email, current_items) {
// For normal Zulip use, we need to validate the email for our realm.
const user = people.get_by_email(email);
if (!user) {
if (page_params.realm_is_zephyr_mirror_realm) {
const existing_emails = current_items.map((item) => item.email);
if (existing_emails.includes(email)) {
return undefined;
}
// For Zephyr we can't assume any emails are invalid,
// so we just create a pill where the display value
// is the email itself.
return {
type: "user",
display_value: email,
email,
};
}
// The email is not allowed, so return.
return undefined;
}
const existing_ids = current_items.map((item) => item.user_id);
if (existing_ids.includes(user.user_id)) {
return undefined;
}
const avatar_url = people.small_avatar_url_for_person(user);
const status_emoji_info = user_status.get_status_emoji(user.user_id);
// We must supply display_value for the widget to work. Everything
// else is for our own use in callbacks.
const item = {
type: "user",
display_value: user.full_name,
user_id: user.user_id,
email: user.email,
img_src: avatar_url,
deactivated: false,
status_emoji_info,
};
// We pass deactivated true for a deactivated user
if (!people.is_person_active(user.user_id)) {
item.deactivated = true;
item.display_value = user.full_name + " (deactivated)";
}
return item;
}
export function get_email_from_item(item) {
return item.email;
}
export function append_person(opts) {
const person = opts.person;
const pill_widget = opts.pill_widget;
const avatar_url = people.small_avatar_url_for_person(person);
const status_emoji_info = user_status.get_status_emoji(opts.person.user_id);
const pill_data = {
type: "user",
display_value: person.full_name,
user_id: person.user_id,
email: person.email,
img_src: avatar_url,
status_emoji_info,
};
pill_widget.appendValidatedData(pill_data);
pill_widget.clear_text();
}
export function get_user_ids(pill_widget) {
const items = pill_widget.items();
let user_ids = items.map((item) => item.user_id);
user_ids = user_ids.filter(Boolean); // be defensive about undefined users
return user_ids;
}
export function has_unconverted_data(pill_widget) {
// This returns true if we either have text that hasn't been
// turned into pills or email-only pills (for Zephyr).
if (pill_widget.is_pending()) {
return true;
}
const items = pill_widget.items();
const has_unknown_items = items.some((item) => item.user_id === undefined);
return has_unknown_items;
}
export function typeahead_source(pill_widget) {
const persons = people.get_realm_users();
return filter_taken_users(persons, pill_widget);
}
export function filter_taken_users(items, pill_widget) {
const taken_user_ids = get_user_ids(pill_widget);
items = items.filter((item) => !taken_user_ids.includes(item.user_id));
return items;
}
export function append_user(user, pills) {
if (user) {
append_person({
pill_widget: pills,
person: user,
});
} else {
blueslip.warn("Undefined user in function append_user");
}
}
export function create_pills(pill_container, pill_config) {
const pills = input_pill.create({
container: pill_container,
pill_config,
create_item_from_text: create_item_from_email,
get_text_from_item: get_email_from_item,
});
return pills;
}