Skip to content

[PM-37284] fix: Show Upgraded to Premium card across all Send view states#6947

Open
SaintPatrck wants to merge 5 commits into
mainfrom
premium-upgrade/pm-37284-send-tab-upgraded-card
Open

[PM-37284] fix: Show Upgraded to Premium card across all Send view states#6947
SaintPatrck wants to merge 5 commits into
mainfrom
premium-upgrade/pm-37284-send-tab-upgraded-card

Conversation

@SaintPatrck
Copy link
Copy Markdown
Contributor

@SaintPatrck SaintPatrck commented May 19, 2026

🎟️ Tracking

PM-37284

📔 Objective

The Send tab's "Upgraded to Premium" celebration card was rendered as the first item of the Content branch's LazyColumn, so users whose Send tab was in Empty, Loading, or Error view state never saw the card even when they were eligible. Eligibility was the intended gate; viewState was incidentally gating it.

Move card rendering into each scrollable container — first LazyColumn item in SendContent and first child of SendEmpty's verticalScroll Column — so the card surfaces in both states that have a scrollable surface and flows with the rest of the view (a scaffold-body hoist pinned the card above SendEmpty's centered illustration and broke the intended visual continuity). Loading and Error remain full-screen non-scrolling placeholders and do not host the card. Extract the inline BitwardenActionCard block into a private UpgradedToPremiumActionCard composable to match the screen-owned action-card convention used in VaultContent.kt.

📸 Screenshots

Before After

…ates

The Send tab's "Upgraded to Premium" celebration card was only rendered
inside the Content branch's LazyColumn, so users in Empty, Loading, or
Error view states never saw it. Hoist the card to the scaffold body
above the viewState branching so eligibility is the only gate.
The hoist fix in 44e8f32d5 shipped with an Empty-state render
assertion, but the bug was viewState-routing across all four
branches. Add parallel Loading and Error assertions so a future
regression of the scaffold-body placement is caught no matter
which non-Content state is active.
…osable

The inline BitwardenActionCard block in SendScreen's scaffold body
diverged from the codebase convention where action cards are wrapped
in a private composable owned by the screen file (see VaultContent's
private ActionCard at VaultContent.kt:545-608). Extracting keeps the
SendScreen body focused on layout structure and makes the card
independently composable for future preview/test work.
@SaintPatrck SaintPatrck added the ai-review-vnext Request a Claude code review using the vNext workflow label May 19, 2026
@github-actions github-actions Bot added app:password-manager Bitwarden Password Manager app context t:bug Change Type - Bug labels May 19, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 19, 2026

Bitwarden Claude Code Review

Overall Assessment: APPROVE

Reviewed the hoisting of the "Upgraded to Premium" action card out of SendContent's LazyColumn so eligibility — not view state — gates its display, the addition of the card to SendEmpty's scrollable Column, the extraction of the inline BitwardenActionCard block into a private screen-owned UpgradedToPremiumActionCard composable in SendScreen.kt, and the three new tests covering card presence/absence in Empty, Loading, and Error view states. The screen-owned action-card pattern matches the existing VaultContent.kt convention, all call sites in SendScreen.kt are updated consistently, and previews in SendEmpty.kt were updated to pass the new required parameters. No security, correctness, or breaking-change concerns identified.

Code Review Details

No findings to report. The fix is well-scoped, the extracted composable follows the screen-owned action-card convention, and the new tests prevent regression of the Empty-state card display while documenting the intentional decision to keep Loading and Error states as non-scrolling placeholders without the card.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 19, 2026

Codecov Report

❌ Patch coverage is 75.67568% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 85.11%. Comparing base (6cf7227) to head (27d961c).

Files with missing lines Patch % Lines
...x8bit/bitwarden/ui/tools/feature/send/SendEmpty.kt 57.14% 6 Missing ⚠️
...8bit/bitwarden/ui/tools/feature/send/SendScreen.kt 85.71% 2 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #6947      +/-   ##
==========================================
- Coverage   86.30%   85.11%   -1.20%     
==========================================
  Files         873     1049     +176     
  Lines       63220    66194    +2974     
  Branches     9165     9277     +112     
==========================================
+ Hits        54563    56341    +1778     
- Misses       5508     6685    +1177     
- Partials     3149     3168      +19     
Flag Coverage Δ
app-data 16.71% <0.00%> (-0.34%) ⬇️
app-ui-auth-tools 19.50% <75.67%> (+0.31%) ⬆️
app-ui-platform 16.71% <0.00%> (+0.55%) ⬆️
app-ui-vault 28.53% <0.00%> (+0.51%) ⬆️
authenticator 6.25% <0.00%> (-0.03%) ⬇️
lib-core-network-bridge 4.08% <0.00%> (ø)
lib-data-ui 1.12% <0.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Hosting the card in the scaffold-body Column pinned it above the
scrollable list and centered illustration, breaking the visual
continuity the design intends. Move card rendering into each
scrollable container — first LazyColumn item in SendContent and
first child of SendEmpty's verticalScroll Column — so the card
flows with the rest of the view. Loading and Error remain full-
screen non-scrolling placeholders and no longer host the card.
@SaintPatrck SaintPatrck marked this pull request as ready for review May 19, 2026 22:15
@SaintPatrck SaintPatrck requested review from a team and david-livefront as code owners May 19, 2026 22:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-review-vnext Request a Claude code review using the vNext workflow app:password-manager Bitwarden Password Manager app context t:bug Change Type - Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant