diff --git a/frontend_tests/node_tests/popovers.js b/frontend_tests/node_tests/popovers.js index f71bfb3fb0..e945b8e439 100644 --- a/frontend_tests/node_tests/popovers.js +++ b/frontend_tests/node_tests/popovers.js @@ -39,7 +39,6 @@ mock_esm("../../static/js/stream_popover", { const people = zrequire("people"); const user_status = zrequire("user_status"); const message_edit = zrequire("message_edit"); -const emoji = zrequire("../shared/js/emoji"); // Bypass some scary code that runs when we import the module. const popovers = with_field($.fn, "popover", noop, () => zrequire("popovers")); @@ -114,7 +113,6 @@ function test_ui(label, f) { test_ui("sender_hover", ({override, mock_template}) => { page_params.is_spectator = false; override($.fn, "popover", noop); - override(emoji, "get_emoji_details_by_name", noop); const selection = ".sender_name, .sender_name-in-status, .inline_profile_picture"; const handler = $("#main_div").get_on_handler("click", selection); diff --git a/frontend_tests/node_tests/user_status.js b/frontend_tests/node_tests/user_status.js index 0fd67e65a4..436e1356ba 100644 --- a/frontend_tests/node_tests/user_status.js +++ b/frontend_tests/node_tests/user_status.js @@ -16,10 +16,18 @@ const emoji_params = { realm_emoji: { 991: { id: "991", - name: "realm_emoji", + name: "example_realm_emoji", source_url: "/url/for/991", + still_url: "/url/still/991", deactivated: false, }, + 992: { + id: "992", + name: "deactivated_realm_emoji", + source_url: "/url/for/992", + still_url: "/url/still/992", + deactivated: true, + }, }, emoji_codes, }; @@ -33,6 +41,11 @@ function initialize() { 2: {away: true}, 3: {away: true}, 4: {emoji_name: "smiley", emoji_code: "1f603", reaction_type: "unicode_emoji"}, + 5: { + emoji_name: "deactivated_realm_emoji", + emoji_code: "992", + reaction_type: "realm_emoji", + }, }, }; user_status.initialize(params); @@ -40,6 +53,31 @@ function initialize() { run_test("basics", () => { initialize(); + + assert.deepEqual(user_status.get_status_emoji(5), { + emoji_code: "992", + emoji_name: "deactivated_realm_emoji", + reaction_type: "realm_emoji", + url: "/url/for/992", + still_url: "/url/still/992", + }); + + user_status.set_status_emoji({ + user_id: 5, + emoji_code: "991", + emoji_name: "example_realm_emoji", + reaction_type: "realm_emoji", + }); + + assert.deepEqual(user_status.get_status_emoji(5), { + emoji_alt_code: false, + emoji_code: "991", + emoji_name: "example_realm_emoji", + reaction_type: "realm_emoji", + still_url: "/url/still/991", + url: "/url/for/991", + }); + assert.ok(user_status.is_away(2)); assert.ok(!user_status.is_away(99)); @@ -73,7 +111,6 @@ run_test("basics", () => { emoji_name: "smiley", emoji_code: "1f603", reaction_type: "unicode_emoji", - // Extra parameters that were added by `emoji.get_emoji_details_by_name` emoji_alt_code: false, }); @@ -135,4 +172,31 @@ run_test("defensive checks", () => { blueslip.expect("error", "need ints for user_id", 2); user_status.set_away("string"); user_status.revoke_away("string"); + + assert.throws( + () => + user_status.set_status_emoji({ + user_id: 5, + emoji_name: "emoji", + // no status code or reaction type. + }), + { + name: "Error", + message: "Invalid params.", + }, + ); + + assert.throws( + () => + user_status.set_status_emoji({ + user_id: 5, + reaction_type: "realm_emoji", + emoji_name: "does_not_exist", + emoji_code: "fake_code", + }), + { + name: "Error", + message: "Cannot find realm emoji for code 'fake_code'.", + }, + ); }); diff --git a/static/js/user_status.js b/static/js/user_status.js index 6fd5a334e6..5429e33062 100644 --- a/static/js/user_status.js +++ b/static/js/user_status.js @@ -77,11 +77,12 @@ export function set_status_emoji(opts) { } user_status_emoji_info.set(opts.user_id, { - emoji_name: opts.emoji_name, - emoji_code: opts.emoji_code, - reaction_type: opts.reaction_type, emoji_alt_code: user_settings.emojiset === "text", - ...emoji.get_emoji_details_by_name(opts.emoji_name), + ...emoji.get_emoji_details_for_rendering({ + emoji_name: opts.emoji_name, + emoji_code: opts.emoji_code, + reaction_type: opts.reaction_type, + }), }); } @@ -104,10 +105,7 @@ export function initialize(params) { if (dct.emoji_name) { user_status_emoji_info.set(user_id, { - emoji_name: dct.emoji_name, - emoji_code: dct.emoji_code, - reaction_type: dct.reaction_type, - ...emoji.get_emoji_details_by_name(dct.emoji_name), + ...emoji.get_emoji_details_for_rendering(dct), }); } } diff --git a/static/shared/js/emoji.js b/static/shared/js/emoji.js index 73fae45d48..7653e240a8 100644 --- a/static/shared/js/emoji.js +++ b/static/shared/js/emoji.js @@ -218,6 +218,32 @@ export function get_emoji_details_by_name(emoji_name) { return emoji_info; } +export function get_emoji_details_for_rendering(opts) { + if (!opts.emoji_name || !opts.emoji_code || !opts.reaction_type) { + throw new Error("Invalid params."); + } + + if (opts.reaction_type !== "unicode_emoji") { + const realm_emoji = all_realm_emojis.get(opts.emoji_code); + if (!realm_emoji) { + throw new Error(`Cannot find realm emoji for code '${opts.emoji_code}'.`); + } + return { + url: realm_emoji.emoji_url, + still_url: realm_emoji.still_url, + emoji_name: opts.emoji_name, + emoji_code: opts.emoji_code, + reaction_type: opts.reaction_type, + }; + } + // else + return { + emoji_name: opts.emoji_name, + emoji_code: opts.emoji_code, + reaction_type: opts.reaction_type, + }; +} + export function initialize(params) { emoji_codes = params.emoji_codes;