-
-
Notifications
You must be signed in to change notification settings - Fork 173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: jumpToMessage flashing the bottom of new chat #4562
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fa202d8
to
7a77c6b
Compare
7a77c6b
to
fb94da3
Compare
nicodh
approved these changes
Jan 31, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewed by testing
That is, when you jump to a message in a different chat (e.g. by clicking on a notification, or from message search, or from a "private reply" quote), we would momentarily show the new chat scrolled to bottom prior to jumping to the desired message. Why this is bad: - We mark the visible messages as read. In this case that would be the last messages in the chat. But they weren't actually read, the user did not intend to scroll to them. - Extra layout shifting: not great visually. - Bad for performance. Let's just load the part of the chat that we need right away. Related: - #4508 - #4510 - #4554
fb94da3
to
7aafc25
Compare
WofWca
added a commit
that referenced
this pull request
Feb 15, 2025
To reproduce, simply double click on a chat in the chat list really fast. Or: ```javascript item = document.querySelector( '.chat-list-item:not(.archive-link-item):not(.selected)' ); chatListItem.click(); // Let React re-render, then click again. setTimeout(() => chatListItem.click()); ``` The problem is, in `selectChat` we have code that is supposed to jump to the last message when the currently selected chat gets clicked again. However, if the chat has not loaded yet, and thus a new instance of `MessageListStore` has not been created yet, and thus its `loadChat()` has not been called yet, then, when `loadChat()` does get called eventually, it will see that `__internal_jump_to_message_asap` is set, and so it will call `__jumpToMessage`, with `msgId: undefined`. But, it turns out, `__jumpToMessage` cannot handle this case. It would try to look up the last message in `this.state.messageListItems`, but it is empty (see the `items.length <= 0` line), so `__jumpToMessage()` would simply return and do nothing, resulting in an empty chat. But `messageListItems` is empty not because there are really no messages in the chat, but because `MessageListStore` has not loaded anything yet, because, as you remember, `loadChat()` delegated its responsibility to `__jumpToMessage()`. This commit ensures that `__jumpToMessage()` handles the case where `MessageListStore` has not loaded anything yet, and where `msgId === undefined`. It appears that the reproduction steps above is the only way this bug can occur, because it's pretty much the only way to have `msgId: undefined` (except for the "jump down" button). So this commit probably doesn't fix any other current bugs. The issue that this commit fixes was likely introduced in #4562 (637497c).
WofWca
added a commit
that referenced
this pull request
Feb 15, 2025
To reproduce, simply double click on a chat in the chat list really fast. Or: ```javascript item = document.querySelector( '.chat-list-item:not(.archive-link-item):not(.selected)' ); chatListItem.click(); // Let React re-render, then click again. setTimeout(() => chatListItem.click()); ``` The problem is, in `selectChat` we have code that is supposed to jump to the last message when the currently selected chat gets clicked again. However, if the chat has not loaded yet, and thus a new instance of `MessageListStore` has not been created yet, and thus its `loadChat()` has not been called yet, then, when `loadChat()` does get called eventually, it will see that `__internal_jump_to_message_asap` is set, and so it will call `__jumpToMessage`, with `msgId: undefined`. But, it turns out, `__jumpToMessage` cannot handle this case. It would try to look up the last message in `this.state.messageListItems`, but it is empty (see the `items.length <= 0` line), so `__jumpToMessage()` would simply return and do nothing, resulting in an empty chat. But `messageListItems` is empty not because there are really no messages in the chat, but because `MessageListStore` has not loaded anything yet, because, as you remember, `loadChat()` delegated its responsibility to `__jumpToMessage()`. This commit ensures that `__jumpToMessage()` handles the case where `MessageListStore` has not loaded anything yet, and where `msgId === undefined`. It appears that the reproduction steps above is the only way this bug can occur, because it's pretty much the only way to have `msgId: undefined` (except for the "jump down" button). So this commit probably doesn't fix any other current bugs. The issue that this commit fixes was likely introduced in #4562 (637497c).
WofWca
added a commit
that referenced
this pull request
Feb 18, 2025
To reproduce, simply double click on a chat in the chat list really fast. Or: ```javascript item = document.querySelector( '.chat-list-item:not(.archive-link-item):not(.selected)' ); chatListItem.click(); // Let React re-render, then click again. setTimeout(() => chatListItem.click()); ``` The problem is, in `selectChat` we have code that is supposed to jump to the last message when the currently selected chat gets clicked again. However, if the chat has not loaded yet, and thus a new instance of `MessageListStore` has not been created yet, and thus its `loadChat()` has not been called yet, then, when `loadChat()` does get called eventually, it will see that `__internal_jump_to_message_asap` is set, and so it will call `__jumpToMessage`, with `msgId: undefined`. But, it turns out, `__jumpToMessage` cannot handle this case. It would try to look up the last message in `this.state.messageListItems`, but it is empty (see the `items.length <= 0` line), so `__jumpToMessage()` would simply return and do nothing, resulting in an empty chat. But `messageListItems` is empty not because there are really no messages in the chat, but because `MessageListStore` has not loaded anything yet, because, as you remember, `loadChat()` delegated its responsibility to `__jumpToMessage()`. This commit ensures that `__jumpToMessage()` handles the case where `MessageListStore` has not loaded anything yet, and where `msgId === undefined`. It appears that the reproduction steps above is the only way this bug can occur, because it's pretty much the only way to have `msgId: undefined` (except for the "jump down" button). So this commit probably doesn't fix any other current bugs. The issue that this commit fixes was likely introduced in #4562 (637497c).
WofWca
added a commit
that referenced
this pull request
Feb 18, 2025
To reproduce, simply double click on a chat in the chat list really fast. Or: ```javascript item = document.querySelector( '.chat-list-item:not(.archive-link-item):not(.selected)' ); chatListItem.click(); // Let React re-render, then click again. setTimeout(() => chatListItem.click()); ``` The problem is, in `selectChat` we have code that is supposed to jump to the last message when the currently selected chat gets clicked again. However, if the chat has not loaded yet, and thus a new instance of `MessageListStore` has not been created yet, and thus its `loadChat()` has not been called yet, then, when `loadChat()` does get called eventually, it will see that `__internal_jump_to_message_asap` is set, and so it will call `__jumpToMessage`, with `msgId: undefined`. But, it turns out, `__jumpToMessage` cannot handle this case. It would try to look up the last message in `this.state.messageListItems`, but it is empty (see the `items.length <= 0` line), so `__jumpToMessage()` would simply return and do nothing, resulting in an empty chat. But `messageListItems` is empty not because there are really no messages in the chat, but because `MessageListStore` has not loaded anything yet, because, as you remember, `loadChat()` delegated its responsibility to `__jumpToMessage()`. This commit ensures that `__jumpToMessage()` handles the case where `MessageListStore` has not loaded anything yet, and where `msgId === undefined`. It appears that the reproduction steps above is the only way this bug can occur, because it's pretty much the only way to have `msgId: undefined` (except for the "jump down" button). So this commit probably doesn't fix any other current bugs. The issue that this commit fixes was likely introduced in #4562 (637497c).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is based on #4561 and #4554. This MR is about just the last commit.Before:
2025-01-25-dJg0vlnERM.mp4
After:
2025-01-25-3MvuK7WRE8.mp4
That is, when you jump to a message in a different chat
(e.g. by clicking on a notification, or from message search,
or from a "private reply" quote),
we would momentarily show the new chat scrolled to bottom
prior to jumping to the desired message.
Why this is bad:
In this case that would be the last messages in the chat.
But they weren't actually read, the user did not intend
to scroll to them.
that we need right away.
Related:
jumpToMessage
not working sometimes #4510__jump_to_message
reliability #4554