From aee7197c435c44399c4bcfd6ed1c87763b726cb7 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Fri, 19 Jan 2024 22:49:14 +0100 Subject: [PATCH] FIX: correctly save scroll position in channel (#25345) Due to an incorrect test the previous service was incorrectly implementing the map, and was most importantly not deleting the state when reaching bottom. --- .../discourse/components/chat-channel.gjs | 2 +- .../services/chat-channel-scroll-positions.js | 14 +++++++++----- plugins/chat/spec/system/chat_channel_spec.rb | 8 +++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/plugins/chat/assets/javascripts/discourse/components/chat-channel.gjs b/plugins/chat/assets/javascripts/discourse/components/chat-channel.gjs index 87eddf7955f..f93fe4c88e0 100644 --- a/plugins/chat/assets/javascripts/discourse/components/chat-channel.gjs +++ b/plugins/chat/assets/javascripts/discourse/components/chat-channel.gjs @@ -497,7 +497,7 @@ export default class ChatChannel extends Component { if (state.atBottom) { this.fetchMoreMessages({ direction: FUTURE }); - this.chatChannelScrollPositions.remove(this.args.channel.id); + this.chatChannelScrollPositions.delete(this.args.channel.id); } else { this.chatChannelScrollPositions.set( this.args.channel.id, diff --git a/plugins/chat/assets/javascripts/discourse/services/chat-channel-scroll-positions.js b/plugins/chat/assets/javascripts/discourse/services/chat-channel-scroll-positions.js index 9a4888c7608..70602e94fa5 100644 --- a/plugins/chat/assets/javascripts/discourse/services/chat-channel-scroll-positions.js +++ b/plugins/chat/assets/javascripts/discourse/services/chat-channel-scroll-positions.js @@ -5,13 +5,17 @@ import { TrackedMap } from "@ember-compat/tracked-built-ins"; export default class ChatChannelScrollPositions extends Service { @tracked positions = new TrackedMap(); - add(channelId, position) { - this.positions.set(channelId, position); + get(id) { + return this.positions.get(id); } - remove(channelId) { - if (this.positions.has(channelId)) { - this.positions.delete(channelId); + set(id, position) { + this.positions.set(id, position); + } + + delete(id) { + if (this.positions.has(id)) { + this.positions.delete(id); } } } diff --git a/plugins/chat/spec/system/chat_channel_spec.rb b/plugins/chat/spec/system/chat_channel_spec.rb index 1acbb05eb9b..37b7d66406e 100644 --- a/plugins/chat/spec/system/chat_channel_spec.rb +++ b/plugins/chat/spec/system/chat_channel_spec.rb @@ -375,7 +375,13 @@ RSpec.describe "Chat channel", type: :system do sidebar_page.open_channel(channel_2) sidebar_page.open_channel(channel_1) - expect(channel_page.messages).to have_message(id: channel_1.chat_messages[2].id) + expect(channel_page.messages).to have_no_message(id: channel_1.chat_messages[49].id) + + find(".chat-scroll-to-bottom__button.visible").click + sidebar_page.open_channel(channel_2) + sidebar_page.open_channel(channel_1) + + expect(channel_page.messages).to have_message(id: channel_1.chat_messages[49].id) end end end