Conversation
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@aimane-chnaif 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] |
|
@aimane-chnaif, gentle bump. thanks. |
|
Please merge main |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / Safari |
|
@aimane-chnaif, I've merged main. thanks. |
|
🤖 Code Review All CI checks pass. The changes are clean and well-scoped. Two observations: 1. The A safer approach would be to find each section's original index: nonExploreSections.map((section) => {
const originalIndex = typeMenuSections.indexOf(section);
return renderSection(section, originalIndex);
})2. Defensive icon type check is fine but unnecessary per the types const icon = typeof item.icon === 'string' ? expensifyIcons[item.icon] : item.icon;
Neither of these is blocking. The core approach — rendering Explore eagerly while showing a right-sized skeleton for the remaining sections — is solid. |
|
Codex Review: Didn't find any major issues. 🚀 ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
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". |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppios.moviOS: mWeb SafariMacOS: Chrome / Safariweb.mov |
|
@nabi-ebrahimi please check this bug Screen.Recording.2026-04-08.at.6.47.06.pm.movSkeleton not showing |
@aimane-chnaif Thanks for catching this. It happens because right after Clear cache and restart, the app is still in its initial boot state. At that moment, the data needed to build the non- Because of that, we end up rendering the skeleton loaders with count zero so nothing become visible. I can fix that by falling back to while testing this, I found another behavior that I think we should confirm before finalizing the fix: when Simulate failing network requests is enabled, it appears as infinite loading.
Same at production
What is expected behavior at this case?
|
If it also happens in staging, out of scope.
I reported this because it doesn't happen on staging. Skeleton showing correctly on staging so we should fix this |
Default to 2 skeleton sections when non-Explore sections are still empty.
|
@aimane-chnaif I addressed this. Please take a look when you get a chance. |
|
There's TypeScript error |
|
The Fix in function SuggestedSearchSkeleton({sectionCount = 3}: SuggestedSearchSkeletonProps) {This ensures |
|
Codex Review: Didn't find any major issues. Keep it up! ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
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". |
PR ReviewNice approach — rendering Explore immediately while skeletonizing the rest is a solid UX improvement. Two items worth addressing: 1. Unnecessary icon type guard (nit)
const icon = typeof item.icon === 'string' ? expensifyIcons[item.icon] : item.icon;This should revert to the original: icon={expensifyIcons[item.icon]}2. Fragile
|
|
🚧 @JS00001 has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/JS00001 in version: 9.3.58-0 🚀
Bundle Size Analysis (Sentry): |
|
No help site changes are required for this PR. The changes are purely a loading state optimization — showing the "Explore" section immediately instead of behind a loading skeleton, and making the skeleton adapt to the actual number of sections. No feature names, UI labels, workflows, or user-facing behavior changed. The existing help article ( |
|
🚀 Deployed to production by https://github.com/AndrewGable in version: 9.3.58-9 🚀
|
|
🚀 Deployed to production by https://github.com/AndrewGable in version: 9.3.58-9 🚀
|


Explanation of Change
These changes make the wide search menu feel more stable while suggested searches are still loading.
The
Exploresection now renders immediately instead of being hidden behind the loading skeleton, so people can start from the most common entry point right away. The loading state also becomes more accurate: the skeleton now only fills the remaining non-Explore sections, and it adapts to the actual number of sections we expect to show instead of always rendering three placeholder groups.Fixed Issues
$ #86130
PROPOSAL: #86130 (comment)
Tests
Offline tests
Same as Tests.
QA Steps
Same as Tests.
// TODO: These must be filled out, or the issue title must include "[No QA]."
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-04-02.at.12.18.39.AM.mov
Android: mWeb Chrome
Screen.Recording.2026-04-02.at.12.19.46.AM.mov
iOS: Native
Screen.Recording.2026-04-02.at.12.07.31.AM.mov
iOS: mWeb Safari
Screen.Recording.2026-04-02.at.12.14.28.AM.mov
MacOS: Chrome / Safari
Screen.Recording.2026-04-02.at.12.11.58.AM.mov