Skip to content

feat(payment-requests): share payment, marked-paid and closed rows in the chat - #1247

Merged
bmc08gt merged 4 commits into
mainfrom
feat/request-share-payment-rows
Nov 10, 2026
Merged

bmc08gt merged 4 commits into
mainfrom
feat/request-share-payment-rows

Conversation

@bmc08gt

@bmc08gt bmc08gt commented Nov 10, 2026 •

Copy link
Copy Markdown
Collaborator

A cash message that pays a request share now draws as a centred row with the request's ring ("You paid Alex $40 · Tahoe cabin"). It used to draw as an ordinary cash bubble. A share the creator marks paid and a closed request get a row too.

Rows

  • Consecutive payments for one request collapse into one row with a count and a total: "7 people paid $140 · Tahoe cabin". A message between them, or a date header, ends the run.
  • A marked-paid row and a closed row have no message behind them. Both are built from the stored request and placed in the transcript by paid_at or closed_at.
  • The ring shows progress as of that row: the creator's share plus every share paid at or before this one's paid_at, by amount. A later payment leaves earlier rings alone.
  • Tapping a row opens Request details. A payment whose request isn't stored draws without a title or ring and doesn't tap through.
  • A share payment row sits between two 1pt rules in textSuccess at 60% opacity. The half beside the caption is solid and the outer half fades to clear (design node 13591:871, option B).
  • Names are semibold. "You" is semibold only on a single share payment's row, and regular on collapsed, marked-paid and closed rows.

Fit

A row too wide for its line shortens the title to 8 characters, then each name to 6, and only then moves the title and ring to a second line. The amount is never cut. ChatRequestEvent.fit(maxWidth:width:) is a pure function over a measuring closure, so the rule is tested without a view.

Chat list and unread

The chat list previews a share payment for every member, with "for" in place of the dot: "Jordan paid Alex $40 for Tahoe cabin". It counts as unread only for the member it paid. unread_seq is one stamp per message for all members, so for everyone else the unread dot looks past a trailing share payment and the count subtracts the ones not addressed to them. The unread divider skips them the same way.

Storage

paymentRequestId is now a column on the stored message, so a share payment is still a row after a relaunch. Database.schemaVersion goes from 66 to 67 and the store is rebuilt from the server.

Strings are inline English, as elsewhere in the chat. The Android side is the matching branch feat/request-share-payment-rows in code-android-app.

Spec: code-payments/flipcash-client-orchestrator#128, docs/specs/group-requests.md cases 63 to 82.

… the chat

A cash message that pays a share now draws as a centred row with the request's ring
("You paid Alex $40 · Tahoe cabin") instead of an ordinary cash bubble. Consecutive
payments on one request collapse into one row with a count and a total. A share marked
paid by hand and a closed request get a row too. Neither has a message behind it, so
both are built from the stored request and merged into the transcript by time.

- The ring shows progress as of that payment: the creator's share plus every share paid
  at or before the payer's `paid_at`, by amount.
- A row that doesn't fit shortens the title to 8 characters, then names to 6, then wraps
  to two lines.
- `paymentRequestId` is a column on the stored message, so a share payment is still a
  row after a relaunch. Schema version goes 66 to 67; the store is rebuilt from the server.
- A share payment is the chat-list preview for everyone, but counts as unread only for
  its receiver. `unread_seq` is one stamp per message for all members, so other members
  look past it for the unread dot and subtract it from the count.

Spec: code-payments/flipcash-client-orchestrator#128
… payment with no receiver

A share payment row that wraps to two lines now keeps its fading rules beside
line 1, as Android draws it, instead of centred between the lines.

A share payment whose message names no receiver, for a request that isn't
stored, read "Jordan paid Someone $40" in the row and the chat list preview.
Both now read "Jordan paid $40", the copy Android uses.
…share payment's row

A collapsed share payment row, a marked-paid row and a closed row drew "You"
and "you" semibold. Android draws them regular and keeps the semibold only
on a single share payment's row, where the word stands beside a name. iOS
now does the same.
@bmc08gt bmc08gt self-assigned this Nov 10, 2026
…e caption and at 60% opacity

Each rule is 1pt in textSuccess at 60% opacity. The half beside the caption
is solid and the outer half fades to clear at the outer end. The rules used
to fade across their full length at 28% opacity. Design node 13591:871,
option B.
@bmc08gt
bmc08gt merged commit 987a8ce into main Nov 10, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant