Skip to content

Show Pay option in bulk actions dropdown while offline - #97942

Merged
puneetlath merged 3 commits into
mainfrom
claude-showPayOptionOfflineBulkSelection
Aug 11, 2026
Merged

Show Pay option in bulk actions dropdown while offline#97942
puneetlath merged 3 commits into
mainfrom
claude-showPayOptionOfflineBulkSelection

Conversation

@MelvinBot

@MelvinBot MelvinBot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Explanation of Change

On Search → Reports, when a user was offline and selected 2+ approved ("Ready to pay") reports, the Pay option was missing from the "N selected" bulk-actions dropdown. It rendered normally when online.

The bulk-action options array gated the Pay option behind !isOffline when it was built, so the item was never pushed into the dropdown while offline — even though the Pay click handler (onBulkPaySelected) already handles the offline case by showing the offline modal and attempting no payment. That offline guard was therefore dead code, because the option was removed before a user could ever click it.

This change removes the !isOffline conjunct from shouldShowPayOption in src/hooks/useSearchBulkActions.ts so Pay renders while offline. Selecting it (directly, or via a submenu item that routes through confirmPayment) hits the existing offline guard, which opens the offline modal instead of attempting a payment — matching the expected result. The change is scoped to Pay only; the Approve and Hold/Unhold options intentionally keep their !isOffline gate since they have no offline-modal handler.

A unit test (tests/unit/hooks/useSearchBulkActionsPayTest.ts) was added asserting the Pay option is present offline and that selecting it opens the offline modal rather than calling payMoneyRequest.

Fixed Issues

$ #97753
PROPOSAL: #97753 (comment)

Tests

Same as offline tests.

  • Verify that no errors appear in the JS console

Offline tests

  1. On Search → Reports, select 2+ approved ("Ready to pay") reports.
  2. Go offline.
  3. Open the "N selected" dropdown and verify the Pay option is shown.
  4. Select Pay (or a payment submenu item) and verify the offline modal appears and no payment is attempted.

QA Steps

Same as 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
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

Co-authored-by: DylanDylann <DylanDylann@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

I looked at the failing checks — there's nothing to fix by pushing code. The only two failures are human-gated checks, not code failures:

Failing check Why it's failing Who resolves it
checklist (PR Author Checklist) 0/38 checklist items are ticked. This PR was opened by MelvinBot, so the boxes are intentionally unchecked — the body notes the human co-author fills out the Tests/QA sections and checklist. Human co-author checks the boxes
Check independent approval The PR has no independent Contributor+ approval yet. A reviewer approves

Every actual code check is green: ESLint, Oxfmt, typecheck, Bun tests, all 8 test jobs (which include the new useSearchBulkActionsPayTest.ts), Storybook, React Compiler, check, and branch-perf-tests. baseline-perf-tests was still building the baseline from main when I checked — it's unrelated to this one-line change and resolves on its own.

So no code fix is needed. To get this mergeable: complete the author checklist and get a reviewer approval.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

All checks have now finished. The only two failures are human-gated — there's no code fix to push:

  • checklist (PR Author Checklist) — fails because the 38 checklist boxes are unticked. This PR was opened by MelvinBot; the body leaves the Tests/QA sections and checklist for the human co-author to complete.
  • Check independent approval — fails because the PR has no independent Contributor+ approval yet.

Everything else is green (35 passing): ESLint, Oxfmt, typecheck, Bun tests, all 8 test jobs (which run the new useSearchBulkActionsPayTest.ts), Storybook, React Compiler, check, and both the branch and baseline perf tests.

To make it mergeable: complete the author checklist and get a reviewer approval.

@DylanDylann

Copy link
Copy Markdown
Contributor

@MelvinBot Mark the PR ready

@MelvinBot
MelvinBot marked this pull request as ready for review August 10, 2026 08:15
@MelvinBot
MelvinBot requested a review from a team as a code owner August 10, 2026 08:15
@melvin-bot
melvin-bot Bot requested review from DylanDylann and JmillsExpensify and removed request for a team August 10, 2026 08:15
@melvin-bot

melvin-bot Bot commented Aug 10, 2026

Copy link
Copy Markdown

@DylanDylann 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 removed the request for review from a team August 10, 2026 08:15
@MelvinBot

Copy link
Copy Markdown
Contributor Author

✅ Marked this PR as Ready for review.

All meaningful CI checks are green — including the new unit test useSearchBulkActionsPayTest.ts that verifies Pay renders offline and selecting it opens the offline modal instead of calling payMoneyRequest. The only two non-passing checks are Check independent approval and PR Author Checklist / checklist, which are expected and don't block.

Note: the human co-author still needs to fill in the Tests and QA Steps sections and complete the author checklist before merge.

@DylanDylann

DylanDylann commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible 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 checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
    • 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 verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • 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 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.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this 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.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
Screen.Recording.2026-08-10.at.15.40.51.mov
Android: mWeb Chrome
Screen.Recording.2026-08-10.at.15.22.33.mov
iOS: HybridApp
Screen.Recording.2026-08-10.at.16.11.52.mov
iOS: mWeb Safari
Screen.Recording.2026-08-10.at.15.41.25.mov
MacOS: Chrome / Safari
Screen.Recording.2026-08-10.at.15.15.11.mov

@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: 02e71a0239

ℹ️ 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".

const shouldShowPayOption = !isOffline && !isAnyTransactionOnHold && shouldEnableBulkPayOption && !!bulkPayButtonOptions?.length;
// Keep Pay visible while offline: selecting it is handled by onBulkPaySelected, which shows the offline modal
// rather than attempting a payment. Gating on !isOffline here would hide Pay entirely offline, which is wrong.
const shouldShowPayOption = !isAnyTransactionOnHold && shouldEnableBulkPayOption && !!bulkPayButtonOptions?.length;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Guard offline Pay submenu selections before KYC

When the user is offline, exposing Pay here still renders its payment-method submenu, but actual submenu clicks in SearchBulkActionsButton are routed through handleBulkPayItemSelected before confirmPayment is called. For non-Elsewhere items that require validation/KYC, add-bank-account invoice items, or locked/restricted-account cases, that helper navigates or opens another flow before the onBulkPaySelected offline guard can run, so selecting Pay offline does not consistently show the offline modal and can send users into verification/KYC/add-bank-account flows instead. Please add an offline guard to the submenu path or only expose offline Pay items that route directly to the offline modal.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@MelvinBot I agree with this comment. Could you guard all payment methods behind an offline guard in advance?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@MelvinBot I agree with this comment. Could you guard all payment methods behind an offline guard in advance?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done — pushed fb151a6. I moved the offline guard up so every payment method is short-circuited before any navigation can happen.

The gap was that submenu clicks route through handleBulkPayItemSelected in Search.ts, whose confirmPayment (the onBulkPaySelected offline guard) only runs at the very end — after the delegate/locked/restricted/KYC/verify-account branches could already navigate the user away. So I added an early offline check right after the item-validity check, before any of those branches:

if (isOffline) {
    Log.info('[BulkPay] Blocking bulk pay: offline, deferring to the offline modal');
    confirmPayment?.(paymentType as PaymentMethodType, item?.additionalData as BulkPaySelectionData | undefined);
    return;
}

isOffline is a new required param passed from both call sites in SearchBulkActionsButton.tsx (it was already available there via useNetwork()). When offline, confirmPaymentonBulkPaySelected just opens the offline modal, so no method can send the user into KYC / account-verification / add-bank-account / restricted-action flows anymore.

I also added a unit test in handleActionButtonPressTest.ts asserting that offline + an unvalidated user + a bank-funded (VBBA) item calls confirmPayment and never triggers triggerKYCFlow or the verify-account navigation.

Checks run locally
  • npm testhandleActionButtonPressTest.ts (13 passed) and useSearchBulkActionsPayTest.ts (16 passed) ✅
  • npm run typecheck (tsc) ✅
  • ESLint on changed files — 0 errors (only pre-existing grandfathered warnings) ✅
  • npm run fmt

The React Compiler compliance check couldn't run in this environment, but the only .tsx change adds an already-in-scope variable into an existing object literal inside pre-existing callbacks, so it introduces no new memoization boundary — CI runs the full check regardless.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

There's nothing here I can fix by pushing code — every code check passes. The only two failing checks are process/human checks, not test or lint failures:

  • PR Author Checklist / checklist — fails because the human-only sections of the PR body are still placeholders: the ### Tests and ### QA Steps sections have // TODO text, and the PR Author Checklist boxes are unchecked. This check passes once you (the human co-author) fill those in and tick the boxes. Melvin intentionally does not fill out the human Tests/QA/checklist sections.
  • Check independent approval — fails because the PR hasn't yet received the required independent peer-review approval. This clears once a reviewer approves; nothing to fix in the code.

All actual CI is green: Bun tests, the test (job 1–8) suite, ESLint, Oxfmt, typecheck, Storybook, React Compiler Compliance, spellcheck, and all builds passed.

So no commit is needed — just complete the author checklist/Tests/QA sections and get the peer approval, and both checks will go green.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Still nothing to push a fix for — the state is unchanged from my previous comment. The only two failing checks are process/human checks, not code failures:

  • PR Author Checklist / checklist — fails because the human-only ### Tests / ### QA Steps sections are still // TODO placeholders and the PR Author Checklist boxes are unchecked. You (the human co-author) need to fill those in and tick the boxes; Melvin intentionally doesn't complete the human sections.
  • Check independent approval — fails because the PR hasn't received the required independent peer-review approval yet. It clears once a reviewer approves.

Every code check is green (Bun tests, test (job 1–8), ESLint, Oxfmt, typecheck, Storybook, React Compiler, spellcheck, builds), so no commit is needed.

@DylanDylann

Copy link
Copy Markdown
Contributor

@MelvinBot I agree with this comment. Could you guard all payment methods behind an offline guard in advance?

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Same as before — nothing here can be fixed by pushing code. All code checks (Bun tests, the test (job 1–8) suite, ESLint, Oxfmt, typecheck, Storybook, React Compiler, spellcheck, builds) are green. The only two failing checks are process/human checks:

  • PR Author Checklist / checklist — fails because the human-only sections of the PR body are still placeholders: ### Tests and ### QA Steps contain // TODO text and the PR Author Checklist boxes are unchecked. Melvin intentionally doesn't fill those out. This passes once the human co-author completes them.
  • Check independent approval — fails because the PR hasn't yet received the required independent peer-review approval. It clears once a reviewer approves.

No commit is needed. Complete the author checklist / Tests / QA sections and get the peer approval, and both checks will go green.

Co-authored-by: DylanDylann <DylanDylann@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team as a code owner August 10, 2026 08:32
@melvin-bot
melvin-bot Bot requested review from puneetlath and removed request for a team August 10, 2026 08:32
@melvin-bot

melvin-bot Bot commented Aug 10, 2026

Copy link
Copy Markdown

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

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The offline-guard change I pushed earlier (fb151a6) is now fully validated by the fresh CI run — including React Compiler Compliance and typecheck, which I couldn't run locally. All code checks are green: React Compiler, typecheck, ESLint, Oxfmt, Bun tests, all 8 test jobs (running handleActionButtonPressTest.ts and useSearchBulkActionsPayTest.ts), Storybook, check, spellcheck, and every build. The perf tests are still running but don't gate merge and are unaffected by this logic change.

The only two failing checks are the same human-gated ones — not code failures, nothing I can push a fix for:

  • PR Author Checklist / checklist — the human-only ### Tests / ### QA Steps sections are still // TODO placeholders and the author checklist boxes are unchecked. Melvin intentionally doesn't complete these; the human co-author needs to.
  • Check independent approval — no independent peer-review approval yet; clears once a reviewer approves.

So the code is in good shape and nothing needs to be pushed — just complete the author checklist/Tests/QA and get a review approval, and both checks go green.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Good news — this is already handled in the current PR head (fb151a6). All bulk-pay payment methods are guarded behind the offline modal before any downstream flow can run.

The guard is the first branch in handleBulkPayItemSelected, so it short-circuits every payment method (including bank-funded / add-bank-account / invoice items and locked/restricted-account cases) to the offline modal via confirmPayment before the KYC-wall, verify-account, restricted-action, or delegate branches can navigate:

src/libs/actions/Search.ts:1908-1914

That directly addresses chatgpt-codex-connector's concern — offline submenu selections can no longer be routed into verification/KYC/add-bank flows.

Coverage:

All test, typecheck, ESLint, Oxfmt, and React Compiler checks are green on fb151a6, so no further change is needed here.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Nothing has changed since my previous comment, and there's still nothing I can fix by pushing code. The only two failing checks remain process/human checks:

  • PR Author Checklist / checklist — clears once the human co-author fills in the ### Tests and ### QA Steps sections (still // TODO) and ticks the PR Author Checklist boxes.
  • Check independent approval — clears once a reviewer gives the required independent approval.

validate-perf-tests is still running but is not failing. All other code checks (Bun tests, test (job 1–8), ESLint, Oxfmt, typecheck, Storybook, React Compiler, spellcheck, builds) are green — so no commit is needed here.

@DylanDylann

Copy link
Copy Markdown
Contributor

@MelvinBot BUG: On the iOS app, the app freezes when clicking 'Bulk Pay' while offline.

Screen.Recording.2026-08-10.at.15.39.12.mov

Presenting the offline DecisionModal synchronously while the payment popover
is still dismissing freezes the app on iOS. Route the offline guard in
onBulkPaySelected through deferModalPresentationAfterPopoverDismiss, matching
the existing delegate/locked-account guards, so the modal presents only after
the popover transition completes.

Co-authored-by: DylanDylann <DylanDylann@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Fixed the iOS freeze on bulk Pay while offline and pushed to this branch (606bb795ee).

Root cause: Selecting Pay offline calls onBulkPaySelected, which showed the offline DecisionModal synchronously while the payment popover was still dismissing. On iOS, presenting a modal while another modal is dismissing freezes the app — this is documented in deferModalPresentationAfterPopoverDismiss/index.ios.ts:5. The delegate-access and locked-account guards already route through that helper; the offline guard did not.

Fix: Route the offline guard in useSearchBulkActions.ts:1168 through deferModalPresentationAfterPopoverDismiss, so the offline modal presents only after the popover transition completes. On web/Android the helper runs the callback immediately (no behavior change); this covers both the top-level Pay option and the payment submenu items, since both go through onBulkPaySelected / confirmPayment.

Verification
  • Updated the unit test to mock the defer helper (its iOS TransitionTracker callback never fires under Jest), so it still asserts the offline modal opens and no payment is attempted — all 4 tests pass.
  • npm test (this file), ESLint (0 errors), and typecheck-tsgo are green locally.
  • The bug is iOS-native, so it can't be reproduced on the web test harness — the fix is verified by code inspection against the documented iOS constraint plus the unit test. Please confirm on an iOS build.

@DylanDylann

Copy link
Copy Markdown
Contributor

@puneetlath Could you complete the author checklist? I can't edit the PR description created by Melvin. The test steps are already correct

@MelvinBot

Copy link
Copy Markdown
Contributor Author

All code checks are green on the latest commit (606bb79, the iOS bulk-Pay offline freeze fix) — Bun tests, the full test (job 1–8) suite, ESLint, Oxfmt, typecheck, Storybook, React Compiler, all builds, and the perf tests all pass. There's nothing to fix by pushing code.

The only two failing checks are process/human checks, not code failures:

  • PR Author Checklist / checklist — fails because the human-only ### Tests and ### QA Steps sections are still // TODO placeholders and the author checklist boxes are unchecked. This clears once you (the human co-author) fill those in and tick the boxes; Melvin intentionally doesn't complete the human checklist/Tests/QA sections.
  • Check independent approval — fails because the PR hasn't yet received the required independent peer-review approval.

Both go green once the checklist/Tests/QA sections are completed and a reviewer approves — no commit needed.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No code fix to push — all code checks are green on the latest commit (606bb79). The only two remaining red checks are human-gated process checks that a commit cannot resolve:

  • PR Author Checklist / checklist — waiting on the human co-author to complete the ### Tests and ### QA Steps sections (still // TODO) and tick the PR Author Checklist boxes. Melvin intentionally does not fill these out.
  • Check independent approval — waiting on an independent reviewer's approval.

Both clear once a human completes the checklist/Tests/QA and a reviewer approves — no push required. Re-running me won't change this since there's nothing in the code to fix.

@JmillsExpensify JmillsExpensify left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Didn't test an ahoc, though the testing steps align with product spec

@puneetlath

Copy link
Copy Markdown
Contributor

@DylanDylann the PR author checklist check is failing.

@DylanDylann

Copy link
Copy Markdown
Contributor

@puneetlath Could you complete the author checklist? I can't edit the PR description created by Melvin. The test steps are already correct

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The only failing check is PR Author Checklist (run) — and it's a stale result, not a code problem, so there's nothing to push.

What happened: the checklist action evaluates the PR description body, not the code. It ran while the body still had the checklist empty (You completed 0 out of 38 checklist items). The description has since been filled in with all 38 boxes checked, so the check just needs to re-run against the current body to go green.

Every other check (tests, typecheck, ESLint, oxfmt, build, perf, etc.) is passing.

To clear it: re-run the failed PR Author Checklist job (Checks tab → PR Author Checklist → Re-run failed jobs). I attempted the re-run from here but don't have permission to trigger it in this environment.

@puneetlath
puneetlath merged commit 90dd1c1 into main Aug 11, 2026
46 of 50 checks passed
@puneetlath
puneetlath deleted the claude-showPayOptionOfflineBulkSelection branch August 11, 2026 15:09
@OSBotify

Copy link
Copy Markdown
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@github-actions

Copy link
Copy Markdown
Contributor

🚧 puneetlath has triggered a test Expensify/App build. You can view the workflow run here.

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/puneetlath in version: 9.4.53-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Help site review: no changes required

I reviewed this PR against the help articles in App/docs/articles and no help site updates are needed, so I did not open a draft docs PR.

Why: This is an internal offline-behavior correctness fix. It makes the Pay option appear in the bulk-actions ("N selected") dropdown while offline and routes a click to the standard offline modal instead of hiding the option (src/hooks/useSearchBulkActions.ts). The online paying flow — the only flow the help site documents — is unchanged.

The relevant articles (Pay-Expenses.md, Understanding-Report-Statuses-and-Actions.md) describe how to pay reports; they do not document the granular offline visibility of the bulk-selection dropdown, and the help site doesn't document per-feature offline-modal behavior (it's standard app-wide UX). Nothing customer-facing in the docs is affected.

@DylanDylann if you feel any customer-facing behavior here should be documented, let me know and I'll draft the help site PR.

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.

5 participants