Repository navigation
[LegendList 6/9] feat: migrate report actions to chronological LegendList - #100733
chrispader wants to merge 106 commits into
Conversation
1bac411 to
c067b0c
Compare
c067b0c to
e784ebe
Compare
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f616302cdb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
f616302 to
2a3323a
Compare
|
|
|
Yep. This PR has quite a broad impact. I asked Codex to generate a testing checklist, and it came up with a lot of test cases. |
Co-authored-by: Codex <noreply@openai.com>
Merge the independently reviewable composer and row-state preparation branches without rewriting the existing migration history. The migration-only comparison is 35 files, with the legacy FlashList type bridge as the only shared path. Drop the unrelated telemetry cleanup and restore the existing iOS callback structure. Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Infer the action subscriber callback type without exporting its event source. Co-authored-by: Codex <noreply@openai.com>
Remove the upstreamed Fabric content-size patch and port the Android end-clamp patch to the new release. Co-authored-by: Codex <noreply@openai.com>
Preserve chronological scrolling and main's live-range badge tracking. Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
|
Chris's AI pit crew checking in. 🤖 @roryabraham The MVCP anchor-selection fix, including LegendList's zero-sized anchor handling, has merged upstream in react-native#57959 as |
Co-authored-by: Codex <noreply@openai.com>
Preserve collapsed system messages, focus handoff, and scroll targets with chronological row indexes. Co-authored-by: Codex <noreply@openai.com>
Resolve preparation-layer conflicts and keep scrolling through the chronological list API. Co-authored-by: Codex <noreply@openai.com>
Name the requested scroll destination and explain the FlashList layout dependency. Co-authored-by: Codex <noreply@openai.com>
Keep the collapsed-target regression test aligned with the chronological report list. Co-authored-by: Codex <noreply@openai.com>
Older browsers lack Array.prototype.toReversed and the app has no polyfill for it, so copy and reverse the newest-first actions instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Document why each effect in useLinkedReportActionScroll is needed and correct the LegendList version in the React Native MVCP patch notes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Preserve Concierge welcome and history controls with the chronological list. Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Carry the Concierge feedback fix into the extracted list component and preserve pagination IDs for history restoration. Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
|
@chrispader Could you confirm whether these bugs have been fixed? I just noticed that Bug 1 is still reproducible |
Keep cached messages covered until LegendList finishes positioning them. Offline reports still skip waiting for the queued OpenReport request. Co-authored-by: Codex <noreply@openai.com>
The report-actions list currently uses inversion, so rendering order and scroll coordinates differ from chronological message order. This PR moves the main chat list to LegendList and updates pagination, unread tracking, message editing, recycling, and initial loading behavior to work with chronological data.
@roryabraham @dmkt9
@Expensify/design Please review the initial chat-loading skeleton shown below.
Explanation of Change
This is layer 6 of the nine-part LegendList rollout. It moves the main report-actions list to chronological LegendList data and updates pagination, unread tracking, linked-message positioning, end following, and the initial loading cover. LegendList 3.7.0 includes the upstream Fabric content-size fix. The Android end-clamp and React Native scroll-preservation patches remain with this migration.
Composer focus and notification preparation landed in layer 4, #104977. Shared list refs, row state, and money-report edit scrolling landed in layer 5, #104978.
The first time a chat opens online after the app starts, the skeleton stays over its cached messages until OpenReport finishes and the list is positioned, so estimated row positions never show. The warm open-report span ends when the positioned messages replace that cover.
Fixed Issues
$ #98994
This PR is part of the migration split from #98270. No approved proposal is linked.
Tests
All platforms means desktop web, mobile web, Android, and iOS.
Use a second test account in the same chat for the incoming-message cases.
Web, first open and return to a chat
Android and iOS apps, first open and return to a chat
All platforms, message history and incoming messages
All platforms, a link to an older message
All platforms, reopening a chat with a recent unread message
All platforms, edit the newest and an older message
All platforms, formatted messages and attachments after scrolling
*bold* _italic_ ~strike~ https://example.com. The formatting should render correctly.Web, opening a chat URL after signing in
Android and iOS apps, keyboard and message-box resizing
Offline tests
All platforms, cached chats offline and history after reconnecting
QA Steps
Run the All platforms cases and the blocks for the platform being tested, including Offline tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Cold chat open and initial loading
FlashList is on the left and LegendList is on the right. FlashList leaves the report body blank during loading; LegendList shows the report-action skeleton before messages appear.
ColdOpenLoading.mp4
Cold expense-chat open
FlashList is on the left and LegendList is on the right. Both progress from the loading skeleton to an expense preview and its surrounding report actions.
Android screen recording TBD.
Warm expense-chat open
FlashList is on the left and LegendList is on the right. Both open the cached expense preview and report actions from the inbox.
Android screen recording TBD.
Warm chat open
Side-by-side opens of the same cached chat, ending on the same report-action history. The implementations are not labeled in this recording.
Android screen recording TBD.
Android: mWeb Chrome
iOS: Native
Cold chat open and initial loading
FlashList is on the left and LegendList is on the right. FlashList leaves the report body blank during loading; LegendList shows the report-action skeleton before messages appear.
LegendListLoadingSkeletonVsFlashList.mp4
Cold expense-chat open
FlashList is on the left and LegendList is on the right. Both progress from the loading skeleton to an expense preview and its surrounding report actions.
ExpenseChatCold.mp4
Warm expense-chat open
FlashList is on the left and LegendList is on the right. Both open the cached expense preview and report actions from the inbox.
ExpenseChatWarm.mp4
Warm chat open
Side-by-side opens of the same cached chat, ending on the same report-action history. The implementations are not labeled in this recording.
LegendListWarmReportOpen.mp4
iOS: mWeb Safari
MacOS: Chrome / Safari