diff --git a/plugins/chat/assets/javascripts/discourse/services/chat-notification-manager.js b/plugins/chat/assets/javascripts/discourse/services/chat-notification-manager.js index 74a8f483546..850e6d2894d 100644 --- a/plugins/chat/assets/javascripts/discourse/services/chat-notification-manager.js +++ b/plugins/chat/assets/javascripts/discourse/services/chat-notification-manager.js @@ -3,165 +3,57 @@ import { alertChannel, onNotification as onDesktopNotification, } from "discourse/lib/desktop-notifications"; -import { withPluginApi } from "discourse/lib/plugin-api"; import { isTesting } from "discourse-common/config/environment"; import { bind } from "discourse-common/utils/decorators"; export default class ChatNotificationManager extends Service { - @service presence; @service chat; - @service chatChannelsManager; - @service chatStateManager; @service currentUser; @service appEvents; @service site; - _subscribedToCore = true; - _subscribedToChat = false; - _countChatInDocTitle = true; - willDestroy() { super.willDestroy(...arguments); - if (!this._shouldRun()) { + if (!this.#shouldRun) { return; } - this._chatPresenceChannel.off( - "change", - this._subscribeToCorrectNotifications - ); - this._chatPresenceChannel.unsubscribe(); - this._chatPresenceChannel.leave(); - - this._corePresenceChannel.off( - "change", - this._subscribeToCorrectNotifications - ); - this._corePresenceChannel.unsubscribe(); - this._corePresenceChannel.leave(); + this.messageBus.unsubscribe(this.messageBusChannel, this.onMessage); } start() { - if (!this._shouldRun()) { + if (!this.#shouldRun) { return; } - this.set( - "_chatPresenceChannel", - this.presence.getChannel(`/chat-user/chat/${this.currentUser.id}`) - ); - this.set( - "_corePresenceChannel", - this.presence.getChannel(`/chat-user/core/${this.currentUser.id}`) - ); - this._chatPresenceChannel.subscribe(); - this._corePresenceChannel.subscribe(); - - withPluginApi("0.12.1", (api) => { - api.onPageChange(this._pageChanged); - }); - - this._pageChanged(); - - this._chatPresenceChannel.on( - "change", - this._subscribeToCorrectNotifications - ); - this._corePresenceChannel.on( - "change", - this._subscribeToCorrectNotifications - ); + this.messageBus.subscribe(this.messageBusChannel, this.onMessage); } - shouldCountChatInDocTitle() { - return this._countChatInDocTitle; - } - - @bind - _pageChanged() { - if (this.chatStateManager.isActive) { - this._chatPresenceChannel.enter({ onlyWhileActive: false }); - this._corePresenceChannel.leave(); - } else { - this._chatPresenceChannel.leave(); - this._corePresenceChannel.enter({ onlyWhileActive: false }); - } - } - - _coreAlertChannel() { - return alertChannel(this.currentUser); - } - - _chatAlertChannel() { + get messageBusChannel() { return `/chat${alertChannel(this.currentUser)}`; } - @bind - _subscribeToCorrectNotifications() { - const oneTabForEachOpen = - this._chatPresenceChannel.count > 0 && - this._corePresenceChannel.count > 0; - if (oneTabForEachOpen) { - this.chatStateManager.isActive - ? this._subscribeToChat({ only: true }) - : this._subscribeToCore({ only: true }); - } else { - this._subscribeToBoth(); - } - } - - _subscribeToBoth() { - this._subscribeToChat(); - this._subscribeToCore(); - } - - _subscribeToChat(opts = { only: false }) { - this.set("_countChatInDocTitle", true); - - if (!this._subscribedToChat) { - this.messageBus.subscribe(this._chatAlertChannel(), this.onMessage); - this.set("_subscribedToChat", true); - } - - if (opts.only && this._subscribedToCore) { - this.messageBus.unsubscribe(this._coreAlertChannel(), this.onMessage); - this.set("_subscribedToCore", false); - } - } - - _subscribeToCore(opts = { only: false }) { - if (opts.only) { - this.set("_countChatInDocTitle", false); - } - if (!this._subscribedToCore) { - this.messageBus.subscribe(this._coreAlertChannel(), this.onMessage); - this.set("_subscribedToCore", true); - } - - if (opts.only && this._subscribedToChat) { - this.messageBus.unsubscribe(this._chatAlertChannel(), this.onMessage); - this.set("_subscribedToChat", false); - } - } - @bind async onMessage(data) { - if (data.channel_id === this.chat.activeChannel?.id) { + // if the user is currently focused on this tab and channel, + // we don't want to show a desktop notification + if ( + this.session.hasFocus && + data.channel_id === this.chat.activeChannel?.id + ) { return; } - if (this.site.desktopView) { - return onDesktopNotification( - data, - this.siteSettings, - this.currentUser, - this.appEvents - ); - } + return onDesktopNotification( + data, + this.siteSettings, + this.currentUser, + this.appEvents + ); } - _shouldRun() { - return this.chat.userCanChat && !isTesting(); + get #shouldRun() { + return this.site.desktopView && this.chat.userCanChat && !isTesting(); } } diff --git a/plugins/chat/assets/javascripts/discourse/services/chat.js b/plugins/chat/assets/javascripts/discourse/services/chat.js index da8ea4f4a97..1fe55408fa9 100644 --- a/plugins/chat/assets/javascripts/discourse/services/chat.js +++ b/plugins/chat/assets/javascripts/discourse/services/chat.js @@ -273,9 +273,7 @@ export default class Chat extends Service { } getDocumentTitleCount() { - return this.chatNotificationManager.shouldCountChatInDocTitle() - ? this.chatTrackingStateManager.allChannelUrgentCount - : 0; + return this.chatTrackingStateManager.allChannelUrgentCount; } switchChannelUpOrDown(direction, unreadOnly = false) { diff --git a/plugins/chat/plugin.rb b/plugins/chat/plugin.rb index 08b2b1475c5..9deed76a1c6 100644 --- a/plugins/chat/plugin.rb +++ b/plugins/chat/plugin.rb @@ -331,17 +331,6 @@ after_initialize do nil end - register_presence_channel_prefix("chat-user") do |channel_name| - if user_id = channel_name[%r{/chat-user/(chat|core)/(\d+)}, 2] - user = User.find(user_id) - config = PresenceChannel::Config.new - config.allowed_user_ids = [user.id] - config - end - rescue ActiveRecord::RecordNotFound - nil - end - register_push_notification_filter do |user, payload| if user.user_option.only_chat_push_notifications && user.user_option.chat_enabled payload[:notification_type].in?(::Notification.types.values_at(:chat_mention, :chat_message))