Skip to content

feat(pro): club features only while Pro is released - #151

Merged
ShuhaoZQGG merged 2 commits into
devfrom
feat/gate-club-features-on-pro
Nov 14, 2026
Merged

ShuhaoZQGG merged 2 commits into
devfrom
feat/gate-club-features-on-pro

Conversation

@ShuhaoZQGG

Copy link
Copy Markdown
Contributor

Closes # (no issue; requested directly: "the club chip shows up regardless — it should be a Pro feature")

Why

Club features checked only whether the device's club had an active subscription (club.entitled), never the pro release flag. So a club device kept its club badge (on the timer and on video), club card set, club timings, archive strip / History / End meeting & share, report branding and renewal line while pro was off. That contradicts the rest of the pre-launch UI ("Pro is coming soon"), and a later kill switch on pro would have left clubs untouched. #127 made pro the source of truth for "is this person on Pro" but left the club surfaces on entitled.

What changes

  • One gate: clubFeaturesOn(club) in packages/shared/club.js = the club is active and the pro flag is known and on. Until the flags arrive it is false, so nothing appears and then vanishes at load.
  • Used everywhere a club feature shows:
    • clubKit (badge on preview, video and full-screen; report branding; logo)
    • clubCardSetAvailable, canPublishCards
    • clubPresetsAvailable, activeClubName, canPublishPresets
    • archive enqueue (no upload while off)
    • clubGraceReminder
    • lapsedClubName (nothing about a club's Pro ending while Pro is unreleased)
    • both apps' Report tab (archiving) and Cards copy
  • Re-renders: useClub (both apps) and both renewal banners re-render when the flags arrive. The club card sync re-checks on a flag change.
  • While off, a club device behaves as a lapsed one:
    • nothing is deleted, and the device stays in its club
    • the server keeps the club's data
    • everything returns once pro is on
  • Not changed: the web /account "Your club" section and the club code / leave controls (membership, not a Pro feature), and the server, which still keys on entitled.

Security

None. Client-side visibility only; the server is unchanged.

Production impact

pro is 0% in production except one targeted account. A device that joined a club while pro was on for it loses the club surfaces until pro is on for it again. When pro is turned on at launch, club devices get everything back with nothing to redo. If pro is ever turned off after launch, clubs lose the surfaces and stop archiving speeches until it is back on.

Testing

  • npm test: 119 files, 2313 tests pass. New: the gate in club.test.js (5); pro-off cases in CardImagesModal.test.jsx and the web ReportTab.test.jsx. Club suites now set pro on explicitly, and both banners' "flags unknown / pro off" cases now expect nothing.
  • npm run test:e2e: 52 pass (new e2e/zoom.club-pro-gate.spec.js: the badge, renewal line and Report strip are absent with pro off and present with it on, on the same seeded club device)
  • npm run test:specs: 12 specs valid
  • Oracle: n/a

Evidence (real Zoom client)

club-pro-gate on 32ebeb7, Zoom device A (Claude Test Club admin), Zoom 7.2.5. Run log: test-runs/2026-11-14-club-pro-gate/run.md (local).

  • GP-01 ✅ (pro off):
    • no badge on the preview or the pushed video frame
    • Cards: Classic and Modern only (own set in use)
    • Edit timing rules: no club switch, no "Share with my club"
    • Report: no strip, History, branded header or End meeting & share
    • no renewal line; locked Pro button in the footer
  • GP-02 ✅: FINISH added the row locally, and there was no /api/club/meetings upload.
  • GP-03 ✅ (pro on, app refreshed): badge, club card set, club presets switch + admin panel, "Saved to Claude Test Club" + History and the branded header all back, with nothing re-entered.
  • Other session's test unaffected: A never refreshed its club (no GET /api/club), so the PR fix(club): keep club devices in their club past a day between refreshes #145 session's CC-10 on A tonight still holds.
  • Dev: restored to 330a495 afterwards.

Not verified

  • club-renewal-reminder CR-04 (no reminder while pro is off, with the club inside the 60-day window): needs the test club's dev KV record edited again. e2e/zoom.club-pro-gate.spec.js covers it (10-day window, pro off → no banner). Spec marked stale.
  • club-card-sets: covers changed files and wasn't rerun here (GP-01/GP-03 cover its set's visibility). Marked stale; rerun before the next release.
  • Finding, not this change: device A's preview badge is smaller than in earlier runs today, and identical on the old build, so it comes from that device's badge state.

Look here first

  • packages/shared/club.js: clubFeaturesOn and proReleased.
  • packages/shared/clubCards.js: startClubCardSync now also listens to flags.
  • packages/shared/clubArchive.js: the enqueue gate (no archive while off).

Every club feature now reads one gate, clubFeaturesOn (packages/shared/club.js):
the club is active AND the pro flag is known and on. Until now they checked
only club.entitled, so a club device kept its badge, club card set, club
timings, archive strip / History / share, report branding and renewal line
while pro was off.

While pro is off a club device behaves as a lapsed one: nothing is deleted,
it stays in its club, and everything is back once pro is on. Speeches are not
sent to the club's archive meanwhile. useClub and the renewal banner re-render
when the flags arrive; the club card sync re-checks on a flag change too.
Both apps.
@ShuhaoZQGG ShuhaoZQGG added the needs:zoom-test Factory: waiting for the real-Zoom station label Nov 14, 2026
@ShuhaoZQGG
ShuhaoZQGG marked this pull request as ready for review November 14, 2026 21:33
@ShuhaoZQGG
ShuhaoZQGG merged commit 79d2da9 into dev Nov 14, 2026
2 checks passed
ShuhaoZQGG added a commit that referenced this pull request Nov 14, 2026
Resolves the spec-index conflict with dev (#147, #151): every row from both
sides, pro-launch kept after timer-sounds and in the run order. Footer.jsx
merged cleanly: with pro on, the Upgrade / Pro button with the launch dot;
with pro off, dev's locked 'Pro (coming soon)' button. pro-launch is marked
stale (the Sounds line and this merge came after its last run) and points to
pro-coming-soon for the pro-off footer.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs:zoom-test Factory: waiting for the real-Zoom station

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant