mirror of
https://github.com/discourse/discourse.git
synced 2024-12-13 09:24:15 +08:00
67c0498f64
This PR is introducing glimmer usage in the chat-live-pane, for components but also for models. RestModel usage has been dropped in favor of native classes. Other changes/additions in this PR: - sticky dates, scrolling will now keep the date separator of the current section at the top of the screen - better unread management, marking a channel as unread will correctly mark the correct message and not mark the whole channel as read. Tracking state will also now correctly return unread count and unread mentions. - adds an animation on bottom arrow - better scrolling behavior, we should now always correctly keep the scroll position while loading more - reactions are now more reactive, and will update their tooltip without needed to close/reopen it - skeleton has been improved with placeholder images and reactions - when making a reaction on the desktop message actions, the menu won't move anymore - simplify logic and stop maintaining a list of unloaded messages
41 lines
1.4 KiB
Ruby
41 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ChatChannelUnreadsQuery
|
|
def self.call(channel_id:, user_id:)
|
|
sql = <<~SQL
|
|
SELECT (
|
|
SELECT COUNT(*) AS unread_count
|
|
FROM chat_messages
|
|
INNER JOIN chat_channels ON chat_channels.id = chat_messages.chat_channel_id
|
|
INNER JOIN user_chat_channel_memberships ON user_chat_channel_memberships.chat_channel_id = chat_channels.id
|
|
WHERE chat_channels.id = :channel_id
|
|
AND chat_messages.user_id != :user_id
|
|
AND user_chat_channel_memberships.user_id = :user_id
|
|
AND chat_messages.id > COALESCE(user_chat_channel_memberships.last_read_message_id, 0)
|
|
AND chat_messages.deleted_at IS NULL
|
|
) AS unread_count,
|
|
(
|
|
SELECT COUNT(*) AS mention_count
|
|
FROM notifications
|
|
INNER JOIN user_chat_channel_memberships ON user_chat_channel_memberships.chat_channel_id = :channel_id
|
|
AND user_chat_channel_memberships.user_id = :user_id
|
|
WHERE NOT read
|
|
AND notifications.user_id = :user_id
|
|
AND notifications.notification_type = :notification_type
|
|
AND (data::json->>'chat_message_id')::bigint > COALESCE(user_chat_channel_memberships.last_read_message_id, 0)
|
|
AND (data::json->>'chat_channel_id')::bigint = :channel_id
|
|
) AS mention_count;
|
|
SQL
|
|
|
|
DB
|
|
.query(
|
|
sql,
|
|
channel_id: channel_id,
|
|
user_id: user_id,
|
|
notification_type: Notification.types[:chat_mention],
|
|
)
|
|
.first
|
|
.to_h
|
|
end
|
|
end
|