-
Notifications
You must be signed in to change notification settings - Fork 3k
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: re-calc the marker when msgs are deleted #42742
Conversation
Signed-off-by: dominictb <[email protected]>
Signed-off-by: dominictb <[email protected]>
@allroundexperts Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
Reviewer Checklist
Screenshots/VideosAndroid: NativeScreen.Recording.2024-06-10.at.3.47.20.AM.movAndroid: mWeb ChromeScreen.Recording.2024-06-10.at.3.45.56.AM.moviOS: NativeScreen.Recording.2024-06-10.at.3.44.15.AM.moviOS: mWeb SafariScreen.Recording.2024-06-10.at.3.42.33.AM.movMacOS: Chrome / SafariScreen.Recording.2024-06-10.at.3.38.35.AM.movMacOS: DesktopScreen.Recording.2024-06-10.at.3.40.36.AM.mov |
BUG Unread marker disappears after the second message is deleted. Screen.Recording.2024-06-02.at.1.21.21.AM.mov |
on my way :< |
Signed-off-by: dominictb <[email protected]>
@allroundexperts fixed in the latest commit |
Not able to test this currently because the API seems to be super slow and new messages aren't showing up. Will check back tomorrow. |
@situchan please help review again. |
@dominictb The above issue is still not fixed. Please make sure to test it and post a video of it working. TY! Screen.Recording.2024-06-10.at.3.36.22.AM.mov |
Signed-off-by: dominictb <[email protected]>
@allroundexperts should be alright now. Seems like I pushed the wrong version up during rebase. web8.mp4 |
Signed-off-by: dominictb <[email protected]>
Signed-off-by: dominictb <[email protected]>
Signed-off-by: dominictb <[email protected]>
@allroundexperts do you think you can review this soon? |
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.
Works good. Thank you!
@@ -490,21 +492,37 @@ function ReportActionsList({ | |||
return ReportUtils.isExpenseReport(report) || ReportUtils.isIOUReport(report); | |||
}, [parentReportAction, report, sortedVisibleReportActions]); | |||
|
|||
// storing the last read time used to render the unread marker | |||
const markerLastReadTimeRef = useRef<string | undefined>(); |
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.
Do we really need to save the lastReadTime
in a ref twice? It is already being saved here:
const lastReadTimeRef = useRef(report.lastReadTime); |
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.
@arosiclair in my proposal #41935 (comment) it should have been explained clearly. In short, the original issue here is because the lastReadTimeRef
is tied tightly with report.lastReadTime
, so in case we re-calculate the unread marker, the lastReadTimeRef
has been updated with report.lastReadTime
value, causing the unread marker to disappear.
My main solution is that we will persist another lastReadTimeRef
, called markerLastReadTimeRef
which is tied to the currentUnreadMarker
, i.e: it will be set with lastReadTimeRef.current
if the unread marker first appears during calculation (changing from undefined
-> defined value), and it shouldn't change its own value if the unread marker still exists in the screen. We'll clear the markerLastReadTimeRef
if the unread marker disappears from the screen (changing from defined value
-> undefined/null
)
Hope that's clear!
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.
so in case we re-calculate the unread marker, the lastReadTimeRef has been updated with report.lastReadTime value, causing the unread marker to disappear.
Where exactly is this happening? Is there a way we can prevent that from happening? From what I understand, the marker time should only change when the user marks a message as unread. So any other change would be unintended.
Let's try fixing the original lastReadTimeRef
before adding another one since this functionality is already confusing and complex as it is.
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.
@arosiclair as explained in my proposal as well as here, the lastReadTimeRef.current
has already been set to the report.lastReadTime
the first time the unread marker is calculated, and it stays the same after that (or changes if the report.lastReadTime
changes). Hence, we couldn't use lastReadTimeRef
to re-calc the marker in case the sortedVisibleReportActions
changes.
(And you already approved my proposal 😅 )
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.
To be clear, I hired you for the job but your proposal was not fully satisfactory. Please work with me to get this PR in a better place.
I'm asking these questions again, please answer them directly: When the message is deleted, where exactly is the lastReadTimeRef
being cleared? Is there a way we can prevent that from happening?
If the answer is yes (I believe it is), then we shouldn't need to save the time for the marker twice. Instead we can just fix the issue where lastReadTimeRef
is being cleared when it shouldn't be.
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.
When the message is deleted, where exactly is the lastReadTimeRef being cleared?
The lastReadTimeRef is tied to the report.lastReadTime
in here. The thing is, when you open a report, the unread marker will be calculated using the old report.lastReadTime
(which is saved in lastReadTimeRef.current
) in here. However, after a short while, the OpenReport API (see the image below) has updated the report.lastReadTime
to a new timestamp (which is larger than the last message timestamp).
However, since the unread marker has already been set, in here the calculateUnreadMarker
function will still render the unread marker. Now when a message associated with the unread marker is deleted, we face 2 issues:
- The
shouldDisplayNewMarker
here is trying to compare the message with the outdatedcurrentUnreadMarker
(which associated message has been deleted). - Even if we fix the (1) issue, we couldn't use
lastReadTimeRef.current
to calculate new marker since thereport.lastReadTime
has been updated to a timestamp larger than the latest message timestamp as mentioned above
Is there a way we can prevent that from happening?
We'll still need a FE change to fix (1)
For (2) either we can fix the report.lastReadTime
in the OpenReport API (which I think this involves lots of complication, as report.lastReadTime
is used elsewhere, e.g: showing the unread status of the report in LHN), or we can employ the solution in this PR (which is fully FE, more simple and elegant which doesn't touch the report.lastReadTime
value)
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.
@arosiclair hope that's clear enough for you!
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.
Thanks for the explanation. I took a closer look at this component and realized it needs a bit of a refactor to fix this issue properly and I can't really communicate that through PR comments. I'm going to merge your changes since they work and are covered with tests but I'm also going to make a follow up issue to clean this up.
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
🚀 Deployed to staging by https://github.com/arosiclair in version: 9.0.1-0 🚀
|
Hey, I think this introduced a regression here. As we have a lot of blockers I'll not yet revert this but this will need to be looked at quite quickly. |
🚀 Deployed to production by https://github.com/yuwenmemon in version: 9.0.1-19 🚀
|
Details
Update the logic to calculate the unread marker to fix the issue where marker disappears when the message is deleted
Fixed Issues
$ #41935
PROPOSAL: #41935 (comment)
Tests
Open the testing app as first user
Open any chat as user A (not the chat with user B)
As a use B send multiple messages (e..g, 1,2,3,4)
As user A open the chat with user B and observe the new message marker
As user B delete the first message sent (under the new message marker)
Expected: New message marker to change place to the 2nd new message sent
Offline tests
QA Steps
Open the testing app as first user
Open any chat as user A (not the chat with user B)
As a use B send multiple messages (e..g, 1,2,3,4)
As user A open the chat with user B and observe the new message marker
As user B delete the first message sent (under the new message marker)
Expected: New message marker to change place to the 2nd new message sent
PR Author Checklist
### Fixed Issues
section aboveTests
sectionOffline steps
sectionQA steps
sectiontoggleReport
and notonIconClick
)myBool && <MyComponent />
.src/languages/*
files and using the translation methodSTYLE.md
) were followedAvatar
, I verified the components usingAvatar
are working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)
)Avatar
is modified, I verified thatAvatar
is working as expected in all cases)Design
label and/or tagged@Expensify/design
so the design team can review the changes.ScrollView
component to make it scrollable when more elements are added to the page.main
branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTest
steps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
aweb.webm
iOS: Native
iOS: mWeb Safari
iosweb.mp4
MacOS: Chrome / Safari
MacOS: Desktop
web-8.mp4