fix(pro): rebuild /pro bundle so PR #3115 ungate actually ships#3148
Conversation
PR #3115 removed the isProUser() localStorage gate from pro-test/src/App.tsx that hid PricingSection + PricingTable behind `wm-widget-key` / `wm-pro-key`, but the compiled bundle under public/pro/assets/ (the static bundle served at worldmonitor.app/pro) was never rebuilt. Visitors without legacy API keys in localStorage therefore still see no prices and no path into the normal Clerk sign-in that the PricingSection CTAs trigger. Rebuilding the bundle drops the gate check (grep count goes from 1 to 0) and rewires the index.html asset hashes.
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Greptile SummaryThis PR rebuilds the committed Confidence Score: 5/5Safe to merge — the gate strings are verifiably absent from the new bundle and all asset references are consistent. Grep confirms 0 occurrences of No files require special attention. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["Visitor loads /pro"] --> B["index.html serves index-9CL2yigL.js"]
B --> C{"Old gate check\nwm-widget-key / wm-pro-key"}
C -->|"Removed in PR #3115\nConfirmed absent in new bundle"| D["PricingSection rendered unconditionally"]
C -->|"Was present in\nindex-c_645qQx.js"| E["❌ Old: PricingSection hidden\nfor non-internal users"]
D --> F["PricingTable rendered unconditionally"]
D --> G["Clerk sign-in path accessible"]
Reviews (1): Last reviewed commit: "fix(pro): rebuild /pro bundle so ungated..." | Re-trigger Greptile |
Pro is live. The landing page and the dashboard's header banner still treated it as a coming-soon waitlist — hero was an email capture form behind Turnstile, nav CTA said "Reserve Your Early Access", and the dashboard banner said "Pro is coming / Reserve your spot". All of that funneled traffic into a waitlist instead of the now-working pricing + checkout + Clerk sign-in flow. Dashboard (/) — src/components/ProBanner.ts: - "Pro is coming" → "Pro is launched" - "Reserve your spot →" (href /pro) → "Upgrade to Pro →" (href /pro#pricing) - Re-enable dismiss button (commented out during launch-promotion period) Landing page (/pro) — pro-test/src/App.tsx + main.tsx + index.html: - Navbar: single "Reserve Your Early Access" → two CTAs: "Sign In" (opens Clerk) + "Upgrade to Pro" (anchors #pricing) - Hero: drop the email + Turnstile + Mailcheck waitlist form, the "Launching March 2026" line, and the referral-invite banner. Replace with "Choose Your Plan" (→ #pricing) + "Sign In" buttons. - Two-path split Pro card: "Reserve Your Early Access" → "Choose Your Plan" (already anchors #pricing) - Footer: drop the second waitlist form + finalCta block + #waitlist anchor. Keep the nav/legal strip only. - Rip dead code: submitWaitlist, showReferralSuccess, Mailcheck import and React hook state. Keep Turnstile infrastructure because the enterprise contact form (#enterprise-contact) still uses it. - JSON-LD Offer: "Pro (Waitlist)" @ $0 → "Pro" @ $39.99. Rebuild the /pro bundle (same committed-artifact dance as PR #3148): grep for the old gate + waitlist strings in the new bundle returns 0. i18n: added nav.signIn, nav.upgradeToPro, hero.choosePlan, hero.signIn, twoPath.choosePlan. Stale waitlist keys left in place — other locales fall back to English until the full sweep.
* feat(pro): cut over /pro from waitlist mode to Pro-launched messaging Pro is live. The landing page and the dashboard's header banner still treated it as a coming-soon waitlist — hero was an email capture form behind Turnstile, nav CTA said "Reserve Your Early Access", and the dashboard banner said "Pro is coming / Reserve your spot". All of that funneled traffic into a waitlist instead of the now-working pricing + checkout + Clerk sign-in flow. Dashboard (/) — src/components/ProBanner.ts: - "Pro is coming" → "Pro is launched" - "Reserve your spot →" (href /pro) → "Upgrade to Pro →" (href /pro#pricing) - Re-enable dismiss button (commented out during launch-promotion period) Landing page (/pro) — pro-test/src/App.tsx + main.tsx + index.html: - Navbar: single "Reserve Your Early Access" → two CTAs: "Sign In" (opens Clerk) + "Upgrade to Pro" (anchors #pricing) - Hero: drop the email + Turnstile + Mailcheck waitlist form, the "Launching March 2026" line, and the referral-invite banner. Replace with "Choose Your Plan" (→ #pricing) + "Sign In" buttons. - Two-path split Pro card: "Reserve Your Early Access" → "Choose Your Plan" (already anchors #pricing) - Footer: drop the second waitlist form + finalCta block + #waitlist anchor. Keep the nav/legal strip only. - Rip dead code: submitWaitlist, showReferralSuccess, Mailcheck import and React hook state. Keep Turnstile infrastructure because the enterprise contact form (#enterprise-contact) still uses it. - JSON-LD Offer: "Pro (Waitlist)" @ $0 → "Pro" @ $39.99. Rebuild the /pro bundle (same committed-artifact dance as PR #3148): grep for the old gate + waitlist strings in the new bundle returns 0. i18n: added nav.signIn, nav.upgradeToPro, hero.choosePlan, hero.signIn, twoPath.choosePlan. Stale waitlist keys left in place — other locales fall back to English until the full sweep. * i18n(pro): translate 5 new Pro-launched keys across all 20 locales Resolves the followup from the previous cutover commit: no more silent English fallback for signIn / upgradeToPro / choosePlan strings in non-English /pro pages. Touched keys per locale: nav.signIn, nav.upgradeToPro (both added — nav block existed) hero.signIn, hero.choosePlan (both added — hero block existed) twoPath.choosePlan (added — most locales had no twoPath block at all, so it's created with just this one key; remaining twoPath strings still fall back to English, which is the pre-existing state) Covers: ar, bg, cs, de, el, es, fr, it, ja, ko, nl, pl, pt, ro, ru, sv, th, tr, vi, zh. Rebuilt the /pro bundle so the per-locale lazy chunks under public/pro/assets/{lang}-*.js ship the new strings. Verified via grep for translated strings (e.g. "升级到 Pro", "Passer à Pro", "الترقية إلى") in the rebuilt locale chunks. * fix(pro-banner): version the dismiss key so launch banner isn't pre-suppressed Reviewer on #3149 flagged that re-enabling dismissal with the same wm-pro-banner-dismissed key carries forward any dismissal from the pre-launch "Pro is coming / Reserve your spot" banner. Anyone whose localStorage still holds that key (e.g. dismissed during the brief March 9 to March 11 window before #1422 disabled dismissal) would silently suppress the new "Pro is launched / Upgrade to Pro" banner and never see the launch CTA. Rename DISMISS_KEY to wm-pro-banner-launched-dismissed (semantically scoped to the launched-state variant) and clear the legacy key on every isDismissed() call so stale entries don't accumulate. Dark / light rendering and the 7-day TTL behavior are unchanged. * fix(pro): remove stale 96px footer padding + redundant inner border Greptile on #3149 flagged that dropping the finalCta block left the footer with pt-24 (96px) top padding above the legal strip, rendering a large blank band. Pare the outer padding down to pt-8 and drop the inner pt-8 + border-wm-border/50 divider (which only existed to separate the legal strip from the removed finalCta content above). Rebuilt /pro bundle accordingly.
The problem
Visitors to https://worldmonitor.app/pro still don't see the pricing tiers or the normal Clerk sign-in path — prices and `PricingSection` are hidden unless the visitor has `wm-widget-key` or `wm-pro-key` in localStorage.
Root cause
PR #3115 removed the `isProUser()` gate from `pro-test/src/App.tsx`:
```diff
-{(localStorage.getItem('wm-widget-key') || localStorage.getItem('wm-pro-key')) && (
-)}
+
+
```
…but the compiled bundle committed under `public/pro/assets/` is what Vercel serves at `/pro`, and it was never rebuilt. Grep for `wm-widget-key` in the old bundle:
```
public/pro/assets/index-c_645qQx.js:1:...||localStorage.getItem("wm-pro-key"))&&g.jsxs(...)
```
So the gate is alive in production even though the source is fixed.
Fix
Ran `npm run build` in `pro-test/` (vite build + prerender). New bundle hashes:
Verified the gate is gone:
```
$ grep -c 'wm-widget-key\|wm-pro-key' public/pro/assets/index-*.js
0
```
Test plan
Follow-up (out of scope)
The `public/pro/` bundle being a committed artifact is the root fragility here — we should either move it to a CI-built step or delete the committed bundle and serve from a build step so this class of stale-bundle regression can't recur. Tracked as a followup.