feat(v2): route tip-card & chats tabs through the tipping flow - #1224
Merged
Conversation
AppBarWithTitle reserved a phantom leading slot (a back button's width) for every title so a centered one stays optically balanced against the end actions. For a start/end-aligned title that only indents it past a control that isn't there. Gate the reservation to centered titles, and probe the raw leading icon (the slot's 5dp padding otherwise makes an empty slot measure non-zero) so a start-aligned title with no leading control sits flush at the inset. Add a screenTitleLarge type token for large flush titles (e.g. the Chats tab).
Wire the two remaining v2 nav-bar tabs (were TODO/null) to the existing tipping flow rather than bespoke screens, so tab taps, deeplinks, and the tip-card decorator all land in one code path: - NavBarButton.TipCard -> AppRoute.Sheets.Tips(resumed = true) (flow at TipCard) - NavBarButton.Chats -> AppRoute.Sheets.Tips(resumed = false) (flow at the list) - asNavBarTab maps Sheets.Tips back to the tab by its resumed flag. TippingFlowScreen renders safely as a full-screen tab: the sheet-dismiss dispatcher defaults to a no-op, so the flow's onExit is inert off a sheet. Collapse the v1/v2 screens into one public flag-branched screen each (TipCardScreen, TipsScreen), moved out of internal/screens. Both are always flow steps, so they always use the flow-shared TipFlowViewModel; only the chrome differs by FeatureFlag.NewUi: - TipCard: v2 = centered card + hamburger menu; v1 = title/back/share scaffold. - Tips: v2 = flush "Chats" large title, no close/button; v1 = "Tips" + close + a "Show Tip Card" button. The shared hamburger icon moves from the scanner module into core so both v1 and v2 resolve it. Adds :shared:featureflags to the tipping module.
bmc08gt
force-pushed
the
feat/v2-tipcard-chats-tabs
branch
from
August 12, 2026 18:36
5bd7229 to
d8b81b2
Compare
The tip-card tab is the tipping flow at Sheets.Tips(resumed = true). The flow seeded its first step from the VM's state.steps, which defaults to [Tips] and only becomes [TipCard] after the async profile combine resolves — so a tab switch that crossfades into the tip-card tab briefly rendered the chats list. Seed [TipCard] straight from route.resumed instead, so the card shows from the first frame.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Wires the two remaining v2 nav-bar tabs (previously
TODO(v2)/null) to the existing tipping flow rather than bespoke screens, so tab taps, deeplinks, and the tip-card decorator all share one code path:NavBarButton.TipCard→AppRoute.Sheets.Tips(resumed = true)— flow seeded on the tip card.NavBarButton.Chats→AppRoute.Sheets.Tips(resumed = false)— flow seeded on the list.asNavBarTabmapsSheets.Tipsback to a tab by itsresumedflag.TippingFlowScreenrenders safely as a full-screen tab:LocalBottomSheetDismissDispatcherdefaults to a no-op, so the flow'sonExit/sheetDismissis inert when it isn't a sheet.Because both tabs go through the flow, deeplinks (
AppRouter) andTipCardDecorator— which already targetSheets.Tips— need no changes.Screen consolidation
The v1 and v2 screens collapse into one public, flag-branched screen each (
TipCardScreen,TipsScreen), moved out ofinternal/screens. Both are always flow steps, so they always use the flow-sharedTipFlowViewModel; only the chrome differs byFeatureFlag.NewUi:Also
AppBarWithTitle: start/end-aligned titles now sit flush (the phantom leading slot is reserved only for centered titles); adds ascreenTitleLargetype token for the Chats title.coreso v1 and v2 both resolve it.:shared:featureflagsto the tipping module.Test Plan
:apps:flipcash:features:tipping,:core, and:apps:flipcash:appKotlin-compile.Note
With
resumed = false, the Chats tab shows the profile-setup Intro step if the user has no display name yet (existing flowstepslogic) — edge case; can force the list instead if preferred.