fix(money): scroll 'Your balance' heading with content (MUSD-779)#29863
Conversation
The heading was rendered between the screen header and the scrollable list, leaving it pinned while the content scrolled beneath it. Move it into each scroll container (FlashList ListHeaderComponent for the funded path, inline inside the empty-state and skeleton ScrollViews) so it scrolls naturally with the rest of the page. To reach FlashList's header slot from the screen, an additive listHeaderComponent prop was added to <Tokens> and <TokenList>, mirroring the existing listFooterComponent pattern.
|
CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit b2720ea. Configure here.
…pty state (MUSD-779) When the user has mUSD on some chain but the active network filter excludes it, <Tokens> takes its internal empty-state branch. That branch wraps the empty state in a ScrollView when listFooterComponent or refreshControl is passed, but did not render listHeaderComponent. Include it so the heading remains visible in this case. Caught by Cursor Bugbot on PR review.
🔍 Smart E2E Test Selection
click to see 🤖 AI reasoning detailsE2E Test Selection:
The The No other tags are needed because:
Performance Test Selection: |
|




Description
The "Your balance" heading on the Money Hub screen (
CashTokensFullView) was rendered between the screen header and the scrollable list, leaving it pinned at the top while content scrolled beneath it. This created a visually disconnected UX between the heading and the list.The heading is now moved into each scrollable container so it scrolls naturally with the rest of the page:
ListHeaderComponentof the FlashList inside<TokenList>.ScrollView.ScrollView.To reach FlashList's header slot from the screen, an additive
listHeaderComponentprop was added to<Tokens>and<TokenList>, mirroring the existinglistFooterComponentpattern (opt-in, no behavior change for existing callers). A smallwrapEdgeNodehelper deduplicates the-mx-4padding-compensation that header and footer both need inisFullViewmode.Note:
<Tokens>/<TokenList>belong to the wallet team. Touching them was the minimal way to reach FlashList's header slot — flagging for wallet-team awareness during review.Changelog
CHANGELOG entry: Fixed a bug where the "Your balance" heading on the Money Hub stayed pinned to the top of the screen instead of scrolling with the content.
Related issues
Fixes: MUSD-779
Manual testing steps
```gherkin
Feature: Money Hub Your balance heading scrolls with content
Scenario: user with mUSD scrolls the Money Hub
Given the user has mUSD balance on at least one chain
And the user is on the Money Hub
When the user scrolls down
Then the "Your balance" heading scrolls off-screen with the rest of the content
When the user scrolls back to the top
Then the "Your balance" heading reappears in flow above the mUSD list
Scenario: user without mUSD scrolls the Money Hub empty state
Given the user has no mUSD balance
And the user is on the Money Hub
When the user scrolls down
Then the "Your balance" heading scrolls off-screen with the empty-state content
```
Screenshots/Recordings
Before
After
Simulator.Screen.Recording.-.iPhone.16.Pro.26.3.-.2026-05-07.at.15.30.12.mov
Pre-merge author checklist
Performance checks (if applicable)
Pre-merge reviewer checklist
Note
Low Risk
Low risk UI/layout change that threads a new optional
listHeaderComponentprop throughTokens/TokenList; main risk is minor rendering/padding regressions in full-view/empty-state paths.Overview
Fixes Money Hub (CashTokensFullView) so the "Your balance" heading scrolls with the token content instead of staying pinned.
This adds an optional
listHeaderComponentprop toTokensandTokenList, wiring it through both the map-rendered list and the FlashListListHeaderComponent, and updates the empty-state and skeleton ScrollViews to render the header at the top. It also deduplicates full-view edge padding compensation for both header and footer viawrapEdgeNode.Reviewed by Cursor Bugbot for commit 8ab8ff1. Bugbot is set up for automated code reviews on this repo. Configure here.