From c8e24868dadf56dc738f78c5bef414a565091572 Mon Sep 17 00:00:00 2001 From: Eric Feng Date: Tue, 27 Oct 2026 19:48:18 -0700 Subject: [PATCH] fix: restore pricing calculator state from shared URLs --- snippets/calculator.jsx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/snippets/calculator.jsx b/snippets/calculator.jsx index 467fbb52..db3b6906 100644 --- a/snippets/calculator.jsx +++ b/snippets/calculator.jsx @@ -14,6 +14,32 @@ export const PricingCalculator = () => { const prevPriceRef = useRef(null); const hasInteracted = useRef(false); + useEffect(() => { + // Read after hydration so the server and first client render agree. + if (hasInteracted.current) return; + const params = new URLSearchParams(window.location.search); + const readCount = (key, fallback) => { + const value = params.get(key); + if (value === null || !/^\d+$/.test(value)) return fallback; + const count = Number(value); + return Number.isSafeInteger(count) ? count : fallback; + }; + const requestedPlan = params.get('plan'); + const requestedBrowserType = params.get('browserType'); + const restoredBrowserType = ['headless', 'headful', 'gpu'].includes(requestedBrowserType) + ? requestedBrowserType : defaults.browserType; + let restoredPlan = ['free', 'hobbyist', 'startup', 'enterprise'].includes(requestedPlan) + ? requestedPlan : defaults.plan; + if (restoredBrowserType === 'gpu' && restoredPlan !== 'startup' && restoredPlan !== 'enterprise') { + restoredPlan = 'startup'; + } + setPlan(restoredPlan); + setBrowserType(restoredBrowserType); + setAvgSessionLength(readCount('duration', defaults.avgSessionLength)); + setNumSessions(readCount('sessions', defaults.numSessions)); + // Restoration isn't an interaction: leave the incoming URL untouched. + }, []); + useEffect(() => { if (!hasInteracted.current) return; var url = new URL(window.location);