fix(MUSD-672): resolve Money Hub UX and UI inconsistencies cp-7.74.0#29049
Conversation
|
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. |
…ducation redirect
- Remove duplicate useMerklBonusClaim mount from useCashTokensRefresh (was creating a second 60s API polling interval); accept optional refetchMerklBonus callback instead - Extract shared MusdNavigationTarget type into musd.types.ts - Remove unnecessary as-never casts in education view navigation - Fix Buy button test missing Money Hub flag
Add tests for handleConvertMaxPress, handleConvertEditPress, handleConvertPress (including error paths), goToSwaps, goToBuy in Money Hub mode, and handleLearnMorePress.
…lView CashTokensFullView already shows its own dedicated skeleton during the initial load. The Tokens component's internal TokenListSkeleton was also rendering, causing two skeletons to flash sequentially. Add hideLoadingSkeleton prop to suppress the internal skeleton when the parent handles loading state.
…on gate - Replace navigation.replace with navigation.navigate in education view since returnTo targets a screen outside the Earn stack (replace only works within the current navigator). - Extract shared education-gate logic into useCashNavigation hook, eliminating duplication between CashSection and MusdAggregatedRow.
useCashTokensRefresh now accepts a MutableRefObject instead of a callback parameter. This eliminates the stale-closure risk — the ref is read at invocation time inside onRefresh, so the callback identity never participates in the dependency array. Added a test verifying that a ref populated after hook creation is correctly read on refresh.
submitContinuePressedEvent now checks for returnTo before falling through to the deeplink/default branches, logging MONEY_HUB as the destination instead of incorrectly reporting QUICK_CONVERT or CUSTOM_AMOUNT when the user came through the education gate from the home section header.
🔍 Smart E2E Test Selection
click to see 🤖 AI reasoning detailsE2E Test Selection:
The Performance Test Selection: |
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 700f157. Configure here.
| <Tokens | ||
| isFullView | ||
| showOnlyMusd | ||
| hideLoadingSkeleton |
There was a problem hiding this comment.
Loading gap between parent skeleton and child content
Medium Severity
When CashTokensFullView dismisses its skeleton after InteractionManager, it mounts Tokens with hideLoadingSkeleton={true}. But Tokens has its own hasInitialLoad state that also waits for a separate InteractionManager tick. During that gap, tokenContent returns null because hideLoadingSkeleton suppresses the internal skeleton while hasInitialLoad is still false. This creates a visible flash of empty content (header + blank area + footer) on every screen load, between the parent skeleton disappearing and the child content appearing.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 700f157. Configure here.
|
|
✅ E2E Fixture Validation — Schema is up to date |





Description
There are several UX and UI inconsistencies across the Money Hub that reduce conversion confidence, time-to-first-transaction, and overall clarity in the mUSD journey. This PR resolves them:
dismissOnButtonPresssupport toTooltipModal.RampIntentasset ID.returnToandnavigationOverrideparams, routing back to the correct Money Hub context instead of defaulting to Quick Convert.CashTokensFullViewSkeleton.useCashTokensRefreshhook that orchestrates parallel refresh of EVM token data and Merkl bonus rewards.Changelog
CHANGELOG entry: Fixed Money Hub UX inconsistencies including education gate on home entry, tooltip persistence, Buy pre-selection, education context routing, dedicated loading skeleton, and pull-to-refresh
Related issues
Fixes: MUSD-672
Manual testing steps
Screenshots/Recordings
Before
N/A — behavioral changes, no visual design changes
After
N/A — behavioral changes, no visual design changes
Pre-merge author checklist
Pre-merge reviewer checklist
Note
Medium Risk
Changes navigation flow into Money Hub, adds new refresh orchestration, and alters tooltip dismissal behavior; regressions could affect user routing and refresh UX but do not touch security-critical logic.
Overview
Improves the Money Hub (Cash/mUSD) UX by gating the Home Cash entry behind the mUSD education screen when the user hasn’t seen it yet, using a new shared
useCashNavigationpath and a newreturnToroute param so the education screen can exit to Money Hub without starting conversion.Updates the education screen to honor caller intent by forwarding
navigationOverrideintoinitiateCustomConversion, addingreturnTonavigation, and tracking a newredirects_tolocation (MONEY_HUB) for analytics.Enhances Money Hub loading/refresh by adding a first-paint
CashTokensFullViewSkeleton, a pull-to-refresh hook (useCashTokensRefresh) that refreshes token data plus Merkl rewards via a newrefetchsurface fromuseMerklBonusClaim(plumbed up throughAssetOverviewClaimBonus), and allowingTokens/TokenListto accept an externalrefreshControland optionally hide the internal skeleton.Fixes bonus tooltip UX by adding
dismissOnButtonPresssupport toTooltipModal/useTooltipModaland using it from the “Your bonus” tooltip so “Learn more” can open an external URL without dismissing the sheet; Money Hub “Buy” now passes an mUSDassetIdto preselect mUSD.Reviewed by Cursor Bugbot for commit 700f157. Bugbot is set up for automated code reviews on this repo. Configure here.