mirror of
https://github.com/discourse/discourse.git
synced 2024-12-05 09:13:43 +08:00
d6374fdc53
This commit adds a tracking dropdown to each individual thread, similar to topics, that allows the user to change the notification level for a thread manually. Previously the user had to reply to a thread to track it and see unread indicators. Since the user can now manually track threads, the thread index has also been changed to only show threads that the user is a member of, rather than threads that they had sent messages in. Unread indicators also respect the notification level -- Normal level thread tracking will not show unread indicators in the UI when new messages are sent in the thread.
76 lines
2.2 KiB
Ruby
76 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "faker"
|
|
|
|
module ChatSystemHelpers
|
|
def chat_system_bootstrap(user = Fabricate(:admin), channels_for_membership = [])
|
|
# ensures we have one valid registered admin/user
|
|
user.activate
|
|
|
|
SiteSetting.chat_enabled = true
|
|
SiteSetting.chat_allowed_groups = Group::AUTO_GROUPS[:trust_level_1]
|
|
|
|
channels_for_membership.each do |channel|
|
|
membership = channel.add(user)
|
|
if channel.chat_messages.any?
|
|
membership.update!(last_read_message_id: channel.chat_messages.last.id)
|
|
end
|
|
end
|
|
|
|
Group.refresh_automatic_groups!
|
|
end
|
|
|
|
def chat_system_user_bootstrap(user:, channel:)
|
|
user.activate
|
|
user.user_option.update!(chat_enabled: true)
|
|
Group.refresh_automatic_group!("trust_level_#{user.trust_level}".to_sym)
|
|
Fabricate(:user_chat_channel_membership, chat_channel: channel, user: user)
|
|
end
|
|
|
|
def chat_thread_chain_bootstrap(channel:, users:, messages_count: 4, thread_attrs: {})
|
|
last_user = nil
|
|
last_message = nil
|
|
|
|
messages_count.times do |i|
|
|
in_reply_to = i.zero? ? nil : last_message.id
|
|
thread_id = i.zero? ? nil : last_message.thread_id
|
|
last_user = last_user.present? ? (users - [last_user]).sample : users.sample
|
|
creator =
|
|
Chat::MessageCreator.new(
|
|
chat_channel: channel,
|
|
in_reply_to_id: in_reply_to,
|
|
thread_id: thread_id,
|
|
user: last_user,
|
|
content: Faker::Lorem.paragraph,
|
|
)
|
|
creator.create
|
|
|
|
raise creator.error if creator.error
|
|
last_message = creator.chat_message
|
|
end
|
|
|
|
last_message.thread.set_replies_count_cache(messages_count - 1, update_db: true)
|
|
last_message.thread.update!(thread_attrs) if thread_attrs.any?
|
|
last_message.thread
|
|
end
|
|
|
|
def thread_excerpt(message)
|
|
CGI.escapeHTML(
|
|
message.censored_excerpt(rich: true, max_length: ::Chat::Thread::EXCERPT_LENGTH).gsub(
|
|
"…",
|
|
"…",
|
|
),
|
|
)
|
|
end
|
|
end
|
|
|
|
RSpec.configure do |config|
|
|
config.include ChatSystemHelpers, type: :system
|
|
config.include Chat::ServiceMatchers
|
|
|
|
config.expect_with :rspec do |c|
|
|
# Or a very large value, if you do want to truncate at some point
|
|
c.max_formatted_output_length = nil
|
|
end
|
|
end
|