mirror of
https://github.com/discourse/discourse.git
synced 2024-12-05 07:53:42 +08:00
f75ac9da30
This commit adds the initial part of thread indicator improvements: * Show the reply count, last reply date and excerpt, and the participants of the thread's avatars and count of additional participants * Add a participants component for the thread that can be reused for the list * Add a query class to get the thread participants * Live update the thread indicator more consistently with the last reply and participant details image image In subsequent PRs we will cache the participants since they do not change often, and improve the thread list further with participants. This commit also adds a showPresence boolean (default true) to ChatUserAvatar, since we don't want to show the online indicator for thread participants. --------- Co-authored-by: chapoi <charlie@discourse.org>
200 lines
5.8 KiB
JavaScript
200 lines
5.8 KiB
JavaScript
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
|
|
import hbs from "htmlbars-inline-precompile";
|
|
import fabricators from "discourse/plugins/chat/discourse/lib/fabricators";
|
|
import { render, waitFor } from "@ember/test-helpers";
|
|
import { module, test } from "qunit";
|
|
import pretender, { OK } from "discourse/tests/helpers/create-pretender";
|
|
import { publishToMessageBus } from "discourse/tests/helpers/qunit-helpers";
|
|
|
|
module(
|
|
"Discourse Chat | Component | chat-channel | status on mentions",
|
|
function (hooks) {
|
|
setupRenderingTest(hooks);
|
|
|
|
const channelId = 1;
|
|
const channel = {
|
|
id: channelId,
|
|
chatable_id: 1,
|
|
chatable_type: "Category",
|
|
meta: { message_bus_last_ids: {} },
|
|
current_user_membership: { following: true },
|
|
chatable: { id: 1 },
|
|
};
|
|
const actingUser = {
|
|
id: 1,
|
|
username: "acting_user",
|
|
};
|
|
const mentionedUser = {
|
|
id: 1000,
|
|
username: "user1",
|
|
status: {
|
|
description: "surfing",
|
|
emoji: "surfing_man",
|
|
},
|
|
};
|
|
const mentionedUser2 = {
|
|
id: 2000,
|
|
username: "user2",
|
|
status: {
|
|
description: "vacation",
|
|
emoji: "desert_island",
|
|
},
|
|
};
|
|
const message = {
|
|
id: 1891,
|
|
message: `Hey @${mentionedUser.username}`,
|
|
cooked: `<p>Hey <a class="mention" href="/u/${mentionedUser.username}">@${mentionedUser.username}</a></p>`,
|
|
mentioned_users: [mentionedUser],
|
|
user: {
|
|
id: 1,
|
|
username: "jesse",
|
|
},
|
|
};
|
|
|
|
hooks.beforeEach(function () {
|
|
pretender.get(`/chat/api/channels/1`, () =>
|
|
OK({
|
|
channel,
|
|
chat_messages: [message],
|
|
meta: { can_delete_self: true },
|
|
})
|
|
);
|
|
|
|
this.channel = fabricators.channel({
|
|
id: channelId,
|
|
currentUserMembership: { following: true },
|
|
meta: { can_join_chat_channel: false },
|
|
});
|
|
this.appEvents = this.container.lookup("service:appEvents");
|
|
});
|
|
|
|
test("it shows status on mentions", async function (assert) {
|
|
await render(hbs`<ChatChannel @channel={{this.channel}} />`);
|
|
|
|
assertStatusIsRendered(
|
|
assert,
|
|
statusSelector(mentionedUser.username),
|
|
mentionedUser.status
|
|
);
|
|
});
|
|
|
|
test("it updates status on mentions", async function (assert) {
|
|
await render(hbs`<ChatChannel @channel={{this.channel}} />`);
|
|
|
|
const newStatus = {
|
|
description: "off to dentist",
|
|
emoji: "tooth",
|
|
};
|
|
|
|
this.appEvents.trigger("user-status:changed", {
|
|
[mentionedUser.id]: newStatus,
|
|
});
|
|
|
|
const selector = statusSelector(mentionedUser.username);
|
|
await waitFor(selector);
|
|
assertStatusIsRendered(
|
|
assert,
|
|
statusSelector(mentionedUser.username),
|
|
newStatus
|
|
);
|
|
});
|
|
|
|
test("it deletes status on mentions", async function (assert) {
|
|
await render(hbs`<ChatChannel @channel={{this.channel}} />`);
|
|
|
|
this.appEvents.trigger("user-status:changed", {
|
|
[mentionedUser.id]: null,
|
|
});
|
|
|
|
const selector = statusSelector(mentionedUser.username);
|
|
await waitFor(selector, { count: 0 });
|
|
assert.dom(selector).doesNotExist("status is deleted");
|
|
});
|
|
|
|
test("it shows status on mentions on messages that came from Message Bus", async function (assert) {
|
|
await render(hbs`<ChatChannel @channel={{this.channel}} />`);
|
|
|
|
await receiveChatMessageViaMessageBus();
|
|
|
|
assertStatusIsRendered(
|
|
assert,
|
|
statusSelector(mentionedUser2.username),
|
|
mentionedUser2.status
|
|
);
|
|
});
|
|
|
|
test("it updates status on mentions on messages that came from Message Bus", async function (assert) {
|
|
await render(hbs`<ChatChannel @channel={{this.channel}} />`);
|
|
await receiveChatMessageViaMessageBus();
|
|
|
|
const newStatus = {
|
|
description: "off to meeting",
|
|
emoji: "calendar",
|
|
};
|
|
this.appEvents.trigger("user-status:changed", {
|
|
[mentionedUser2.id]: newStatus,
|
|
});
|
|
|
|
const selector = statusSelector(mentionedUser2.username);
|
|
await waitFor(selector);
|
|
assertStatusIsRendered(
|
|
assert,
|
|
statusSelector(mentionedUser2.username),
|
|
newStatus
|
|
);
|
|
});
|
|
|
|
test("it deletes status on mentions on messages that came from Message Bus", async function (assert) {
|
|
await render(hbs`<ChatChannel @channel={{this.channel}} />`);
|
|
await receiveChatMessageViaMessageBus();
|
|
|
|
this.appEvents.trigger("user-status:changed", {
|
|
[mentionedUser2.id]: null,
|
|
});
|
|
|
|
const selector = statusSelector(mentionedUser2.username);
|
|
await waitFor(selector, { count: 0 });
|
|
assert.dom(selector).doesNotExist("status is deleted");
|
|
});
|
|
|
|
function assertStatusIsRendered(assert, selector, status) {
|
|
assert
|
|
.dom(selector)
|
|
.exists("status is rendered")
|
|
.hasAttribute(
|
|
"title",
|
|
status.description,
|
|
"status description is updated"
|
|
)
|
|
.hasAttribute(
|
|
"src",
|
|
new RegExp(`${status.emoji}.png`),
|
|
"status emoji is updated"
|
|
);
|
|
}
|
|
|
|
async function receiveChatMessageViaMessageBus() {
|
|
await publishToMessageBus(`/chat/${channelId}`, {
|
|
chat_message: {
|
|
id: 2138,
|
|
message: `Hey @${mentionedUser2.username}`,
|
|
cooked: `<p>Hey <a class="mention" href="/u/${mentionedUser2.username}">@${mentionedUser2.username}</a></p>`,
|
|
created_at: "2023-05-18T16:07:59.588Z",
|
|
excerpt: `Hey @${mentionedUser2.username}`,
|
|
available_flags: [],
|
|
chat_channel_id: 7,
|
|
mentioned_users: [mentionedUser2],
|
|
user: actingUser,
|
|
chat_webhook_event: null,
|
|
uploads: [],
|
|
},
|
|
type: "sent",
|
|
});
|
|
}
|
|
|
|
function statusSelector(username) {
|
|
return `.mention[href='/u/${username}'] .user-status`;
|
|
}
|
|
}
|
|
);
|