Skip to content

Mixer packs in the app: buy a pack or the upgrade, behind PackAvailability (#705) - #772

Merged
Skeyelab merged 1 commit into
mainfrom
packs-app-705
Oct 16, 2026
Merged

Skeyelab merged 1 commit into
mainfrom
packs-app-705

Conversation

@Skeyelab

Copy link
Copy Markdown
Member

#705, slices 3 and 4 in the app. Stacked on #771 → #770. Auto-merge stays off until it's retargeted to main. Device-only: checked by builds and tests, not yet on a device.

Debug builds only (PackAvailability). TestFlight and App Store builds load no pack products and show no pack rows and no "Launch price" line, so Release looks as before. One exception, already the case in App Store Connect: Pro's price there is now $4.99.

What changes in a Debug build

  • ProStore:
    • loads the X Air and X32 packs and upgrade.pro;
    • buy(_ product:) buys any of them, with the same notes;
    • isFamilyShared comes from transaction.ownershipType == .familyShared;
    • armedFamily is set by the record screen model, so license() counts a pack on the Armed family as Pro at record press;
    • planLicense() is the plan without the family, for Settings;
    • Restore uses PackOffer.restoreNote ("Restored: X Air pack").
  • Settings › Pro (draft wording for Eric):
    • The plan line uses PackOffer.planTitle ("X Air pack").
    • The buy rows follow PackOffer.items:
      • "Buy X Air pack $2.99", then "Buy Pro $4.99";
      • or only "Upgrade to Pro $1.99" for someone who bought a pack;
      • or Buy Pro for someone with only a shared pack.
    • "Launch price" is a footnote under the rows.
  • Paywall:
    • the same items;
    • the headline is "Pro for your XR18" when a pack leads (the linked Mixer's model, else "X Air");
    • each button closes the sheet only when its own purchase came through (from review: a cancel no longer closes it).
  • ShowRecorder.storekit (local testing only): Pro 4.99, as in App Store Connect now. The X Air and X32 packs are 2.99 and the upgrade is 1.99, all with Family Sharing on. The descriptions are drafts.

Device test. The local StoreKit file only applies when launched through Xcode's Run. devicectl and TestFlight get the sandbox App Store, where these products don't exist.

  1. xcodegen generate, open ShowRecorder.xcodeproj, choose the ShowRecorder scheme in Debug on the iPhone, and press ⌘R.
  2. Debug › StoreKit › Manage Transactions: delete everything. That's Free, with no Trial.
  3. Arm the XR18. Settings › Pro shows "Buy X Air pack $2.99", Buy Pro $4.99, and "Launch price". The paywall headline is "Pro for your XR18".
  4. Buy the pack. The plan reads "X Air pack", a Take on the XR18 is Pro, and the offer is only "Upgrade to Pro $1.99", whatever is Armed.
  5. Buy the upgrade: the plan reads Pro.
  6. In Manage Transactions, refund the pack: the upgrade stops counting, and the plan returns to Free.
  7. Restore with only the pack owned says "Restored: X Air pack".

Family Sharing can't be simulated locally; it's covered by Kit tests.

Tests: the rules are in the Kit, test-first (#766, #768, #769, #770, #771). This PR is wiring and views, checked by building for macOS and the iOS Simulator.

Reviewed: a code-review agent found two things, both fixed:

  • "Launch price" showed in Release; it's now Debug-only. Whether Release should show it is a decision for Eric, and a one-line change.
  • A Buy Pro cancel closed the paywall when the Armed family's pack was owned.

Accepted for now (Debug only): during a Trial, with the pack's family Armed, the days-left chip hides on that input.

Checked: full ./scripts/verify.sh passes (package tests, the macOS build with AppTests, the iOS Simulator build).

@codecov

codecov Bot commented Oct 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

…ility (#705)

Debug builds only (PackAvailability). ProStore loads the X Air and X32 packs
and the upgrade, buys any product, reads Family Sharing from the transaction's
ownershipType, and passes the Armed input's family into license(), so a pack
counts as Pro at record press; planLicense() is the family-free plan for
Settings. Settings › Pro and the paywall offer the Armed family's pack first
("Pro for your XR18"), Pro, or only the upgrade, with "Launch price". Restore
says "Restored: X Air pack". The local StoreKit file has Pro 4.99, the packs
2.99 and the upgrade 1.99. Release builds look as before.

Claude-Session: https://claude.ai/code/session_01K4ihr1i6m1uuUswAENvJKJ
Assisted-by: Claude Code:claude-opus-5-5
@Skeyelab
Skeyelab changed the base branch from packs-license-705 to main October 16, 2026 05:50
@Skeyelab
Skeyelab enabled auto-merge (squash) October 16, 2026 05:50
@Skeyelab Skeyelab closed this Oct 16, 2026
auto-merge was automatically disabled October 16, 2026 05:52

Pull request was closed

@Skeyelab Skeyelab reopened this Oct 16, 2026
@Skeyelab
Skeyelab enabled auto-merge (squash) October 16, 2026 05:52
@Skeyelab
Skeyelab merged commit 7d00d15 into main Oct 16, 2026
14 of 19 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