Skip to content

Subscriptions: unbuilt controls and the swipe colour rule #1276

Open

Description

@jvsena42

Problem or use case

The Subscriptions design pass in #1269 brought the screens in line with Bitkit - Handoff v62, but deliberately left four things out because each needs a product or design decision rather than a rendering fix. Three are controls the handoff draws that neither platform has built; the fourth is a colour rule the design system implies but the frames do not commit to.

None of these are regressions — all are absent on iOS as well as Android, so they are unbuilt design, not drift. Recording them here so they are not silently lost now that the surrounding screens look finished.

Proposed solution

1. Edit on the created-subscription detail
The handoff footer is Edit + Delete (Subscription Detail Created); the app shows Delete only. Needs a decision on what is editable after a subscription exists — amount and frequency change what the payer already accepted, so this may mean re-proposing rather than editing in place.

2. Renew on the expired detail
The handoff footer is More Info + Renew (Subscription Detail Expired); the app shows More Info only. A renew entry point implies a re-subscribe flow: whether it re-proposes to the same counterparty, and what happens when their endpoints or terms have changed since.

3. Automatically pay this subscription toggle
Both Subscribe to Subscription and Renew Subscription carry a purple toggle above the swipe. The app has no toggle: SubscriptionsScreen.kt derives payOnAcceptance from subscription.paymentDueOnAcceptance(now) != null, so it is computed and never user-settable. Building it means persisting an auto-pay preference per subscription and deciding what happens on a failed automatic payment.

4. Swipe knob colour: fixed brand, or derived from the balance being spent?
Open design question, currently shipped as fixed brand orange.

Every other confirm swipe in the app follows the balance it spends — SendConfirmScreen does ONCHAIN -> Brand, LIGHTNING -> Purple, SavingsConfirmScreen is Brand, SpendingConfirmScreen and ExternalConfirmScreen are Purple, Boost is Yellow, and hardware is Blue (see #1259). The subscription success confetti already follows the rail too, via subscriptionConfettiResource.

Subscriptions are the exception: the swipe is hardcoded. The design system supports the distinction — the component is a variant set named Swipe to Pay with Savings and Spending variants — but all three subscription frames instantiate the Savings variant, knob #FF4400. It is unclear whether that is deliberate or just the default variant being dropped in.

The visible consequence today: accepting a lightning-paid subscription shows an orange accept swipe and then immediately opens the send flow with a purple pay swipe.

A rail-derived implementation was written and reverted in #1269 pending this decision. To reinstate, cherry-pick 4f64643ae and bfdda4d9f; they add acceptsLightningPayment and isPaidFromSpending(maxSendLightningSats), requiring both that the payee accepts lightning and that the sender can actually cover the amount from spending, plus unit coverage.

Alternatives considered

Shipping 1–3 as rendering-only stubs was rejected: each control implies a flow that does not exist, so a button that does nothing would be worse than its absence. For 4, leaving the subscription swipe hardcoded is defensible as long as it matches the frames, which is why #1269 ships it that way.

Additional context

Activity

  1. jvsena42 commented on Oct 8, 2026

    @jvsena42
    MemberAuthor

    Update on item 3, the Automatically pay this subscription toggle, after #1422.

    • fix: pay first onchain subscription period in one swipe #1422 makes the first payment a single swipe for on-chain as well as Lightning, and removes the First billing period ends … line, so the Review & Subscribe sheet now matches the Subscribe to Subscription frame except for this toggle. It is the one visible difference left on that sheet.
    • Whether a first payment is made is still derived from paymentDueOnAcceptance, not chosen by the user. Nothing stores a per-subscription auto-pay preference, and later periods are still paid by hand from the Subscription Payment Due notification.
    • A working toggle needs a payment path that runs without the Send sheet open. Today the first payment goes through the Send sheet state, its PIN/biometric check, the send warnings and the First Payment Failed screen. Sending the first payment in the background, so the swipe only waits for the Paykit request, is the same work and is listed as a follow-up in fix: pay first onchain subscription period in one swipe #1422.
    • feat: add allowances for automatic paykit payments #1352 (allowances) builds automatic Paykit payments with limits, Lightning only. The toggle should be decided together with it: either it is a shortcut that creates an allowance for this subscription, or a separate setting.

    Twin: synonymdev/bitkit-ios#755

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions