Martin Brennan 07c3782e51
FEATURE: Show unread in sidebar for unread channel threads (#22342)
This commit makes it so that when the user has unread threads
for a channel we show a blue dot in the sidebar (or channel index
for mobile/drawer).

This blue dot is slightly different from the channel unread messages:

1. It will only show if the new thread messages were created since
   the user last viewed the channel
2. It will be cleared when the user views the channel, but the threads
   are still considered unread because we want the user to click into
   the thread list to view them

This necessitates a change to the current user serializer to also
include the unread thread overview, which is all unread threads
across all channels and their last reply date + time.
2023-07-17 13:00:49 +10:00

147 lines
6.2 KiB
Ruby

# frozen_string_literal: true
describe "Thread tracking state | full page", type: :system do
fab!(:current_user) { Fabricate(:user) }
fab!(:channel) { Fabricate(:chat_channel, threading_enabled: true) }
fab!(:other_user) { Fabricate(:user) }
fab!(:thread) { Fabricate(:chat_thread, channel: channel) }
let(:chat_page) { PageObjects::Pages::Chat.new }
let(:channel_page) { PageObjects::Pages::ChatChannel.new }
let(:thread_page) { PageObjects::Pages::ChatThread.new }
let(:thread_list_page) { PageObjects::Components::Chat::ThreadList.new }
let(:sidebar_page) { PageObjects::Pages::Sidebar.new }
before do
SiteSetting.enable_experimental_chat_threaded_discussions = true
chat_system_bootstrap(current_user, [channel])
sign_in(current_user)
thread.add(current_user)
end
context "when the user has unread messages for a thread" do
fab!(:message_1) do
Fabricate(:chat_message, chat_channel: channel, thread: thread, user: current_user)
end
fab!(:message_2) { Fabricate(:chat_message, chat_channel: channel, thread: thread) }
it "shows the count of threads with unread messages on the thread list button" do
chat_page.visit_channel(channel)
expect(channel_page).to have_unread_thread_indicator(count: 1)
end
it "does not include threads with deleted original messages in the count of threads with unread messages" do
thread.original_message.trash!
chat_page.visit_channel(channel)
expect(thread_page).to have_no_unread_list_indicator
end
it "shows an indicator on the unread thread in the list" do
chat_page.visit_channel(channel)
channel_page.open_thread_list
expect(thread_list_page).to have_unread_item(thread.id, count: 1)
end
it "marks the thread as read and removes both indicators when the user opens it" do
chat_page.visit_channel(channel)
channel_page.open_thread_list
thread_list_page.item_by_id(thread.id).click
expect(thread_page).to have_no_unread_list_indicator
thread_page.back_to_previous_route
expect(thread_list_page).to have_no_unread_item(thread.id)
end
it "shows unread indicators for the header of the list when a new unread arrives" do
thread.membership_for(current_user).update!(last_read_message_id: message_2.id)
chat_page.visit_channel(channel)
channel_page.open_thread_list
expect(thread_list_page).to have_no_unread_item(thread.id)
Fabricate(:chat_message, chat_channel: channel, thread: thread)
expect(thread_list_page).to have_unread_item(thread.id)
end
it "does not change the unread indicator for the header icon when the user is not a member of the thread" do
thread.remove(current_user)
chat_page.visit_channel(channel)
expect(channel_page).to have_no_unread_thread_indicator
Fabricate(:chat_message, chat_channel: channel, thread: thread)
expect(channel_page).to have_no_unread_thread_indicator
channel_page.open_thread_list
expect(thread_list_page).to have_no_unread_item(thread.id)
end
it "allows the user to change their tracking level for an existing thread" do
chat_page.visit_thread(thread)
thread_page.notification_level = :normal
expect(thread_page).to have_notification_level("normal")
end
it "allows the user to start tracking a thread they have not replied to" do
new_thread = Fabricate(:chat_thread, channel: channel)
Fabricate(:chat_message, chat_channel: channel, thread: new_thread)
chat_page.visit_thread(new_thread)
thread_page.notification_level = :tracking
expect(thread_page).to have_notification_level("tracking")
chat_page.visit_channel(channel)
channel_page.open_thread_list
expect(thread_list_page).to have_thread(new_thread)
end
describe "sidebar unread indicators" do
fab!(:other_channel) { Fabricate(:chat_channel) }
before do
other_channel.add(current_user)
SiteSetting.navigation_menu = "sidebar"
end
it "shows an unread indicator for the channel with unread threads in the sidebar" do
chat_page.visit_channel(other_channel)
expect(sidebar_page).to have_unread_channel(channel)
end
it "does not show an unread indicator for the channel if the user has visited the channel since the unread thread message arrived" do
channel.membership_for(current_user).update!(last_viewed_at: Time.zone.now)
chat_page.visit_channel(other_channel)
expect(sidebar_page).to have_no_unread_channel(channel)
end
it "clears the sidebar unread indicator for the channel when opening it but keeps the thread list unread indicator" do
chat_page.visit_channel(channel)
expect(sidebar_page).to have_no_unread_channel(channel)
expect(channel_page).to have_unread_thread_indicator(count: 1)
end
it "does not show an unread indicator for the channel sidebar if a new thread message arrives while the user is looking at the channel" do
chat_page.visit_channel(channel)
expect(sidebar_page).to have_no_unread_channel(channel)
Fabricate(:chat_message, thread: thread)
expect(sidebar_page).to have_no_unread_channel(channel)
end
it "shows an unread indicator for the channel sidebar if a new thread message arrives while the user is not looking at the channel" do
chat_page.visit_channel(channel)
expect(sidebar_page).to have_no_unread_channel(channel)
chat_page.visit_channel(other_channel)
Fabricate(:chat_message, thread: thread)
expect(sidebar_page).to have_unread_channel(channel)
end
end
context "when the user's notification level for the thread is set to normal" do
before { thread.membership_for(current_user).update!(notification_level: :normal) }
it "does not show a the count of threads with unread messages on the thread list button" do
chat_page.visit_channel(channel)
expect(channel_page).to have_no_unread_thread_indicator
end
it "does not show an indicator on the unread thread in the list" do
chat_page.visit_channel(channel)
channel_page.open_thread_list
expect(thread_list_page).to have_no_unread_item(thread.id)
end
end
end
end