mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
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>
166 lines
5.9 KiB
Ruby
166 lines
5.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
describe "Thread indicator for chat messages", type: :system do
|
|
fab!(:current_user) { Fabricate(:user) }
|
|
fab!(:other_user) { Fabricate(:user) }
|
|
|
|
let(:chat_page) { PageObjects::Pages::Chat.new }
|
|
let(:channel_page) { PageObjects::Pages::ChatChannel.new }
|
|
let(:side_panel) { PageObjects::Pages::ChatSidePanel.new }
|
|
let(:open_thread) { PageObjects::Pages::ChatThread.new }
|
|
let(:chat_drawer_page) { PageObjects::Pages::ChatDrawer.new }
|
|
|
|
before do
|
|
chat_system_bootstrap(current_user, [channel])
|
|
sign_in(current_user)
|
|
end
|
|
|
|
context "when enable_experimental_chat_threaded_discussions is disabled" do
|
|
fab!(:channel) { Fabricate(:chat_channel) }
|
|
before { SiteSetting.enable_experimental_chat_threaded_discussions = false }
|
|
|
|
it "shows no thread indicators in the channel" do
|
|
thread = chat_thread_chain_bootstrap(channel: channel, users: [current_user, other_user])
|
|
chat_page.visit_channel(channel)
|
|
expect(channel_page).to have_no_thread_indicator(thread.original_message)
|
|
end
|
|
end
|
|
|
|
context "when threading_enabled is false for the channel" do
|
|
fab!(:channel) { Fabricate(:chat_channel) }
|
|
before do
|
|
SiteSetting.enable_experimental_chat_threaded_discussions = true
|
|
channel.update!(threading_enabled: false)
|
|
end
|
|
|
|
it "shows no thread inidcators in the channel" do
|
|
thread = chat_thread_chain_bootstrap(channel: channel, users: [current_user, other_user])
|
|
chat_page.visit_channel(channel)
|
|
expect(channel_page).to have_no_thread_indicator(thread.original_message)
|
|
end
|
|
end
|
|
|
|
context "when enable_experimental_chat_threaded_discussions is true and threading is enabled for the channel" do
|
|
fab!(:channel) { Fabricate(:chat_channel) }
|
|
fab!(:thread_1) do
|
|
chat_thread_chain_bootstrap(channel: channel, users: [current_user, other_user])
|
|
end
|
|
fab!(:thread_2) do
|
|
chat_thread_chain_bootstrap(
|
|
channel: channel,
|
|
users: [current_user, other_user],
|
|
messages_count: 2,
|
|
)
|
|
end
|
|
|
|
before do
|
|
SiteSetting.enable_experimental_chat_threaded_discussions = true
|
|
channel.update!(threading_enabled: true)
|
|
end
|
|
|
|
it "throws thread indicators on all original messages" do
|
|
chat_page.visit_channel(channel)
|
|
expect(channel_page).to have_thread_indicator(thread_1.original_message)
|
|
expect(channel_page).to have_thread_indicator(thread_2.original_message)
|
|
end
|
|
|
|
it "shows the correct reply counts" do
|
|
chat_page.visit_channel(channel)
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_reply_count(
|
|
3,
|
|
)
|
|
expect(channel_page.message_thread_indicator(thread_2.original_message)).to have_reply_count(
|
|
1,
|
|
)
|
|
end
|
|
|
|
it "clicking a thread indicator opens the thread panel" do
|
|
chat_page.visit_channel(channel)
|
|
channel_page.message_thread_indicator(thread_1.original_message).click
|
|
expect(side_panel).to have_open_thread(thread_1)
|
|
end
|
|
|
|
it "shows the thread indicator and hides the sent message when a user first replies to a message without a thread" do
|
|
message_without_thread = Fabricate(:chat_message, chat_channel: channel, user: other_user)
|
|
chat_page.visit_channel(channel)
|
|
channel_page.reply_to(message_without_thread)
|
|
open_thread.fill_composer("this is a reply to make a new thread")
|
|
open_thread.click_send_message
|
|
|
|
expect(channel_page).to have_thread_indicator(message_without_thread)
|
|
|
|
new_thread = nil
|
|
try_until_success(timeout: 5) do
|
|
new_thread = message_without_thread.reload.thread
|
|
expect(new_thread).to be_present
|
|
end
|
|
|
|
expect(page).not_to have_css(channel_page.message_by_id_selector(new_thread.replies.first))
|
|
end
|
|
|
|
it "increments the indicator when a new reply is sent in the thread" do
|
|
chat_page.visit_channel(channel)
|
|
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_reply_count(
|
|
3,
|
|
)
|
|
|
|
channel_page.message_thread_indicator(thread_1.original_message).click
|
|
|
|
expect(side_panel).to have_open_thread(thread_1)
|
|
|
|
open_thread.send_message
|
|
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_reply_count(
|
|
4,
|
|
)
|
|
end
|
|
|
|
it "shows participants of the thread" do
|
|
chat_page.visit_channel(channel)
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_participant(
|
|
current_user,
|
|
)
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_participant(
|
|
other_user,
|
|
)
|
|
end
|
|
|
|
it "shows an excerpt of the last reply in the thread" do
|
|
chat_page.visit_channel(channel)
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_excerpt(
|
|
thread_1.replies.last,
|
|
)
|
|
end
|
|
|
|
it "updates the last reply excerpt and participants when a new message is added to the thread" do
|
|
new_user = Fabricate(:user)
|
|
chat_system_user_bootstrap(user: new_user, channel: channel)
|
|
original_last_reply = thread_1.replies.last
|
|
|
|
chat_page.visit_channel(channel)
|
|
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_excerpt(
|
|
original_last_reply,
|
|
)
|
|
|
|
using_session(:new_user) do |session|
|
|
sign_in(new_user)
|
|
chat_page.visit_channel(channel)
|
|
channel_page.message_thread_indicator(thread_1.original_message).click
|
|
|
|
expect(side_panel).to have_open_thread(thread_1)
|
|
|
|
open_thread.send_message("wow i am happy to join this thread!")
|
|
end
|
|
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_participant(
|
|
new_user,
|
|
)
|
|
expect(channel_page.message_thread_indicator(thread_1.original_message)).to have_excerpt(
|
|
thread_1.replies.where(user: new_user).first,
|
|
)
|
|
end
|
|
end
|
|
end
|