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
[Due for payment 2026-10-23] The Receipt Partners invite page bottom padding is too large #99763
Version Number: 9.4.62-4 Reproducible in staging?: Y Reproducible in production?: Y If this was caught during regression testing, add the test name, ID and link from BrowserStack: Email or phone of affected tester (no customers): Logs:https://stackoverflow.com/c/expensify/questions/4856 Expensify/Expensify Issue URL: Issue reported by:@linhvovan29546 Slack conversation (hyperlinked to channel name): #Expensify bugs
Action Performed:
Connect to Uber for business from Receipt partners
Open the Receipt partners > Manage invites or
Observe the Invite page once the connection established
Expected Result:
The bottom padding is consistent with other pages.
Actual Result:
The bottom padding is too large
Workaround:
Unknown
Platforms:
Select the officially supported platforms where the issue was reproduced:
The Receipt Partners invite screens keep their ScreenWrapper in legacy safe-area mode while their child SelectionList also opts into bottom safe-area padding, so the safe-area inset gets applied twice at the bottom on native.
ScreenWrapper only disables its own legacy bottom safe-area spacer when enableEdgeToEdgeBottomSafeAreaPadding is passed (ScreenWrapper/index.tsx:138). Neither Receipt Partners page passes it, so ScreenWrapper renders its own bottom inset and the SelectionList adds its own via addBottomSafeAreaPadding. On the Send invites page the effect is worst because the confirmButtonOptions footer (FixedFooter) applies the raw inset regardless of the parent context, stacking pb5 + inset + inset under the confirm button.
This is native-only — web has no safe-area insets, which is exactly why the reporter didn't check Web/mWeb.
Investigation details (high confidence)
Affected files (both introduced in #99638, both missing the prop):
Mechanism:ScreenWrapper sets includeSafeAreaPaddingBottom = isUsingEdgeToEdgeMode ? false : includeSafeAreaPaddingBottomProp (index.tsx:147). With the prop absent, isUsingEdgeToEdgeMode is false, so the legacy bottom spacer stays on. The FixedFooter used by confirmButtonOptions reads the raw inset via useSafeAreaPaddings(true), which intentionally ignores whether the parent already applied padding — so the two stack.
Known-good reference: the standard workspace member DynamicWorkspaceInvitePage.tsx:252-256 uses the sameSelectionList + confirmButtonOptions + addBottomSafeAreaPadding pattern but correctly passes enableEdgeToEdgeBottomSafeAreaPadding, so only one inset is applied. ~28 other selection pages follow this; the two Receipt Partners pages are the outliers.
Alternatives considered: removing addBottomSafeAreaPadding from the SelectionList would also collapse to one inset, but it diverges from the repo-standard pattern and would drop safe-area padding on the scroll area — switching ScreenWrapper to edge-to-edge mode is the change every comparable page makes.
What changes do you think we should make in order to solve the problem?
Add enableEdgeToEdgeBottomSafeAreaPadding to the <ScreenWrapper> on both pages, matching DynamicWorkspaceInvitePage:
DynamicInviteReceiptPartnerPolicyPage.tsx — both the main return (line 214) and the "All set" branch (line 189).
DynamicEditInviteReceiptPartnerPolicyPage.tsx — line 298.
This puts ScreenWrapper in edge-to-edge mode so the child SelectionList/FixedFooter becomes the single source of bottom safe-area padding.
What alternative solutions did you explore? (Optional)
Removing addBottomSafeAreaPadding from the SelectionList (rejected — diverges from the standard pattern and drops padding on the scrollable area).
💡 Suggested AI code review rule
This looks like a recurring, mechanically detectable edge-to-edge migration mistake (2 outliers vs. ~28 correct pages), so it may be worth a coding-standards rule so the AI reviewer catches the next one. Proposed for Expensify/App:
Rule:UI-4 — ScreenWrapper must enable edge-to-edge when a child adds bottom safe-area padding
Condition: When a page's SelectionList (or other child) uses addBottomSafeAreaPadding and/or a FixedFooter/confirmButtonOptions, the enclosing ScreenWrapper must pass enableEdgeToEdgeBottomSafeAreaPadding; otherwise the inset is applied twice.
Why:ScreenWrapper keeps its legacy bottom spacer unless it's in edge-to-edge mode, so it stacks with the child's inset → doubled bottom padding on native (mechanism).
Search pattern: files containing addBottomSafeAreaPadding or confirmButtonOptions where the <ScreenWrapper in the same file does not include enableEdgeToEdgeBottomSafeAreaPadding.
The full rule file (with ❌/✅ code inline in the repo's coding-standards format) would go in Expensify/App under .claude/skills/coding-standards/rules/. If it's worth adding, a maintainer can open it there as a draft PR.
Next Steps for Contributor+ team: To accept:@MelvinBot implement [this](https://github.com/Expensify/App/issues/99763) to create a draft PR. To refine:@MelvinBot <your feedback> To reject: Explain why you are rejecting Melvin's proposal.
@mananjadhav one heads-up on Melvin's fix before this gets picked up.
The edge-to-edge switch is correct for the SelectionList return, but the proposal also adds it to the "All set" branch (line 189), and that one would break the screen. That branch renders <ConfirmationPage>, whose internal FixedFooter doesn't set addBottomSafeAreaPadding — it relies on ScreenWrapper's legacy bottom inset. Flip it to edge-to-edge and the confirm button loses its bottom padding and sits on the home indicator. That's also why none of the pages using ConfirmationPage are in edge-to-edge mode.
So the change should only go on the SelectionList return (line 214), not the ConfirmationPage branch. The Manage invites page has no footer, so it's already a single inset today — not actually doubled.
Happy to raise a proposal with the exact diff if that helps.
changed the title [-]The Receipt Partners invite page bottom padding is too large[/-][+][Due for payment 2026-10-23] The Receipt Partners invite page bottom padding is too large[/+]on Oct 16, 2026
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.12-1 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
If no regressions arise, payment will be issued on 2026-10-23. 🎊
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]
Activity
MelvinBot commentedon Aug 28, 2026
Proposal
What is the root cause of that problem?
The Receipt Partners invite screens keep their
ScreenWrapperin legacy safe-area mode while their childSelectionListalso opts into bottom safe-area padding, so the safe-area inset gets applied twice at the bottom on native.ScreenWrapperonly disables its own legacy bottom safe-area spacer whenenableEdgeToEdgeBottomSafeAreaPaddingis passed (ScreenWrapper/index.tsx:138). Neither Receipt Partners page passes it, soScreenWrapperrenders its own bottom inset and theSelectionListadds its own viaaddBottomSafeAreaPadding. On the Send invites page the effect is worst because theconfirmButtonOptionsfooter (FixedFooter) applies the raw inset regardless of the parent context, stackingpb5 + inset + insetunder the confirm button.This is native-only — web has no safe-area insets, which is exactly why the reporter didn't check Web/mWeb.
Investigation details (high confidence)
Affected files (both introduced in #99638, both missing the prop):
DynamicInviteReceiptPartnerPolicyPage.tsx:214— "Send invites";SelectionListhas bothconfirmButtonOptionsandaddBottomSafeAreaPadding. This is where padding is clearly doubled.DynamicEditInviteReceiptPartnerPolicyPage.tsx:298— "Manage invites"; same legacy-mode inconsistency (itsSelectionListusesaddBottomSafeAreaPadding). It has no footer so its padding self-suppresses to a single inset, but it should still match the reference for consistency.Mechanism:
ScreenWrappersetsincludeSafeAreaPaddingBottom = isUsingEdgeToEdgeMode ? false : includeSafeAreaPaddingBottomProp(index.tsx:147). With the prop absent,isUsingEdgeToEdgeModeisfalse, so the legacy bottom spacer stays on. TheFixedFooterused byconfirmButtonOptionsreads the raw inset viauseSafeAreaPaddings(true), which intentionally ignores whether the parent already applied padding — so the two stack.Known-good reference: the standard workspace member
DynamicWorkspaceInvitePage.tsx:252-256uses the sameSelectionList+confirmButtonOptions+addBottomSafeAreaPaddingpattern but correctly passesenableEdgeToEdgeBottomSafeAreaPadding, so only one inset is applied. ~28 other selection pages follow this; the two Receipt Partners pages are the outliers.Alternatives considered: removing
addBottomSafeAreaPaddingfrom theSelectionListwould also collapse to one inset, but it diverges from the repo-standard pattern and would drop safe-area padding on the scroll area — switchingScreenWrapperto edge-to-edge mode is the change every comparable page makes.What changes do you think we should make in order to solve the problem?
Add
enableEdgeToEdgeBottomSafeAreaPaddingto the<ScreenWrapper>on both pages, matchingDynamicWorkspaceInvitePage:DynamicInviteReceiptPartnerPolicyPage.tsx— both the main return (line 214) and the "All set" branch (line 189).DynamicEditInviteReceiptPartnerPolicyPage.tsx— line 298.This puts
ScreenWrapperin edge-to-edge mode so the childSelectionList/FixedFooterbecomes the single source of bottom safe-area padding.What alternative solutions did you explore? (Optional)
Removing
addBottomSafeAreaPaddingfrom theSelectionList(rejected — diverges from the standard pattern and drops padding on the scrollable area).💡 Suggested AI code review rule
This looks like a recurring, mechanically detectable edge-to-edge migration mistake (2 outliers vs. ~28 correct pages), so it may be worth a coding-standards rule so the AI reviewer catches the next one. Proposed for
Expensify/App:UI-4— ScreenWrapper must enable edge-to-edge when a child adds bottom safe-area paddingSelectionList(or other child) usesaddBottomSafeAreaPaddingand/or aFixedFooter/confirmButtonOptions, the enclosingScreenWrappermust passenableEdgeToEdgeBottomSafeAreaPadding; otherwise the inset is applied twice.ScreenWrapperkeeps its legacy bottom spacer unless it's in edge-to-edge mode, so it stacks with the child's inset → doubled bottom padding on native (mechanism).addBottomSafeAreaPaddingorconfirmButtonOptionswhere the<ScreenWrapperin the same file does not includeenableEdgeToEdgeBottomSafeAreaPadding.DynamicInviteReceiptPartnerPolicyPage.tsx:214DynamicWorkspaceInvitePage.tsx:252-256The full rule file (with ❌/✅ code inline in the repo's coding-standards format) would go in
Expensify/Appunder.claude/skills/coding-standards/rules/. If it's worth adding, a maintainer can open it there as a draft PR.Next Steps for Contributor+ team:
To accept:
@MelvinBot implement [this](https://github.com/Expensify/App/issues/99763)to create a draft PR.To refine:
@MelvinBot <your feedback>To reject: Explain why you are rejecting Melvin's proposal.
view run
melvin-bot commentedon Aug 28, 2026
Triggered auto assignment to Contributor-plus team member for initial proposal review - @mananjadhav (
External)melvin-bot commentedon Aug 28, 2026
Unable to auto-create job on Upwork. The BZ team member should create it manually for this issue.
David-2002065 commentedon Aug 30, 2026
@mananjadhav one heads-up on Melvin's fix before this gets picked up.
The edge-to-edge switch is correct for the
SelectionListreturn, but the proposal also adds it to the "All set" branch (line 189), and that one would break the screen. That branch renders<ConfirmationPage>, whose internalFixedFooterdoesn't setaddBottomSafeAreaPadding— it relies onScreenWrapper's legacy bottom inset. Flip it to edge-to-edge and the confirm button loses its bottom padding and sits on the home indicator. That's also why none of the pages usingConfirmationPageare in edge-to-edge mode.So the change should only go on the
SelectionListreturn (line 214), not theConfirmationPagebranch. The Manage invites page has no footer, so it's already a single inset today — not actually doubled.Happy to raise a proposal with the exact diff if that helps.
melvin-bot commentedon Aug 31, 2026
@mananjadhav Whoops! This issue is 2 days overdue. Let's get this updated quick!
mananjadhav commentedon Sep 2, 2026
@yusufdeveloper2903's proposal seems good here.
🎀 👀 🎀 C+ reviewed.
melvin-bot commentedon Sep 2, 2026
Triggered auto assignment to @NicolasBonet, see https://stackoverflow.com/c/expensify/questions/7972 for more details.
53 remaining items
[-]The Receipt Partners invite page bottom padding is too large[/-][+][Due for payment 2026-10-23] The Receipt Partners invite page bottom padding is too large[/+]melvin-bot commentedon Oct 16, 2026
@mananjadhav
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.12-1 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
If no regressions arise, payment will be issued on 2026-10-23. 🎊
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]
NicolasBonet commentedon Oct 19, 2026
Not overdue
melvin-bot commentedon Oct 19, 2026
@mananjadhav Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!