Add suggested follow-up skeleton#90363
Conversation
|
@dubielzyk-expensify @Krishna2323 One of you needs to 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] |
|
@marcochavezf Responses on dev seem to be throttled. I kept waiting forever for the follow-up buttons. We might need to test on adhoc builds. |
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.
|
|
I can review this. |
|
I've seen this in the issue, but would still be good to upload videos for the platforms here 👍 |
|
Oh I was waiting for design confirmation before uploading the videos |
|
Sure. I think the videos over here looks good, but let's wait for @Expensify/design to chime in too |
|
Commented over there. They look great to me, just ever so slightly on the slow side but no strong feelings there. |
|
Thanks for the thorough review. Will check them first thing tomorrow morning. |
Fixed in c4f080c by removing the exiting animation: Screen.Recording.2026-05-20.at.01.45.30.mov
I went with |
|
Added screenshots for iOS and Web. Haven't done on Android yet because backend is down. |
|
Added Android mWeb screenshot. I never received a response on Android native. Not sure why. @shawnborton Mind triggering another adhoc build for the latest changes? |
|
@Krishna2323 David is eager to get this released soon so could you re-review when you had time? Thanks. @Expensify/design Mind running another adhoc build for the latest changes? I already added screenshots for all platforms for your reference. |
|
Reviewing... |
|
🚧 @dannymcclain has triggered a test Expensify/App build. You can view the workflow run here. |
|
@gijoe0295 saw the "searching documentation..." indicator flash for one frame when followup buttons arrived. Likely a race between the followup-list rendering and the processing indicator clearing.
android_hybrid.mp4 |
Fixed in fd63838 |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppandroid_hybrid.mp4Android: mWeb Chromeandroid_mWeb.mp4iOS: HybridAppios_hybrid.mp4iOS: mWeb Safariios_mWeb.mp4MacOS: Chrome / Safariweb_chrome.mp4 |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fd638389dd
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| clearAgentZeroProcessingIndicator(reportID); | ||
| clearPendingFollowupList(reportID); |
There was a problem hiding this comment.
Guard indicator clear by request context
Clearing agentZeroProcessingRequestIndicator here is unconditional at report scope, so one request can clear another request’s in-progress state. If a user triggers a second Concierge/AgentZero request before the first pending followup-list resolves, the first request’s reconciliation path will call clearAgentZeroProcessingIndicator(reportID) and hide the thinking/typing state (and reasoning history) for the newer request even though it is still running.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
@gijoe0295 this one also seems to be a valid concern.
| const {isOffline} = useNetwork(); | ||
| const [pendingFollowupList] = useOnyx(`${ONYXKEYS.COLLECTION.CONCIERGE_PENDING_FOLLOWUP_LIST}${reportID}`); | ||
| const hasPendingFollowupListSkeleton = !isOffline && pendingFollowupList?.reportActionID === action.reportActionID; |
There was a problem hiding this comment.
Hoist report-level subscriptions out of each message row
This adds useNetwork() and a report-level useOnyx() subscription inside every ChatMessageContent row, so a single network flip or pending-followup key update fans out re-renders across all rendered messages in the thread. In large chats this creates avoidable O(n) row updates for state that only affects one action, which can introduce visible UI jank.
Useful? React with 👍 / 👎.


Explanation of Change
We should show skeleton loading state for Concierge suggested follow-up actionable buttons while they're being generated in the backend.
Fixed Issues
$ #89686
PROPOSAL:
Tests
#adminschatOffline tests
NA
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, 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.ScrollViewcomponent to make it scrollable when more elements are added to the page.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
Screen.Recording.2026-05-26.at.00.14.28.mov
Android: mWeb Chrome
Screen.Recording.2026-05-20.at.03.15.14.mov
iOS: Native
Screen.Recording.2026-05-20.at.01.53.53.mov
iOS: mWeb Safari
Screen.Recording.2026-05-20.at.01.58.48.mov
MacOS: Chrome / Safari
Screen.Recording.2026-05-20.at.01.51.31.mov