Skip to content

[HOLD on #106626] [LegendList 12/15] feat: migrate report actions to chronological LegendList - #100733

Open
chrispader wants to merge 148 commits into
Expensify:mainfrom
margelo:@chrispader/feat/legend-list-report-actions
Open

chrispader wants to merge 148 commits into
Expensify:mainfrom
margelo:@chrispader/feat/legend-list-report-actions

Conversation

@chrispader

@chrispader chrispader commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor

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 12 of the fifteen-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 initial loading.

The migration builds on the LegendList foundation merged in layer 10, #106095 and the keyboard fix merged in #106003.

The shared list intentionally selects platform-specific accessibility attributes and the native action-sheet scroller at its LegendList boundary so they use the same list ref and positioning lifecycle.

The pagination ordering fix in #106359 is now merged. This migration builds on layer 11, #106626 for the upstream LegendList patches and #106687 for cached-chat scroll preservation on reconnect. The reconnect fix applies to the existing FlashList implementation independently of this migration.

On an initial online load, the skeleton covers cached messages until OpenReport finishes and the list is positioned. Cached chats stay mounted on reconnect, and restored drafts wait for the loading cover to disappear before taking focus. The warm open-report span ends when the positioned messages replace that cover.

Android's native scroll anchoring could briefly show the updated message positions at the previous visible offset when earlier messages finished measuring. This PR backports the redraw fix from react/react-native#58187 so the corrected offset is visible in the same frame.

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

  1. Reload the app.
  2. Open a chat. A single loading placeholder should give way to correctly positioned messages.
  3. Open a different chat.
  4. Return to the first chat. Its messages should settle without jumping to older rows.

Android and iOS apps, first open and return to a chat

  1. Close the app.
  2. Reopen the app.
  3. Open a chat. A single loading placeholder should give way to correctly positioned messages.
  4. Open a different chat.
  5. Return to the first chat. Its messages should settle without jumping to older rows.

Android app, returning from an older thread

  1. Open a chat with messages of varying heights.
  2. Open an older message's thread.
  3. Tap the Thread label above the parent message to return to the chat.
  4. Wait for the messages to finish loading. The highlighted parent message should stay in place throughout loading.

All platforms, message history and incoming messages

  1. Open a chat with a long history shared with the second test account.
  2. Scroll upward until older messages load. The message you were reading should stay in place.
  3. Scroll to the newest message. Messages should remain in order without duplicates, and consecutive messages from the same sender should stay correctly grouped.
  4. Send a message from the second account. The new message should become visible automatically.
  5. Scroll upward until the button for returning to the latest messages appears.
  6. Send another message from the second account. The message you were reading should stay in place.
  7. Use the button to return to the latest messages. The new message should be visible.
  8. Open a different chat on the account being tested.
  9. Send another message to the shared chat from the second account.
  10. Open the shared chat on the account being tested. The unread marker should identify the new message.

All platforms, a link to an older message

  1. Open a long chat.
  2. Open an older message's action menu.
  3. Copy the message link.
  4. Open a different chat.
  5. Paste the link into the message box.
  6. Send the link.
  7. Open the sent link. The linked message should be visible in the correct chat.

All platforms, reopening a chat with a recent unread message

  1. Open a chat with a long history.
  2. Open the third-newest message's action menu.
  3. Choose Mark as unread.
  4. Return to the inbox.
  5. Open the chat again. The newest messages should appear without briefly showing older messages.

All platforms, edit the newest and an older message

  1. Open a chat containing an older message that you sent.
  2. Send a short message.
  3. Open that message's action menu.
  4. Choose Edit.
  5. Change the message text.
  6. Save the edit. The updated message should remain visible at the bottom.
  7. Scroll to an older message that you sent.
  8. Open its action menu.
  9. Choose Edit.
  10. Change the message text.
  11. Save the edit. The updated message should remain at its original place in the conversation.

All platforms, formatted messages and attachments after scrolling

  1. Open a chat with scrollable history.
  2. Send *bold* _italic_ ~strike~ https://example.com. The formatting should render correctly.
  3. Send an image.
  4. Send a PDF.
  5. Scroll the formatted message and attachments off-screen.
  6. Scroll back to them. The formatting should remain correct, and each preview should show the correct attachment.
  7. Open the image. The correct image should open.
  8. Close the image viewer.
  9. Open the PDF. The correct document should open.

Web, opening a chat URL after signing in

  1. Open a chat.
  2. Copy its URL from the browser address bar.
  3. Sign out of the app.
  4. Open the copied URL. The sign-in screen should appear.
  5. Sign in. The requested chat should open.

Android and iOS apps, keyboard and message-box resizing

  1. Open a chat.
  2. Tap the message box. The keyboard should open.
  3. Enter several lines of text. The newest messages should remain correctly positioned above the message box.
  4. Dismiss the keyboard. The list should keep its position.
  5. Tap the message box. The keyboard should reopen.
  6. Send the draft. The new message should be visible at the bottom.
  • Verify that no errors appear in the JS console

Offline tests

All platforms, cached chats offline and history after reconnecting

  1. Open a chat with a long history while online.
  2. Disconnect the internet.
  3. Return to the inbox.
  4. Reopen the chat. The cached messages should remain visible in the correct order.
  5. Scroll to the beginning of the available history. Existing messages should remain visible.
  6. Reconnect the internet. The cached messages should remain visible at the same scroll position while the report refreshes.
  7. Scroll upward. Older messages should load without duplicates or a jump in the message you were reading.

QA Steps

Run the All platforms cases and the blocks for the platform being tested, including Offline tests.

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native

Returning from an older thread

Before

android-thread-return-before.mp4

After

android-thread-return-after-direct.mp4

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

🤖 Generated with Codex

@chrispader
chrispader force-pushed the @chrispader/feat/legend-list-report-actions branch from 1bac411 to c067b0c Compare September 9, 2026 18:27
@chrispader
chrispader force-pushed the @chrispader/feat/legend-list-report-actions branch from c067b0c to e784ebe Compare September 9, 2026 20:24
@chrispader chrispader changed the title feat: migrate report actions to chronological LegendList [LegendList 2/5] feat: migrate report actions to chronological LegendList Sep 9, 2026
@chrispader
chrispader marked this pull request as ready for review September 10, 2026 09:44
@chrispader
chrispader requested review from a team as code owners September 10, 2026 09:44
@melvin-bot
melvin-bot Bot requested review from TaduJR and garrettmknight and removed request for a team and TaduJR September 10, 2026 09:44
@melvin-bot

melvin-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown

@TaduJR 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]

@melvin-bot
melvin-bot Bot requested review from a team and removed request for a team September 10, 2026 09:44
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-10T10:07:15.590070Z f616302 Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@codecov

codecov Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.

Files with missing lines Coverage Δ
...mponents/LegendList/allowLegendListItemOverflow.ts 100.00% <100.00%> (ø)
...eyRequestReportView/useMoneyRequestReportScroll.ts 96.12% <100.00%> (ø)
src/hooks/useReportActionsListModel.ts 100.00% <100.00%> (ø)
src/hooks/useReportScrollManager/index.native.ts 100.00% <100.00%> (+7.40%) ⬆️
src/libs/ReportUtils.ts 91.02% <100.00%> (+0.13%) ⬆️
src/pages/inbox/ActionListContext.tsx 100.00% <100.00%> (ø)
src/pages/inbox/ChatReportActions.tsx 100.00% <100.00%> (ø)
...rc/pages/inbox/report/AncestorReportActionItem.tsx 96.77% <ø> (-0.11%) ⬇️
...rt/ReportActionCompose/ComposerWithSuggestions.tsx 81.00% <100.00%> (+0.38%) ⬆️
...ortActionCompose/useShouldSkipComposerAutoFocus.ts 100.00% <100.00%> (ø)
... and 19 more
... and 11 files with indirect coverage changes

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

@chrispader chrispader changed the title [LegendList 2/5] feat: migrate report actions to chronological LegendList [HOLD on #100732][LegendList 2/5] feat: migrate report actions to chronological LegendList Sep 10, 2026
@chrispader
chrispader force-pushed the @chrispader/feat/legend-list-report-actions branch from f616302 to 2a3323a Compare September 10, 2026 11:11
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ This PR is possibly changing native code and/or updating libraries, it may cause problems with HybridApp. Please check if any patch updates are required in the HybridApp repo and run an AdHoc build to verify that HybridApp will not break. Ask Contributor Plus for help if you are not sure how to handle this. ⚠️

@chrispader chrispader changed the title [HOLD on #100732][LegendList 2/5] feat: migrate report actions to chronological LegendList [HOLD on #100732] [LegendList 2/5] feat: migrate report actions to chronological LegendList Sep 10, 2026
On Android, a chat opened at a linked message appeared with the message at the top of the list and then moved down to its offset. LegendList applied the native anchor adjustments for rows measured during its initial scroll a second time, and its retries reused a stale target. Patch LegendList to skip anchor moves a later native scroll already includes, move the pending target with each adjustment, and finish its silent-scroll retry before the scroll completes (LegendApp/legend-list#604).

The list also requested older actions from scroll events that arrive before the initial scroll lands, which inserted a page above the linked message while it was being positioned. Older actions now load from scroll events only once the list is ready.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chrispader

Copy link
Copy Markdown
Contributor Author

@dmkt9 @roryabraham i've addressed some more issues with the initial report opening after the cache has been cleared. Other than that, i don't see any other issues so far.

@dmkt9 let me know about your final review 🙌🏼

…nd-list-report-actions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@dmkt9

dmkt9 commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

@dmkt9 @roryabraham i've addressed some more issues with the initial report opening after the cache has been cleared. Other than that, i don't see any other issues so far.

@dmkt9 let me know about your final review 🙌🏼

@chrispader Great! I'll finish my review soon

@chrispader

Copy link
Copy Markdown
Contributor Author

Chris's AI deputy reporting for duty. 🤖

@dmkt9 @roryabraham After clearing the cache, opening a link to an older message could briefly show newer messages out of order: a later expense preview appeared directly below the linked message until the real messages replaced it. The cause is in the pagination middleware, not in this list, so I fixed it in a separate PR, #106359. For read requests like GetNewerActions, it now saves the page after the messages it lists. That PR has before and after recordings made with this branch.

#106359 is now layer 9 of the rollout and merges before this PR, which is now layer 10.

@chrispader chrispader changed the title [HOLD on #106359] [LegendList 10/13] feat: migrate report actions to chronological LegendList [HOLD on #106359 and #106095] [LegendList 11/14] feat: migrate report actions to chronological LegendList Nov 10, 2026
@dmkt9

dmkt9 commented Nov 10, 2026

Copy link
Copy Markdown
Contributor
Fixed ✅

* The report always shows the loading state whenever it's opened. The same happens when opening a thread and returning to the parent chat.
* Android: The submitted expense isn't positioned correctly within the viewport when the report is opened. The highlighted comment also briefly flashes when returning from a thread to the parent chat.
* iOS: When the highlighted comment is the last item, it isn't displayed within the viewport.

Details
bug1.mp4
---

Sometimes, the last item being edited isn't scrolled into the viewport:

Details https://github.com/user-attachments/assets/0c461e30-fcc8-450a-847b-29a837e2115d

Clicking the Show History button in the Concierge chat scrolls to the beginning of the report. Additionally, if it doesn't scroll to the beginning of the report, the scroll position jumps slightly.

Details **Steps to reproduce:**
  1. Refresh the app while in the Concierge chat.
  2. Open a chat with an active need to do.
  3. Go back to the Concierge chat.
  4. Click the Show History button.
bug4.mp4

On android, the entire list flashes:

Details
bug1.mp4

The list jumps back to the bottom:

Similar to a previously reported bug: #100733 (comment). This time, the bug is more noticeable.

Steps to reproduce:

1. Delete the latest item.
2. Once the latest item disappears, scroll up.

Details
bug2.mp4

The hover style flickers on items when scrolling with the mouse:

Details
bug3.mp4

The highlighted item position isn't reliable when opening the chat:

Details
bug4.mp4

Similarly, on web, the highlighted item is out of the viewport when it's a PDF preview:

Details
bug71.mp4

The loading state appears after sending a link message:

Details
bug8.mp4

The keyboard appears briefly:

Details
bug5.mp4

The keyboard doesn't appear when editing a long comment:

Details
bug6.mp4

On Android, the highlighted item is out of the viewport if there is a long comment above it:

Details
bug7.mp4

Unable to test due to a new bug:

The app automatically navigates back to the Home screen when "Reply in thread".

Details
bug2.mp4

Android: The highlighted item scrolls down and then back up:

bug1.mp4

Android: Scrolling slightly right after the loading state disappears causes the list to jump:

bug3.mp4

Web: The "Submit" badge needs to be clicked multiple times (sometimes 3–4 times) to scroll to the highlighted item.

Sometimes, the top of the highlighted item or the bottom of the last item in the list is obscured.

bug4.mp4

Bug: Automatically scroll to the highlighted item when opening the PDF viewer:

Details
bug1.mp4

Bug: In a DM chat, the initial viewport isn't scrolled to the bottom when there's a new message, especially when the chat contains an IOU.

Details
bug2.mp4

Web: The chat in a thread isn't inverted.

Details
bug3.mp4

Bug 1: The loading skeleton disappears when opening a report in offline mode.

Details
bug1.mp4

Bug 4: The list anchor isn't preserved when loading older messages, causing the current viewport to jump.

Details
bug4.mp4

Bug 3: Scrolling to the bottom using the Latest Message badge causes the loading skeleton to appear, and the viewport ends up above the bottom of the chat.

Details
bug3.mp4

Bug 5: The list automatically scrolls to the bottom when opening a report marked as unread.

Details
bug5.mp4

NAB: Can we make sure the unread indicator is fully visible when using the "New message" badge?

Details
nab1.mp4

Bug 7: The "New message" badge flashes briefly.

Details
bug7.mp4

Bug 6: The composer is hidden behind the keyboard when there's a draft message.

The same issue occurs if we focus the composer while the report is loading. Additionally, if we send a message while the report is loading, the list doesn't scroll to the bottom once the loading state ends.

Details
bug6.mp4


Remaining ⚠️

Bug 2: The highlighted item isn't highlighted or rendered within the initial viewport when returning to the parent report from a thread.
(Re-tested on physical mobile device)

Details
bug2.mp4

New bug ❗

NAB: Should we delay focusing the composer until the loading skeleton disappears?

Details
NAB1.mp4

Bug: Android - The list flashes briefly when opening the report

Details
Bug1.mp4

Bug: Not sure we should fix this in this PR, as it also reproduces on staging.
When opening the report in offline mode and returning online, the report displays a loading skeleton and loses the previous scroll position.

Details
Bug2.mp4

@chrispader

Copy link
Copy Markdown
Contributor Author

Thanks @dmkt9, looking into those! Hopefully these are the last ones 🤞🏼

…ender

When a chat opens at a linked message that is the newest loaded one, the newer messages load afterwards. LegendList hides each new row until it is measured, and rendering a page of them can take seconds on a slow device. The footer skeleton moved below the hidden rows as soon as they entered the data, so the area below the link stayed blank until they appeared.

The linked row now draws its own absolutely positioned skeleton over that area. It hides itself in the frame LegendList measures the first newer row, so the rows replace it in place without a blank frame or a jump.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chrispader
chrispader requested a review from a team as a code owner November 10, 2026 12:10
Keep cached parent actions linked offline and focus restored drafts only after the message list is ready. Preserve the loaded list and its native header anchor on reconnect. Let offline Latest messages jumps complete using the newest cached page.

Co-authored-by: Codex <noreply@openai.com>
@chrispader chrispader changed the title [HOLD on #106359 and #106095] [LegendList 11/14] feat: migrate report actions to chronological LegendList [HOLD on #106359] [LegendList 11/14] feat: migrate report actions to chronological LegendList Nov 11, 2026
chrispader and others added 2 commits November 11, 2026 10:24
Merge main after the shared LegendList upgrade and scroll patches landed. Preserve the migration-specific positioning and offline reconnect fix.

Co-authored-by: Codex <noreply@openai.com>
Give compound scrolling, loading, and composer focus conditions semantic names
while keeping their evaluation in the existing execution paths.

Co-authored-by: Codex <noreply@openai.com>
chrispader and others added 4 commits November 11, 2026 13:22
Each LegendList patch is now the build output of its upstream PR, so the
patches change exactly what the PRs change, in every bundle the PRs touch.

- 001 and 003 now also patch the native bundles, as their PRs change shared
  code.
- 002 adds the explicit maintainVisibleContentPosition anchor option that
  LegendApp/legend-list#597 now proposes, instead of anchoring the last
  visible item in every list with alignItemsAtEnd.
- 004 contains LegendApp/legend-list#600, which now also skips deferred
  adjustments that a later native scroll already includes and moves the
  initial scroll target with each adjustment.
- 006 keeps only the silent-retry fix from LegendApp/legend-list#604.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LegendList patch 002 now follows LegendApp/legend-list#597, which makes
anchoring the last visible item an explicit maintainVisibleContentPosition
option instead of deriving it from alignItemsAtEnd. The chat list passes
anchor "end" whenever it aligns its messages to the end, so rows that resize
or load above the reader's position keep moving only the content above it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…otes

LegendList patch 005 places its scroll anchor at 1,000,000 points instead of
10,000,000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The patch now is the build output of LegendApp/legend-list#607. That PR
applies LegendList's header-size adjustment on every platform and reuses the
Android clamp handling that item resizes already have, instead of the
header-only copy of it. The patch also gets its details.md entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chrispader chrispader changed the title [HOLD on #106359] [LegendList 11/14] feat: migrate report actions to chronological LegendList [HOLD on #106359 and #106626] [LegendList 12/15] feat: migrate report actions to chronological LegendList Nov 11, 2026
@chrispader

chrispader commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor Author

WIP

Remaining ⚠️

Bug 2: The highlighted item isn't highlighted or rendered within the initial viewport when returning to the parent report from a thread. (Re-tested on physical mobile device)

WIP

NAB: Should we delay focusing the composer until the loading skeleton disappears?

Yes, thanks. Fixed!

Bug: Android - The list flashes briefly when opening the report

Bug: Not sure we should fix this in this PR, as it also reproduces on staging. When opening the report in offline mode and returning online, the report displays a loading skeleton and loses the previous scroll position.

Fixed in #106687

@chrispader chrispader changed the title [HOLD on #106359 and #106626] [LegendList 12/15] feat: migrate report actions to chronological LegendList [HOLD on #106626] [LegendList 12/15] feat: migrate report actions to chronological LegendList Nov 12, 2026
chrispader and others added 3 commits November 12, 2026 09:56
Keep displayed offline actions ready while queued app and report loads finish. This prevents loading skeletons and the first successful response from recreating the list and resetting its viewport.

Co-authored-by: Codex <noreply@openai.com>
Merge the independent cached-chat reconnect fix and the latest merged chat
pagination prerequisites while retaining the LegendList migration.

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
@chrispader chrispader changed the title [HOLD on #106626] [LegendList 12/15] feat: migrate report actions to chronological LegendList [WIP] [HOLD on #106626, #106687] [LegendList 12/15] feat: migrate report actions to chronological LegendList Nov 12, 2026
Backport react/react-native#58187 so Android redraws the ScrollView after maintainVisibleContentPosition corrects its offset. This prevents a stale frame when messages above a linked report action finish measuring.

Co-authored-by: Codex <noreply@openai.com>
@chrispader chrispader changed the title [WIP] [HOLD on #106626, #106687] [LegendList 12/15] feat: migrate report actions to chronological LegendList [HOLD on #106626, #106687] [LegendList 12/15] feat: migrate report actions to chronological LegendList Nov 12, 2026
@chrispader chrispader changed the title [HOLD on #106626, #106687] [LegendList 12/15] feat: migrate report actions to chronological LegendList [HOLD on #106626] [LegendList 12/15] feat: migrate report actions to chronological LegendList Nov 13, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants