Skip to content

feat(groups): Show Group Card on every invite link, and the host Invite sheet - #1912

Merged
bmc08gt merged 12 commits into
code/cashfrom
feat/group-invite-link-card
Oct 30, 2026
Merged

bmc08gt merged 12 commits into
code/cashfrom
feat/group-invite-link-card

Conversation

@bmc08gt

@bmc08gt bmc08gt commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator

Implements surface 1 of docs/specs/group-invites.md from code-payments/flipcash-client-orchestrator#82 (built against 31dc181; that PR is still open).

Invite People sheet. Both links now use the layout the invite link ships today: link pill, Share and Copy tiles, Recent Chats. The plain /chat link sits in the same pill without the "Expires · joined" line. Both links get a Show Group Card tile next to Share and Copy. Figma 1k's full-width rows are stale, so this follows the shipped sheet, not the frame.

Host sheet (1m to 1m″). This replaces the BottomBarManager host message with a ChatStep.InviteHost sheet: the link card with its ⋯ menu (Copy Link, Show Group Card, Revoke and Make New Link), Approve new members, and Manage Invites. The Approve switch is stored per account and group in DataStoreApproveNewMembersStore. With it on, the card shows the plain link and Share Link opens the plain sheet. Share Link and Manage Invites return the pick as a nav result, and the screen beneath opens the next sheet once this one closes, the way 2b does. The card and rows use white at 0.08 and the pill white at 0.06, as 1m does; the Invite People pill keeps White05.

1e's button now turns the switch on instead of opening the plain sheet.

Group card (1j). The invite URL reaches the card in memory: GroupCardLinks holds it by chat id, and GroupCardViewModel takes it and falls back to the plain link. AppRoute.Menu.GroupCard carries only the chat id, and GroupCardRouteTest checks that the serialized route contains no invite URL or #s= secret. For an invite URL the card shows "Scan to join" and the link's status under the QR. GroupCardQrTest decodes an 82-byte invite link through the logo at level M.

After process death the route restores without the in-memory link, so the card falls back to the plain link.

Tests: DataStoreApproveNewMembersStoreTest, GroupCardLinksTest, GroupCardRouteTest, GroupCardQrTest, an updated GroupCardTileTest (the tile shows for invite links), InviteLinkViewModelTest, and the 1m and 1m′ renders in InviteFramesScreenshotTest.

Open: after Revoke and Make New Link, the card shows an empty pill and the next tap creates a link. No frame covers that state.

…t's Approve new members switch

Show Group Card now sits next to Share and Copy for both the plain link and
an invite link, and the invite sheet's pill shows the plain link the same
way. The card encodes the link it was opened from; the link reaches it in
memory (GroupCardLinks), never on the saved AppRoute.Menu.GroupCard route,
since an invite link's fragment is the chat key's secret.

The host's Invite sheet (spec frame 1m) replaces the bottom-bar message:
one link card, an Approve new members switch kept per group and account,
and Manage Invites. Spec: code-payments/flipcash-client-orchestrator#82,
docs/specs/group-invites.md surface 1.
…e Figma's darker surfaces on it

Share Link and Manage Invites return their pick through the nav result, as 2b does, so the
next sheet opens once the host sheet is gone. The link card and both rows use white at 0.08
and the pill white at 0.06; the Invite People sheet keeps its pill color.
@bmc08gt bmc08gt self-assigned this Oct 30, 2026
@github-actions github-actions Bot added the type: feature New functionality label Oct 30, 2026
…eader and pill

The link card's ⋯ menu is gone: Copy Link and Show Group Card are on the
Invite People sheet that Share Link opens, and revoking is in Manage
Invites. The host sheet's view model keeps only Share Link.

The card now starts 16 below the header instead of touching its close
button, and the pill is one 30-high line, 14 inside the card, as in
Figma 1m. The row reads "Approve New Members", and its subtitles drop
the "Off:" and "On:" prefixes.
…mbers toggles

The pill's link, the caption under Share Link and the row's subtitle
now fade between the off and on text over 220ms, and the card's height
animates with them instead of jumping. The fades are plain tweens, so
the system animation scale applies to them.

The caption's top spacing moves into the caption, so a card with no
caption still ends at the button.
iOS is now the reference for this card. The pill's link is Medium 14,
and the caption under Share Link and both Approve New Members
subtitles are Medium 13 at white 0.68. Both styles use the true Medium
face (AvenirMedium); the theme's Avenir draws FontWeight.Medium as
Demi. The Manage Invites subtitle keeps its shared style, as on iOS.

The card fill (White08) and pill fill (0x0F, about 0.06) already
matched, so they are unchanged.
Sheets shown through BottomBarManager with the DEFAULT type drew on
bannerThemed (37,37,38), lighter than the navigation sheets, which draw
on the theme background (25,25,26). iOS made the same change to
PartialSheet's default.

Sheets this changes, among the DEFAULT showMessage and
bottomBarCardAction sheets:
- Currency More (TokenInfoViewModel.presentMore)
- Add Money start (InternalPurchaseMethodController.present)
- Group money actions (ChatViewModel.presentMoneyActions)

The host link card sheet and the E2EE learn-more sheet already drew
on the background. ERROR, DESTRUCTIVE, INFO, WARNING and SUCCESS keep
their banner colors.
@github-actions github-actions Bot added the area: ui Compose UI, theme, components, resources label Oct 30, 2026
Renames the tile's string (action_showGroupCard); the tile's icon has
no content description, so the label is also what TalkBack reads. Class,
file, resource and analytics names are unchanged.
The switch was already off when nothing is stored, but an IOException
reading the DataStore ended the flow instead of answering. Unreadable
preferences now read as empty, so the switch is off.
The 1m link card now uses iOS #1175's values: a 48dp capsule pill with the
link 16dp from its ends, 20dp inside the card and 12dp between its items.
The pill shows the whole link and cuts it in the middle, so the end of the
token stays visible. Share Link stays the standard button.

LinkPillFrame takes a shape and horizontal padding; their defaults keep the
other pills as they were. The 1m preview uses a real-length invite link so
its render shows the middle cut.
From iOS #1175's InvitePeopleSheet: the cards sit 12dp apart (8dp before),
the link card starts 20dp under the header (16dp before) and the sheet
ends 20dp under Manage Invites (16dp before). The header is still the
shared AppBarWithTitle, so the gap is measured from the bottom of the bar.
1e's Share Group Link turned the switch on, from the host sheet and from
the Invite People sheet. It now shares the plain /chat link once and leaves
the switch as it was. Only the host's tap on the switch turns it on
(spec #82, 02f6c77).

InviteLinkViewModel no longer writes the switch, so it drops its
ApproveNewMembersStore. InviteHostSheetViewModelTest covers 1e leaving the
switch off and the host's tap turning it on.
@bmc08gt
bmc08gt merged commit b38a6b9 into code/cash Oct 30, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ui Compose UI, theme, components, resources type: feature New functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant