diff --git a/plugins/chat/app/serializers/chat_channel_serializer.rb b/plugins/chat/app/serializers/chat_channel_serializer.rb
index 6a194047f9..d3fedfa9c4 100644
--- a/plugins/chat/app/serializers/chat_channel_serializer.rb
+++ b/plugins/chat/app/serializers/chat_channel_serializer.rb
@@ -18,7 +18,8 @@ class ChatChannelSerializer < ApplicationSerializer
:total_messages,
:archive_topic_id,
:memberships_count,
- :current_user_membership
+ :current_user_membership,
+ :message_bus_last_ids
def initialize(object, opts)
super(object, opts)
@@ -94,6 +95,13 @@ class ChatChannelSerializer < ApplicationSerializer
).as_json
end
+ def message_bus_last_ids
+ {
+ new_messages: MessageBus.last_id("/chat/#{object.id}/new-messages"),
+ new_mentions: MessageBus.last_id("/chat/#{object.id}/new-mentions"),
+ }
+ end
+
alias_method :include_archive_topic_id?, :include_archive_status?
alias_method :include_total_messages?, :include_archive_status?
alias_method :include_archived_messages?, :include_archive_status?
diff --git a/plugins/chat/app/serializers/chat_view_serializer.rb b/plugins/chat/app/serializers/chat_view_serializer.rb
index 54b78b8401..566474ec40 100644
--- a/plugins/chat/app/serializers/chat_view_serializer.rb
+++ b/plugins/chat/app/serializers/chat_view_serializer.rb
@@ -22,6 +22,7 @@ class ChatViewSerializer < ApplicationSerializer
can_moderate: scope.can_moderate_chat?(object.chat_channel.chatable),
can_delete_self: scope.can_delete_own_chats?(object.chat_channel.chatable),
can_delete_others: scope.can_delete_other_chats?(object.chat_channel.chatable),
+ channel_message_bus_last_id: MessageBus.last_id("/chat/#{object.chat_channel.id}"),
}
meta_hash[:can_load_more_past] = object.can_load_more_past unless object.can_load_more_past.nil?
meta_hash[
diff --git a/plugins/chat/app/serializers/structured_channel_serializer.rb b/plugins/chat/app/serializers/structured_channel_serializer.rb
index e3ee4f7783..5da682e3ec 100644
--- a/plugins/chat/app/serializers/structured_channel_serializer.rb
+++ b/plugins/chat/app/serializers/structured_channel_serializer.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class StructuredChannelSerializer < ApplicationSerializer
- attributes :public_channels, :direct_message_channels
+ attributes :public_channels, :direct_message_channels, :message_bus_last_ids
def public_channels
object[:public_channels].map do |channel|
@@ -29,4 +29,19 @@ class StructuredChannelSerializer < ApplicationSerializer
return if scope.anonymous?
object[:memberships].find { |membership| membership.chat_channel_id == channel_id }
end
+
+ def message_bus_last_ids
+ last_ids = {
+ channel_metadata: MessageBus.last_id("/chat/channel-metadata"),
+ channel_edits: MessageBus.last_id("/chat/channel-edits"),
+ channel_status: MessageBus.last_id("/chat/channel-status"),
+ new_channel: MessageBus.last_id("/chat/new-channel"),
+ }
+ if !scope.anonymous?
+ last_ids[:user_tracking_state] = MessageBus.last_id(
+ "/chat/user-tracking-state/#{scope.user.id}",
+ )
+ end
+ last_ids
+ end
end
diff --git a/plugins/chat/assets/javascripts/discourse/components/chat-live-pane.js b/plugins/chat/assets/javascripts/discourse/components/chat-live-pane.js
index 887579d9e2..db465aa10c 100644
--- a/plugins/chat/assets/javascripts/discourse/components/chat-live-pane.js
+++ b/plugins/chat/assets/javascripts/discourse/components/chat-live-pane.js
@@ -403,6 +403,8 @@ export default Component.extend({
can_flag: messages.resultSetMeta.can_flag,
user_silenced: messages.resultSetMeta.user_silenced,
can_moderate: messages.resultSetMeta.can_moderate,
+ channel_message_bus_last_id:
+ messages.resultSetMeta.channel_message_bus_last_id,
},
registeredChatChannelId: this.chatChannel.id,
});
@@ -1407,13 +1409,17 @@ export default Component.extend({
_subscribeToUpdates(channelId) {
this._unsubscribeToUpdates(channelId);
- this.messageBus.subscribe(`/chat/${channelId}`, (busData) => {
- if (!this.details.can_load_more_future || busData.type !== "sent") {
- this.handleMessage(busData);
- } else {
- this.set("hasNewMessages", true);
- }
- });
+ this.messageBus.subscribe(
+ `/chat/${channelId}`,
+ (busData) => {
+ if (!this.details.can_load_more_future || busData.type !== "sent") {
+ this.handleMessage(busData);
+ } else {
+ this.set("hasNewMessages", true);
+ }
+ },
+ this.details.channel_message_bus_last_id
+ );
},
@bind
diff --git a/plugins/chat/assets/javascripts/discourse/initializers/chat-setup.js b/plugins/chat/assets/javascripts/discourse/initializers/chat-setup.js
index f295772574..e00ee2b59b 100644
--- a/plugins/chat/assets/javascripts/discourse/initializers/chat-setup.js
+++ b/plugins/chat/assets/javascripts/discourse/initializers/chat-setup.js
@@ -101,7 +101,7 @@ export default {
if (currentUser?.chat_channels) {
this.chatService.setupWithPreloadedChannels(currentUser.chat_channels);
} else {
- this.chatService.getChannels();
+ this.chatService.setupWithoutPreloadedChannels();
}
const chatNotificationManager = container.lookup(
diff --git a/plugins/chat/assets/javascripts/discourse/services/chat.js b/plugins/chat/assets/javascripts/discourse/services/chat.js
index e92205eb6e..aa866f4e15 100644
--- a/plugins/chat/assets/javascripts/discourse/services/chat.js
+++ b/plugins/chat/assets/javascripts/discourse/services/chat.js
@@ -79,11 +79,6 @@ export default class Chat extends Service {
if (this.userCanChat) {
this.set("allChannels", []);
- this._subscribeToNewChannelUpdates();
- this._subscribeToUserTrackingChannel();
- this._subscribeToChannelEdits();
- this._subscribeToChannelMetadata();
- this._subscribeToChannelStatusChange();
this.presenceChannel = this.presence.getChannel("/chat/online");
this.draftStore = {};
@@ -118,10 +113,25 @@ export default class Chat extends Service {
setupWithPreloadedChannels(channels) {
this.currentUser.set("chat_channel_tracking_state", {});
this._processChannels(channels || {});
+ this.subscribeToChannelMessageBus();
this.userChatChannelTrackingStateChanged();
this.appEvents.trigger("chat:refresh-channels");
}
+ setupWithoutPreloadedChannels() {
+ this.getChannels().then(() => {
+ this.subscribeToChannelMessageBus();
+ });
+ }
+
+ subscribeToChannelMessageBus() {
+ this._subscribeToNewChannelUpdates();
+ this._subscribeToUserTrackingChannel();
+ this._subscribeToChannelEdits();
+ this._subscribeToChannelMetadata();
+ this._subscribeToChannelStatusChange();
+ }
+
willDestroy() {
super.willDestroy(...arguments);
@@ -342,6 +352,8 @@ export default class Chat extends Service {
}
_processChannels(channels) {
+ // Must be set first because `processChannels` relies on this data.
+ this.set("messageBusLastIds", channels.message_bus_last_ids);
this.setProperties({
publicChannels: A(
this.sortPublicChannels(
@@ -593,29 +605,37 @@ export default class Chat extends Service {
}
_subscribeToChannelMetadata() {
- this.messageBus.subscribe("/chat/channel-metadata", (busData) => {
- this.getChannelBy("id", busData.chat_channel_id).then((channel) => {
- if (channel) {
- channel.setProperties({
- memberships_count: busData.memberships_count,
- });
- this.appEvents.trigger("chat:refresh-channel-members");
- }
- });
- });
+ this.messageBus.subscribe(
+ "/chat/channel-metadata",
+ (busData) => {
+ this.getChannelBy("id", busData.chat_channel_id).then((channel) => {
+ if (channel) {
+ channel.setProperties({
+ memberships_count: busData.memberships_count,
+ });
+ this.appEvents.trigger("chat:refresh-channel-members");
+ }
+ });
+ },
+ this.messageBusLastIds.channel_metadata
+ );
}
_subscribeToChannelEdits() {
- this.messageBus.subscribe("/chat/channel-edits", (busData) => {
- this.getChannelBy("id", busData.chat_channel_id).then((channel) => {
- if (channel) {
- channel.setProperties({
- title: busData.name,
- description: busData.description,
- });
- }
- });
- });
+ this.messageBus.subscribe(
+ "/chat/channel-edits",
+ (busData) => {
+ this.getChannelBy("id", busData.chat_channel_id).then((channel) => {
+ if (channel) {
+ channel.setProperties({
+ title: busData.name,
+ description: busData.description,
+ });
+ }
+ });
+ },
+ this.messageBusLastIds.channel_edits
+ );
}
_subscribeToChannelStatusChange() {
@@ -641,7 +661,7 @@ export default class Chat extends Service {
}
this.appEvents.trigger("chat:refresh-channel", channel.id);
- });
+ }, this.messageBusLastIds.channel_status);
});
}
@@ -658,9 +678,13 @@ export default class Chat extends Service {
}
_subscribeToNewChannelUpdates() {
- this.messageBus.subscribe("/chat/new-channel", (busData) => {
- this.startTrackingChannel(ChatChannel.create(busData.chat_channel));
- });
+ this.messageBus.subscribe(
+ "/chat/new-channel",
+ (busData) => {
+ this.startTrackingChannel(ChatChannel.create(busData.chat_channel));
+ },
+ this.messageBusLastIds.new_channel
+ );
}
_unsubscribeFromNewDmChannelUpdates() {
@@ -672,54 +696,71 @@ export default class Chat extends Service {
return;
}
+ // We do this first so we don't multi-subscribe to mention + messages
+ // messageBus channels for this chat channel, since _subscribeToSingleUpdateChannel
+ // is called from multiple places.
+ this._unsubscribeFromChatChannel(channel);
+
if (!channel.isDirectMessageChannel) {
this._subscribeToMentionChannel(channel);
}
- this.messageBus.subscribe(`/chat/${channel.id}/new-messages`, (busData) => {
- const trackingState =
- this.currentUser.chat_channel_tracking_state[channel.id];
-
- if (busData.user_id === this.currentUser.id) {
- // User sent message, update tracking state to no unread
- trackingState.set("chat_message_id", busData.message_id);
- } else {
- // Ignored user sent message, update tracking state to no unread
- if (this.currentUser.ignored_users.includes(busData.username)) {
- trackingState.set("chat_message_id", busData.message_id);
- } else {
- // Message from other user. Increment trackings state
- if (busData.message_id > (trackingState.chat_message_id || 0)) {
- trackingState.set("unread_count", trackingState.unread_count + 1);
- }
- }
- }
- this.userChatChannelTrackingStateChanged();
-
- // Update last_message_sent_at timestamp for channel if direct message
- const dmChatChannel = (this.directMessageChannels || []).findBy(
- "id",
- parseInt(channel.id, 10)
- );
- if (dmChatChannel) {
- dmChatChannel.set("last_message_sent_at", new Date());
- this.reSortDirectMessageChannels();
- }
- });
+ this._subscribeToNewMessagesChannel(channel);
}
_subscribeToMentionChannel(channel) {
- this.messageBus.subscribe(`/chat/${channel.id}/new-mentions`, () => {
- const trackingState =
- this.currentUser.chat_channel_tracking_state[channel.id];
- if (trackingState) {
- trackingState.set(
- "unread_mentions",
- (trackingState.unread_mentions || 0) + 1
- );
+ this.messageBus.subscribe(
+ `/chat/${channel.id}/new-mentions`,
+ () => {
+ const trackingState =
+ this.currentUser.chat_channel_tracking_state[channel.id];
+ if (trackingState) {
+ trackingState.set(
+ "unread_mentions",
+ (trackingState.unread_mentions || 0) + 1
+ );
+ this.userChatChannelTrackingStateChanged();
+ }
+ },
+ channel.message_bus_last_ids.new_mentions
+ );
+ }
+
+ _subscribeToNewMessagesChannel(channel) {
+ this.messageBus.subscribe(
+ `/chat/${channel.id}/new-messages`,
+ (busData) => {
+ const trackingState =
+ this.currentUser.chat_channel_tracking_state[channel.id];
+
+ if (busData.user_id === this.currentUser.id) {
+ // User sent message, update tracking state to no unread
+ trackingState.set("chat_message_id", busData.message_id);
+ } else {
+ // Ignored user sent message, update tracking state to no unread
+ if (this.currentUser.ignored_users.includes(busData.username)) {
+ trackingState.set("chat_message_id", busData.message_id);
+ } else {
+ // Message from other user. Increment trackings state
+ if (busData.message_id > (trackingState.chat_message_id || 0)) {
+ trackingState.set("unread_count", trackingState.unread_count + 1);
+ }
+ }
+ }
this.userChatChannelTrackingStateChanged();
- }
- });
+
+ // Update last_message_sent_at timestamp for channel if direct message
+ const dmChatChannel = (this.directMessageChannels || []).findBy(
+ "id",
+ parseInt(channel.id, 10)
+ );
+ if (dmChatChannel) {
+ dmChatChannel.set("last_message_sent_at", new Date());
+ this.reSortDirectMessageChannels();
+ }
+ },
+ channel.message_bus_last_ids.new_messages
+ );
}
async followChannel(channel) {
@@ -779,7 +820,8 @@ export default class Chat extends Service {
trackingState.set("unread_mentions", 0);
this.userChatChannelTrackingStateChanged();
}
- }
+ },
+ this.messageBusLastIds.user_tracking_state
);
}
diff --git a/plugins/chat/spec/requests/chat_channel_controller_spec.rb b/plugins/chat/spec/requests/chat_channel_controller_spec.rb
index 9e88a47f72..7ea20a6ed7 100644
--- a/plugins/chat/spec/requests/chat_channel_controller_spec.rb
+++ b/plugins/chat/spec/requests/chat_channel_controller_spec.rb
@@ -101,6 +101,21 @@ RSpec.describe Chat::ChatChannelsController do
expect(cc["current_user_membership"]["unread_mentions"]).to eq(1)
end
+ it "returns the last message bus ids for various message bus channels scoped to this channel id" do
+ sign_in(admin)
+ get "/chat/chat_channels.json"
+ expect(response.status).to eq(200)
+
+ expect(response.parsed_body["message_bus_last_ids"]["channel_metadata"]).not_to eq(nil)
+ expect(response.parsed_body["message_bus_last_ids"]["channel_edits"]).not_to eq(nil)
+ expect(response.parsed_body["message_bus_last_ids"]["channel_status"]).not_to eq(nil)
+ expect(response.parsed_body["message_bus_last_ids"]["new_channel"]).not_to eq(nil)
+
+ first_channel = response.parsed_body["public_channels"][0]
+ expect(first_channel["message_bus_last_ids"]["new_messages"]).not_to eq(nil)
+ expect(first_channel["message_bus_last_ids"]["new_mentions"]).not_to eq(nil)
+ end
+
describe "direct messages" do
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
diff --git a/plugins/chat/spec/requests/chat_controller_spec.rb b/plugins/chat/spec/requests/chat_controller_spec.rb
index ad42097db2..4d81dba48a 100644
--- a/plugins/chat/spec/requests/chat_controller_spec.rb
+++ b/plugins/chat/spec/requests/chat_controller_spec.rb
@@ -137,6 +137,11 @@ RSpec.describe Chat::ChatController do
expect(reactions[smile_emoji]["reacted"]).to be false
end
+ it "sends the last message bus id for the channel" do
+ get "/chat/#{chat_channel.id}/messages.json", params: { page_size: page_size }
+ expect(response.parsed_body["meta"]["channel_message_bus_last_id"]).not_to eq(nil)
+ end
+
describe "scrolling to the past" do
it "returns the correct messages in created_at, id order" do
get "/chat/#{chat_channel.id}/messages.json",
@@ -1030,7 +1035,8 @@ RSpec.describe Chat::ChatController do
}.to change {
user.notifications.where(notification_type: Notification.types[:chat_invitation]).count
}.by(1)
- notification = user.notifications.where(notification_type: Notification.types[:chat_invitation]).last
+ notification =
+ user.notifications.where(notification_type: Notification.types[:chat_invitation]).last
parsed_data = JSON.parse(notification[:data])
expect(parsed_data["chat_channel_title"]).to eq(chat_channel.title(user))
expect(parsed_data["chat_channel_slug"]).to eq(chat_channel.slug)
diff --git a/plugins/chat/spec/system/hashtag_autocomplete_spec.rb b/plugins/chat/spec/system/hashtag_autocomplete_spec.rb
index 203d2031f8..318e23bfb9 100644
--- a/plugins/chat/spec/system/hashtag_autocomplete_spec.rb
+++ b/plugins/chat/spec/system/hashtag_autocomplete_spec.rb
@@ -56,33 +56,30 @@ describe "Using #hashtag autocompletion to search for and lookup channels",
expect(hashtag_results.map(&:text)).to eq(["Raspberry", "razed x 0", "Random"])
end
- # TODO (martin) Commenting this out for now, we need to add the MessageBus
- # last_message_id to our chat subscriptions in JS for this to work, since it
- # relies on a MessageBus "sent" event to be published to substitute the
- # staged message ID for the real one.
- xit "cooks the hashtags for channels, categories, and tags serverside when the chat message is saved to the database" do
+ it "cooks the hashtags for channels, categories, and tags serverside when the chat message is saved to the database" do
chat_page.visit_channel(channel1)
expect(chat_channel_page).to have_no_loading_skeleton
- chat_channel_page.type_in_composer("this is #random and this is #raspberry and this is #razed which is cool")
+ chat_channel_page.type_in_composer("this is #random and this is #raspberry-beret and this is #razed which is cool")
chat_channel_page.click_send_message
+ message = nil
try_until_success do
- expect(ChatMessage.exists?(user: user, message: "this is #random and this is #raspberry and this is #razed which is cool")).to eq(true)
+ message = ChatMessage.find_by(user: user, message: "this is #random and this is #raspberry-beret and this is #razed which is cool")
+ expect(message).not_to eq(nil)
end
- message = ChatMessage.where(user: user).last
expect(chat_channel_page).to have_message(id: message.id)
within chat_channel_page.message_by_id(message.id) do
cooked_hashtags = page.all(".hashtag-cooked", count: 3)
expect(cooked_hashtags[0]["outerHTML"]).to eq(<<~HTML.chomp)
- Random
+ Random
HTML
expect(cooked_hashtags[1]["outerHTML"]).to eq(<<~HTML.chomp)
- raspberry
+ Raspberry
HTML
expect(cooked_hashtags[2]["outerHTML"]).to eq(<<~HTML.chomp)
- razed
+ razed
HTML
end
end
diff --git a/plugins/chat/test/javascripts/acceptance/chat-browse-test.js b/plugins/chat/test/javascripts/acceptance/chat-browse-test.js
index 87e91f2176..0b8e2bd8bd 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-browse-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-browse-test.js
@@ -20,6 +20,13 @@ acceptance("Discourse Chat - browse channels", function (needs) {
return helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
diff --git a/plugins/chat/test/javascripts/acceptance/chat-channel-info-test.js b/plugins/chat/test/javascripts/acceptance/chat-channel-info-test.js
index 98c9380129..0fea5fa284 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-channel-info-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-channel-info-test.js
@@ -14,8 +14,15 @@ acceptance("Discourse Chat - chat channel info", function (needs) {
const channel = fabricators.chatChannel();
server.get("/chat/chat_channels.json", () => {
return helper.response({
- publicMessageChannels: [channel],
- directMessageChannels: [],
+ public_channels: [],
+ direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
server.get("/chat/chat_channels/:id.json", () => {
diff --git a/plugins/chat/test/javascripts/acceptance/chat-channels-list-test.js b/plugins/chat/test/javascripts/acceptance/chat-channels-list-test.js
index 4646aaa446..51f664b3c5 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-channels-list-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-channels-list-test.js
@@ -26,6 +26,13 @@ acceptance(
direct_message_channels: cloneJSON(directMessageChannels).mapBy(
"chat_channel"
),
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
diff --git a/plugins/chat/test/javascripts/acceptance/chat-live-pane-collapse-test.js b/plugins/chat/test/javascripts/acceptance/chat-live-pane-collapse-test.js
index ad95b49b57..948b2b20f6 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-live-pane-collapse-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-live-pane-collapse-test.js
@@ -79,6 +79,13 @@ acceptance("Discourse Chat - Chat live pane collapse", function (needs) {
helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
diff --git a/plugins/chat/test/javascripts/acceptance/chat-live-pane-mobile-test.js b/plugins/chat/test/javascripts/acceptance/chat-live-pane-mobile-test.js
index a7fb328d45..e07872abd8 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-live-pane-mobile-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-live-pane-mobile-test.js
@@ -59,6 +59,13 @@ acceptance("Discourse Chat - Chat live pane mobile", function (needs) {
helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
diff --git a/plugins/chat/test/javascripts/acceptance/chat-live-pane-silenced-user-test.js b/plugins/chat/test/javascripts/acceptance/chat-live-pane-silenced-user-test.js
index 1316017f3d..06e9bd0bd6 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-live-pane-silenced-user-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-live-pane-silenced-user-test.js
@@ -57,9 +57,20 @@ acceptance("Discourse Chat - Chat live pane", function (needs) {
id: 1,
title: "something",
current_user_membership: { following: true },
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
diff --git a/plugins/chat/test/javascripts/acceptance/chat-live-pane-test.js b/plugins/chat/test/javascripts/acceptance/chat-live-pane-test.js
index c348161d78..038bf6788f 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-live-pane-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-live-pane-test.js
@@ -85,9 +85,20 @@ acceptance(
id: 1,
title: "something",
current_user_membership: { following: true },
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
@@ -198,9 +209,17 @@ acceptance(
id: 1,
title: "something",
current_user_membership: { following: true },
+ message_bus_last_ids: { new_mentions: 0, new_messages: 0 },
},
],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
@@ -246,6 +265,13 @@ acceptance(
helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
@@ -292,6 +318,13 @@ acceptance(
helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
diff --git a/plugins/chat/test/javascripts/acceptance/chat-preferences-test.js b/plugins/chat/test/javascripts/acceptance/chat-preferences-test.js
index 0c6332b1b7..80ed0d4a88 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-preferences-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-preferences-test.js
@@ -15,7 +15,7 @@ acceptance("Discourse Chat | User Preferences", function (needs) {
needs.settings({ chat_enabled: true });
needs.pretender(preferencesPretender);
- test("when user has not chat sound set", async function (assert) {
+ test("when user has no chat sound set", async function (assert) {
const sounds = Object.keys(CHAT_SOUNDS);
await visit("/u/eviltrout/preferences/chat");
const dropdown = selectKit("#user_chat_sounds");
diff --git a/plugins/chat/test/javascripts/acceptance/chat-sidebar-user-status-test.js b/plugins/chat/test/javascripts/acceptance/chat-sidebar-user-status-test.js
index 0cb4d62fdc..25d45bf18d 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-sidebar-user-status-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-sidebar-user-status-test.js
@@ -34,12 +34,23 @@ acceptance("Discourse Chat - Sidebar - User Status", function (needs) {
},
chatable_type: "DirectMessage",
title: "@user1",
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
};
server.get("/chat/chat_channels.json", () => {
return helper.response({
public_channels: [],
direct_message_channels: [directMessageChannel],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
});
diff --git a/plugins/chat/test/javascripts/acceptance/chat-transcript-test.js b/plugins/chat/test/javascripts/acceptance/chat-transcript-test.js
index 00767d0071..98ff2a6b8b 100644
--- a/plugins/chat/test/javascripts/acceptance/chat-transcript-test.js
+++ b/plugins/chat/test/javascripts/acceptance/chat-transcript-test.js
@@ -474,6 +474,13 @@ acceptance(
helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
@@ -525,6 +532,13 @@ acceptance(
helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
diff --git a/plugins/chat/test/javascripts/acceptance/core-sidebar-test.js b/plugins/chat/test/javascripts/acceptance/core-sidebar-test.js
index ea3381104e..fe3968b5c9 100644
--- a/plugins/chat/test/javascripts/acceptance/core-sidebar-test.js
+++ b/plugins/chat/test/javascripts/acceptance/core-sidebar-test.js
@@ -54,6 +54,10 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
muted: true,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
});
directChannels.push({
chatable: {
@@ -82,6 +86,10 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
muted: false,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
});
server.get("/chat/chat_channels.json", () => {
@@ -97,6 +105,10 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
unread_count: 0,
unread_mentions: 0,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 2,
@@ -108,6 +120,10 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
unread_count: 1,
unread_mentions: 0,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 3,
@@ -121,6 +137,10 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
unread_count: 1,
unread_mentions: 1,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 4,
@@ -132,15 +152,30 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
unread_count: 1,
unread_mentions: 1,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
],
direct_message_channels: directChannels,
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
server.get("/chat/1/messages.json", () =>
helper.response({
- meta: { can_chat: true, user_silenced: false },
+ meta: {
+ can_chat: true,
+ user_silenced: false,
+ channel_message_bus_last_id: 0,
+ },
chat_messages: [],
})
);
@@ -510,6 +545,10 @@ acceptance("Discourse Chat - Plugin Sidebar", function (needs) {
unread_count: 1,
unread_mentions: 1,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 2,
@@ -521,6 +560,10 @@ acceptance("Discourse Chat - Plugin Sidebar", function (needs) {
unread_count: 1,
unread_mentions: 1,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 3,
@@ -532,9 +575,20 @@ acceptance("Discourse Chat - Plugin Sidebar", function (needs) {
unread_count: 1,
unread_mentions: 1,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
@@ -568,6 +622,13 @@ acceptance(
return helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
});
@@ -604,6 +665,13 @@ acceptance(
return helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
});
@@ -640,6 +708,13 @@ acceptance(
return helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
});
@@ -679,6 +754,13 @@ acceptance(
return helper.response({
public_channels: [],
direct_message_channels: directChannels,
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
});
diff --git a/plugins/chat/test/javascripts/acceptance/create-channel-test.js b/plugins/chat/test/javascripts/acceptance/create-channel-test.js
index a478f2225c..2a456ef100 100644
--- a/plugins/chat/test/javascripts/acceptance/create-channel-test.js
+++ b/plugins/chat/test/javascripts/acceptance/create-channel-test.js
@@ -55,6 +55,13 @@ acceptance("Discourse Chat - Create channel modal", function (needs) {
helper.response({
public_channels: [],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
})
);
diff --git a/plugins/chat/test/javascripts/acceptance/delete-chat-channel-modal-test.js b/plugins/chat/test/javascripts/acceptance/delete-chat-channel-modal-test.js
index 7510ae1450..48c717c273 100644
--- a/plugins/chat/test/javascripts/acceptance/delete-chat-channel-modal-test.js
+++ b/plugins/chat/test/javascripts/acceptance/delete-chat-channel-modal-test.js
@@ -13,6 +13,13 @@ acceptance("Discourse Chat - delete chat channel modal", function (needs) {
return helper.response({
public_channels: [fabricators.chatChannel({ id: 2 })],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});
diff --git a/plugins/chat/test/javascripts/chat-fixtures.js b/plugins/chat/test/javascripts/chat-fixtures.js
index c8ab615160..e91f5b563a 100644
--- a/plugins/chat/test/javascripts/chat-fixtures.js
+++ b/plugins/chat/test/javascripts/chat-fixtures.js
@@ -32,6 +32,10 @@ export const directMessageChannels = [
following: true,
},
last_message_sent_at: "2021-07-20T08:14:16.950Z",
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
},
{
@@ -63,6 +67,10 @@ export const directMessageChannels = [
following: true,
},
last_message_sent_at: "2021-07-05T12:04:00.850Z",
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
},
];
@@ -105,6 +113,10 @@ export const chatChannels = {
muted: false,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 7,
@@ -120,6 +132,10 @@ export const chatChannels = {
muted: false,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 4,
@@ -135,6 +151,10 @@ export const chatChannels = {
muted: false,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 5,
@@ -150,6 +170,10 @@ export const chatChannels = {
muted: false,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 6,
@@ -165,6 +189,10 @@ export const chatChannels = {
muted: false,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 10,
@@ -180,6 +208,10 @@ export const chatChannels = {
muted: false,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
{
id: 11,
@@ -195,9 +227,20 @@ export const chatChannels = {
muted: false,
following: true,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
],
direct_message_channels: directMessageChannels.mapBy("chat_channel"),
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
};
const message0 = {
diff --git a/plugins/chat/test/javascripts/helpers/fabricators.js b/plugins/chat/test/javascripts/helpers/fabricators.js
index a316792cba..fdc766f2c1 100644
--- a/plugins/chat/test/javascripts/helpers/fabricators.js
+++ b/plugins/chat/test/javascripts/helpers/fabricators.js
@@ -31,6 +31,10 @@ export default {
name: "My category name",
chatable: categoryChatableFabricator(),
last_message_sent_at: "2021-11-08T21:26:05.710Z",
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
}),
chatChannelMessage: Fabricator(EmberObject, {
@@ -46,5 +50,9 @@ export default {
status: "open",
chatable: directChannelChatableFabricator(),
last_message_sent_at: "2021-11-08T21:26:05.710Z",
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
}),
};
diff --git a/plugins/chat/test/javascripts/unit/services/chat-test.js b/plugins/chat/test/javascripts/unit/services/chat-test.js
index ebcb36da95..f08d6730da 100644
--- a/plugins/chat/test/javascripts/unit/services/chat-test.js
+++ b/plugins/chat/test/javascripts/unit/services/chat-test.js
@@ -39,9 +39,20 @@ acceptance("Discourse Chat | Unit | Service | chat", function (needs) {
unread_mentions: 0,
muted: false,
},
+ message_bus_last_ids: {
+ new_mentions: 0,
+ new_messages: 0,
+ },
},
],
direct_message_channels: [],
+ message_bus_last_ids: {
+ channel_metadata: 0,
+ channel_edits: 0,
+ channel_status: 0,
+ new_channel: 0,
+ user_tracking_state: 0,
+ },
});
});