Repository navigation
feat(pro): club features only while Pro is released - #151
Merged
Merged
Conversation
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
marked this pull request as ready for review
November 14, 2026 21:33
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 theprorelease 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 whileprowas off. That contradicts the rest of the pre-launch UI ("Pro is coming soon"), and a later kill switch onprowould have left clubs untouched. #127 madeprothe source of truth for "is this person on Pro" but left the club surfaces onentitled.What changes
clubFeaturesOn(club)inpackages/shared/club.js= the club is active and theproflag is known and on. Until the flags arrive it is false, so nothing appears and then vanishes at load.clubKit(badge on preview, video and full-screen; report branding; logo)clubCardSetAvailable,canPublishCardsclubPresetsAvailable,activeClubName,canPublishPresetsclubGraceReminderlapsedClubName(nothing about a club's Pro ending while Pro is unreleased)archiving) and Cards copyuseClub(both apps) and both renewal banners re-render when the flags arrive. The club card sync re-checks on a flag change.prois on/account"Your club" section and the club code / leave controls (membership, not a Pro feature), and the server, which still keys onentitled.Security
None. Client-side visibility only; the server is unchanged.
Production impact
prois 0% in production except one targeted account. A device that joined a club whileprowas on for it loses the club surfaces untilprois on for it again. Whenprois turned on at launch, club devices get everything back with nothing to redo. Ifprois 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 inclub.test.js(5); pro-off cases inCardImagesModal.test.jsxand the webReportTab.test.jsx. Club suites now setproon explicitly, and both banners' "flags unknown / pro off" cases now expect nothing.npm run test:e2e: 52 pass (newe2e/zoom.club-pro-gate.spec.js: the badge, renewal line and Report strip are absent withprooff and present with it on, on the same seeded club device)npm run test:specs: 12 specs validEvidence (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).prooff):/api/club/meetingsupload.proon, 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.Not verified
prois 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.jscovers it (10-day window,prooff → no banner). Spec markedstale.stale; rerun before the next release.Look here first
packages/shared/club.js:clubFeaturesOnandproReleased.packages/shared/clubCards.js:startClubCardSyncnow also listens to flags.packages/shared/clubArchive.js: the enqueue gate (no archive while off).