Skip to content

feat(money): card linking homepage state (MUSD-609)#29177

Merged
Kureev merged 8 commits into
mainfrom
kureev/MUSD-602-card-linking-state
Apr 24, 2026
Merged

feat(money): card linking homepage state (MUSD-609)#29177
Kureev merged 8 commits into
mainfrom
kureev/MUSD-602-card-linking-state

Conversation

@Kureev

@Kureev Kureev commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

Description

Implements the Money Account homepage "card linking" state — displayed when a user has deposited funds and has an unlinked MetaMask Card. This state encourages card linking with benefits messaging.

Subtasks implemented:

  • MUSD-610: Updated the "Step 2 of 2" MoneyOnboardingCard with a variant prop ('get-card' | 'link-card'). The link-card variant shows "Link your MetaMask Card" title, cashback description, benefits bullets (checkmark icons with cashback and APY text), and a "Link card" CTA button.
  • MUSD-611: Added a mode prop ('upsell' | 'link') to MoneyMetaMaskCard. Link mode replaces the virtual/metal card rows with a card-linking layout: metal card thumbnail, benefits bullets, and a full-width "Link card" button.
  • MUSD-612: Wired the card-unlinked state in MoneyHomeView using the selectIsCardholder Redux selector. When isMilestone && isCardholder, both MoneyOnboardingCard and MoneyMetaMaskCard switch to their link-card variants. Verified all 6 reused sections (balance, action pills, earnings, activity, condensed cards, potential earnings) render correctly in the new state.

Card linking CTA handlers are currently stubbed with displayUnderConstructionAlert — they will be wired to the card linking flow when MUSD-489 lands.

Changelog

CHANGELOG entry: null

Related issues

Fixes: MUSD-602

Manual testing steps

Feature: Money Account card linking homepage state

  Scenario: user sees card linking prompt when they have an unlinked card
    Given user has a Money Account with balance > $0.00
    And user has ordered/received a MetaMask Card (isCardholder = true)
    And card is NOT linked to Money Account

    When user navigates to Money home screen
    Then the "Step 2 of 2" card shows "Link your MetaMask Card" title
    And benefits bullets show "Get 1-3% cashback" and "Earn 4% APY on your balance"
    And CTA button reads "Link card"
    And MetaMask Card section shows card linking layout instead of virtual/metal card rows
    And all other sections (balance, earnings, activity, condensed cards) display correctly

  Scenario: user without a card sees standard milestone state
    Given user has a Money Account with balance > $0.00
    And user does NOT have a MetaMask Card (isCardholder = false)

    When user navigates to Money home screen
    Then the "Step 2 of 2" card shows "Get your MetaMask Card" title
    And MetaMask Card section shows virtual/metal card rows with "Get now" buttons

Screenshots/Recordings

image image

Pre-merge author checklist

Performance checks (if applicable)

  • I've tested on Android
  • I've tested with a power user scenario
  • I've instrumented key operations with Sentry traces for production performance metrics

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.

Note

Low Risk
Low risk UI/state changes: new rendering variants and CTA routing based on selectIsCardholder, with handlers still stubbed to under-construction alerts.

Overview
Adds a new “card-unlinked” homepage state on MoneyHomeView when the user is in a milestone/filled state and selectIsCardholder is true, switching the onboarding CTA to a link-card flow.

Extends MoneyOnboardingCard with a variant to swap step-2 copy/CTA for card linking, and extends MoneyMetaMaskCard with a mode="link" layout (benefit bullets + “Link card” button, plus APY display) instead of the virtual/metal upsell rows.

Updates English i18n strings and expands unit tests to cover the new variants/mode and CTA press behavior across empty/milestone/card-unlinked states.

Reviewed by Cursor Bugbot for commit 0a8d8ea. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions

Copy link
Copy Markdown
Contributor

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.

@Kureev Kureev self-assigned this Apr 22, 2026
@Kureev Kureev marked this pull request as ready for review April 22, 2026 14:14
@Kureev Kureev requested a review from a team as a code owner April 22, 2026 14:14
@github-actions github-actions Bot added the risk:low AI analysis: low risk label Apr 22, 2026

@cursor cursor Bot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ 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 e81fa15. Configure here.

Comment thread app/components/UI/Money/Views/MoneyHomeView/MoneyHomeView.tsx
@github-actions

Copy link
Copy Markdown
Contributor

AI PR Analysis

🚫 Merge safe: false | 🟢 Risk: low

No summary available.

View run

@Matt561 Matt561 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.

Some minor comments but otherwise LGTM! I'm mostly unsure about how the card is expected to link to the Money account and whether selectIsCardholder is the correct selector to use.

Comment thread app/components/UI/Money/Views/MoneyHomeView/MoneyHomeView.tsx
Comment thread app/components/UI/Money/Views/MoneyHomeView/MoneyHomeView.tsx Outdated
Comment thread locales/languages/en.json Outdated
@Kureev Kureev requested a review from Matt561 April 24, 2026 08:31
@Kureev Kureev changed the title feat(money): card linking homepage state (MUSD-602) feat(money): card linking homepage state (MUSD-609) Apr 24, 2026
@Kureev Kureev enabled auto-merge April 24, 2026 14:52
Matt561
Matt561 previously approved these changes Apr 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔍 Smart E2E Test Selection

  • Selected E2E tags: SmokeCard, SmokeTrade, SmokeConfirmations
  • Selected Performance tags: None (no tests recommended)
  • Risk Level: medium
  • AI Confidence: 88%
click to see 🤖 AI reasoning details

E2E Test Selection:
The changes are scoped to the Money/Card feature area:

  1. MoneyMetaMaskCard.tsx: Added a new mode prop ('upsell' | 'link') with a new LinkContent component and CheckBullet sub-component. This introduces a card-linking UI mode for existing cardholders, with new test IDs and localization strings.

  2. MoneyOnboardingCard.tsx: Added a variant prop ('get-card' | 'link-card') that controls step 2 content for cardholders vs. non-cardholders.

  3. MoneyHomeView.tsx: Integrated selectIsCardholder Redux selector to conditionally render the link-card variant in both MoneyOnboardingCard and MoneyMetaMaskCard components. This is the Card home screen.

  4. MoneyMetaMaskCard.testIds.ts: New test IDs for link mode elements (LINK_CONTAINER, LINK_SUBTITLE, LINK_CARD_IMAGE, LINK_BULLET_CASHBACK, LINK_BULLET_APY, LINK_BUTTON).

  5. locales/languages/en.json: New strings for link card flow (link_card_title, link_card_description, link_card_cta, link_title, link_subtitle, link_bullet_cashback, link_bullet_apy, link_card).

SmokeCard is the primary tag as these changes directly affect the Card home screen UI and cardholder experience. Per the SmokeCard tag description, SmokeTrade and SmokeConfirmations must also be selected since Add Funds uses swaps requiring transaction confirmations.

The changes are isolated to the Money/Card feature area and do not touch shared navigation, browser, accounts, or other feature areas.

Performance Test Selection:
The changes are UI component additions within the Money/Card feature area. They add a new 'link' mode to MoneyMetaMaskCard and a 'link-card' variant to MoneyOnboardingCard. These are conditional rendering changes that don't affect app startup, account list rendering, login flows, or other performance-sensitive areas. No performance tests are warranted.

View GitHub Actions results

@sonarqubecloud

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown
Contributor

E2E Fixture Validation — Schema is up to date
12 value mismatches detected (expected — fixture represents an existing user).
View details

@Matt561 Matt561 self-requested a review April 24, 2026 16:20
@Kureev Kureev added this pull request to the merge queue Apr 24, 2026
Merged via the queue into main with commit 592b39a Apr 24, 2026
100 of 102 checks passed
@Kureev Kureev deleted the kureev/MUSD-602-card-linking-state branch April 24, 2026 16:34
@github-actions github-actions Bot locked and limited conversation to collaborators Apr 24, 2026
@metamaskbotv2 metamaskbotv2 Bot added the release-7.76.0 Issue or pull request that will be included in release 7.76.0 label Apr 24, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-7.76.0 Issue or pull request that will be included in release 7.76.0 risk:low AI analysis: low risk size-M team-earn

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants