You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Categories -Offline indicator shown briefly for second time when returning to portrait mode #103171
Version Number: 9.5.3-0 Reproducible in staging?: Yes Reproducible in production?: N/A - new feature, doesn't exist in prod If this was caught during regression testing, add the test name, ID and link from BrowserStack:#102665 Email or phone of affected tester (no customers):ibellicotest+3215@gmail.com Issue reported by: Applause Internal Team Bug source: Exploratory - Significant User Experience Deterioration Device used: Motorola MotoG60 / Android 12 (Hybrid app) App Component: Money Requests
Action Performed:
Prerequisite: Account has a workspace with categories enabled.
Prerequisite 2: anchoredFieldDropdowns enabled in "Troubleshoot"
Open the Expensify app.
Tap on FAB > "Create Expense" > "Manual"
Turn off internet connection.
Tap on "Category" field.
Note that offline indicator is visible below search input.
Switch to landscape mode.
Return to portrait mode.
Note that offline indicator appears briefly for a second time, on top of categories list.
Expected Result:
Offline indicator shouldn´t be displayed for a second time on categories list when user switches to landscape or portrait mode.
Actual Result:
Offline indicator is displayed briefly for a second time, on top of categories list, when user switches to portrait mode.
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
Identify the pull request that introduced this issue and revert it.
Root cause: On native, the category picker opens as a bottom-docked Modal. BaseModal wraps its children in a ScrollView only in landscape (BaseModal.tsx:429). Each rotation changes the element type, so React remounts the whole CategoryPicker. On return to portrait, the offline hint (CategoryPicker/index.tsx:91) renders again while the sheet re-lays out.
Recommendation: demote and fix forward. The flash is brief and cosmetic. It only shows with the beta on, while offline, after rotating. A revert would remove the whole feature (17 files). If maintainers prefer a revert because of the other blockers from this PR, revert this PR.
Investigation details
CategoryPickerModal doesn't pass the ScrollView prop. PopoverWithMeasuredContent forwards it as undefined (index.tsx:19,43), so BaseModal uses its default of true (BaseModal.tsx:91). The wrap applies only in bottom-docked landscape mode (BaseModal.tsx:314-316).
On native, isSmallScreenWidth is always true, so the popover always renders as a BOTTOM_DOCKED modal.
Other pickers with local state already turn this prop off, including PopoverReactionList, EmojiPicker, and FilterPopupButton.
@puneetlath@ikevin127@DylanDylann this issue was created 2 weeks ago. Are we close to a solution? Let's make sure we're treating this as a top priority. Don't hesitate to create a thread in #expensify-open-source to align faster in real time. Thanks!
If it still reproduces: It is likely a one-frame layout glitch while Android re-lays out the sheet. It is not a second indicator. I found no other remount and no second offline indicator in the code. Please attach a frame-by-frame recording before anyone changes code, so we can see which element flashes.
Investigation details
I checked the code at 439f896 (after the PR merged):
BaseModal now renders children directly, because shouldWrapChildrenInScrollView is false (BaseModal.tsx:317, BaseModal.tsx:431). The element type no longer changes on rotation, so CategoryPicker stays mounted.
Landscape only changes the sheet height (CategoryPickerModal.tsx:136-137). It is the same bottom-docked modal. There is no separate full-screen screen with its own OfflineIndicator.
The popover's visibility is local state in ExpenseFieldDropdown. Rotation does not close or reopen it. useReopenAfterReturn runs only after you navigate away and come back.
The page's OfflineIndicator sits behind the sheet, which is a separate Android dialog window. It can't draw on top of the list.
Not tested: This bug needs a real Android rotation. Desktop web never counts as landscape, so a web test can't reproduce it. If the flash still shows on Android, two untested options are: keep the old sheet height until the new layout settles, or hide the hint briefly on orientation change.
Next Steps: Reply with @MelvinBot <your feedback> to refine this analysis.
@trjExpensify This bug is a very rare edge case caused by the rotation animation, and it only happens while offline. I tried a few fixes, but no matter what, the UI briefly breaks during rotation before updating to the correct dimensions. So I’d vote to leave this bug as is to avoid a tricky fix
Activity
applause-bot commentedon Oct 6, 2026
While Applause doesn't embed attachments for this bug, here are the links for quick view:
https://platform.applause.com/services/links/v1/external/29f3b00de1f8bde00375e51f5bb5e1781fa137fb0277855009792297056d786e
https://platform.applause.com/services/links/v1/external/dc564f69a6c554b0c3583bde27a80aac7a810f7443546a81f311f79c8712b69f
melvin-bot commentedon Oct 6, 2026
You have been assigned to this deploy blocker because you recently merged this PR: #102665
melvin-bot commentedon Oct 6, 2026
@puneetlath @ikevin127 you have been assigned to this deploy blocker because you reviewed the offending PR: #102665
github-actions commentedon Oct 6, 2026
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
melvin-bot commentedon Oct 6, 2026
@DylanDylann you have been assigned to this deploy blocker because you authored the offending PR: #102665
melvin-bot commentedon Oct 6, 2026
💬 A slack conversation has been started in #expensify-open-source
MelvinBot commentedon Oct 6, 2026
Deploy Blocker Analysis
Causing PR: [CFI] Open the Category list in a container anchored to its row (high confidence). This PR added the
anchoredFieldDropdownsbeta and theCategoryPickerModalpath, so the repro path did not exist before it.Root cause: On native, the category picker opens as a bottom-docked
Modal.BaseModalwraps its children in aScrollViewonly in landscape (BaseModal.tsx:429). Each rotation changes the element type, so React remounts the wholeCategoryPicker. On return to portrait, the offline hint (CategoryPicker/index.tsx:91) renders again while the sheet re-lays out.Recommended fix: Add
shouldWrapModalChildrenInScrollViewIfBottomDockedInLandscapeMode={false}to thePopoverWithMeasuredContentin CategoryPickerModal.tsx:97-112. The same fix also resolves Expense - Search input in category list is automatically cleared when turning to lanscape mode.Recommendation: demote and fix forward. The flash is brief and cosmetic. It only shows with the beta on, while offline, after rotating. A revert would remove the whole feature (17 files). If maintainers prefer a revert because of the other blockers from this PR, revert this PR.
Investigation details
CategoryPickerModaldoesn't pass the ScrollView prop.PopoverWithMeasuredContentforwards it asundefined(index.tsx:19,43), soBaseModaluses its default oftrue(BaseModal.tsx:91). The wrap applies only in bottom-docked landscape mode (BaseModal.tsx:314-316).isSmallScreenWidthis alwaystrue, so the popover always renders as aBOTTOM_DOCKEDmodal.PopoverReactionList,EmojiPicker, andFilterPopupButton.Next Steps: Reply with
@MelvinBot implement thisto create a draft PR, or@MelvinBot <your feedback>to refine this analysis.view run
5 remaining items
melvin-bot commentedon Oct 13, 2026
@DylanDylann 6 days overdue. This is scarier than being forced to listen to Vogon poetry!
DylanDylann commentedon Oct 14, 2026
will test again after #103552 is merged
melvin-bot commentedon Oct 19, 2026
@DylanDylann Eep! 4 days overdue now. Issues have feelings too...
DylanDylann commentedon Oct 20, 2026
melvin-bot commentedon Oct 20, 2026
@puneetlath @ikevin127 @DylanDylann this issue was created 2 weeks ago. Are we close to a solution? Let's make sure we're treating this as a top priority. Don't hesitate to create a thread in #expensify-open-source to align faster in real time. Thanks!
DylanDylann commentedon Oct 22, 2026
@MelvinBot Investigate this bug again
MelvinBot commentedon Oct 22, 2026
Updated Issue Analysis
Conclusion: The cause I found earlier is already fixed on
main. Please retest on Android. Close this issue if the flash is gone.What changed: Fix: Open full screen category popover on phones in landscape mode merged on 2026-10-21. It turns off the landscape
ScrollViewwrap that remounted the picker on rotation (CategoryPickerModal.tsx:199-201). This is the fix my earlier analysis recommended.If it still reproduces: It is likely a one-frame layout glitch while Android re-lays out the sheet. It is not a second indicator. I found no other remount and no second offline indicator in the code. Please attach a frame-by-frame recording before anyone changes code, so we can see which element flashes.
Investigation details
I checked the code at
439f896(after the PR merged):BaseModalnow renders children directly, becauseshouldWrapChildrenInScrollViewis false (BaseModal.tsx:317, BaseModal.tsx:431). The element type no longer changes on rotation, soCategoryPickerstays mounted.OfflineIndicator.ExpenseFieldDropdown. Rotation does not close or reopen it.useReopenAfterReturnruns only after you navigate away and come back.SelectionListhas no offline indicator of its own.OfflineIndicatorsits behind the sheet, which is a separate Android dialog window. It can't draw on top of the list.Not tested: This bug needs a real Android rotation. Desktop web never counts as landscape, so a web test can't reproduce it. If the flash still shows on Android, two untested options are: keep the old sheet height until the new layout settles, or hide the hint briefly on orientation change.
Next Steps: Reply with
@MelvinBot <your feedback>to refine this analysis.DylanDylann commentedon Oct 22, 2026
@trjExpensify This bug is a very rare edge case caused by the rotation animation, and it only happens while offline. I tried a few fixes, but no matter what, the UI briefly breaks during rotation before updating to the correct dimensions. So I’d vote to leave this bug as is to avoid a tricky fix
cc @ikevin127
trjExpensify commentedon Oct 22, 2026
Sounds good to me, agreed it's a rare edge case. Let's move on!