fix: reusing PagingData crash [WPB-15055][WPB-15079][WPB-15064] 🍒 #3778
+200
−91
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 PR was manually cherry-picked based on the following PR:
Original PR description:
PR Submission Checklist for internal contributors
The PR Title
SQPIT-764
The PR Description
What's new in this PR?
Issues
There are crashes related to reusing
PagingData
flow when doing some actions on paginated conversation list screen, like accepting legal hold request, answering 1:1 call or opening pending connection request which can fetch user data.Causes (Optional)
Each action that modifies (or even puts the same exact data but just requires executing insert, update or delete query) a table that then affects paginated conversation list query, makes this query dirty and executes it again, which reloads the list.
When using
combine
, it creates a new instance of flow, so if thecombine
is used afterPagingData
is created then if the data is changed and emitted by the flow that's combined, it will re-use the samePagingData
and put it into a new flow, socachedIn
won't cache the flow properly and it will crash becausePagingData
cannot be used twice.Solutions
Move
combine
"above" thePagingData
flow so that each time a new value is emitted, it will always create a newPagingData
for the new flow and alsocachedIn
will be used correctly.Simplify
showLoading
parameter to be a simple logical equation rather than a state. Make use of mockedpreviewConversationFoldersFlow
with properLoadStates
to represent loaded data instead of using specificinitiallyLoaded
parameter.Fix
rememberSearchbarState
so that it actually saves thesearchQueryTextState
.Testing
Test Coverage (Optional)
How to Test
The crash was happening when opening pending connection request (most frequently), answering 1:1 call or accepting legal hold request, so these actions shouldn't crash the app. Also, after opening connection request or 1:1 conversation, if your or that user's data hasn't changed since the last fetch, then it shouldn't refresh the conversation list when navigating back.
Attachments (Optional)
refreshing_when_going_back.mp4
no_refreshing_when_going_back.mp4
pagination_crash.mp4
PR Post Submission Checklist for internal contributors (Optional)
PR Post Merge Checklist for internal contributors
References
feat(conversation-list): Sort conversations by most emojis in the title #SQPIT-764
.