From 827330cedcb808d573e3fc7259d40a038f719349 Mon Sep 17 00:00:00 2001 From: Mike Murray Date: Thu, 30 Oct 2025 16:28:33 -0700 Subject: [PATCH 1/2] Add Sprig survey tracking for feature flags page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added tracking event `viewed_featureflags_docs` that fires when users visit the `/docs/featureflags` page. This follows the same pattern as the existing experiments page tracking (`viewed_experimentation_docs`). - Uses shared debouncing logic to prevent duplicate events - Tracks both initial page loads and route changes - Includes proper error handling and null checks 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- hooks/useSprig.ts | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/hooks/useSprig.ts b/hooks/useSprig.ts index 1f1a69101a..6907720a77 100644 --- a/hooks/useSprig.ts +++ b/hooks/useSprig.ts @@ -96,4 +96,43 @@ export const useSprig = () => { router.events.on('routeChangeComplete', handleRouteChange); return () => router.events.off('routeChangeComplete', handleRouteChange); }, [router, sprigEnvironmentId]); + + // Track feature flags page visits + useEffect(() => { + if (!sprigEnvironmentId || typeof window === 'undefined') return; + + const trackFeatureFlagView = () => { + const now = Date.now(); + + // Prevent duplicate events within debounce period + if (now - lastEventTime < EVENT_DEBOUNCE_MS) { + return; + } + + if (!window.Sprig) { + return; + } + + try { + lastEventTime = now; + window.Sprig('track', 'viewed_featureflags_docs'); + } catch (error) { + console.error('Sprig track failed:', error); + } + }; + + const handleRouteChange = (url: string) => { + if (url.includes('/docs/featureflags')) { + trackFeatureFlagView(); + } + }; + + // Track if already on feature flags page + if (router.asPath.includes('/docs/featureflags')) { + trackFeatureFlagView(); + } + + router.events.on('routeChangeComplete', handleRouteChange); + return () => router.events.off('routeChangeComplete', handleRouteChange); + }, [router, sprigEnvironmentId]); }; \ No newline at end of file From 5d1d0b354308cb29373575fa616d3a2c038b6079 Mon Sep 17 00:00:00 2001 From: Mike Murray Date: Thu, 6 Nov 2025 15:04:16 -0800 Subject: [PATCH 2/2] Merge duplicate useEffect hooks for page tracking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consolidated the experimentation and feature flags tracking into a single useEffect hook to eliminate code duplication. Both tracking events now share the same debouncing logic and route change handler. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- hooks/useSprig.ts | 55 +++++++++-------------------------------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/hooks/useSprig.ts b/hooks/useSprig.ts index 6907720a77..80d81063b5 100644 --- a/hooks/useSprig.ts +++ b/hooks/useSprig.ts @@ -58,11 +58,11 @@ export const useSprig = () => { } }, [sprigEnvironmentId]); - // Track experimentation page visits + // Track page visits for specific documentation pages useEffect(() => { if (!sprigEnvironmentId || typeof window === 'undefined') return; - const trackExperimentView = () => { + const trackPageView = (eventName: string) => { const now = Date.now(); // Prevent duplicate events within debounce period @@ -76,7 +76,7 @@ export const useSprig = () => { try { lastEventTime = now; - window.Sprig('track', 'viewed_experimentation_docs'); + window.Sprig('track', eventName); } catch (error) { console.error('Sprig track failed:', error); } @@ -84,52 +84,17 @@ export const useSprig = () => { const handleRouteChange = (url: string) => { if (url.includes('/docs/experiments')) { - trackExperimentView(); + trackPageView('viewed_experimentation_docs'); + } else if (url.includes('/docs/featureflags')) { + trackPageView('viewed_featureflags_docs'); } }; - // Track if already on experimentation page + // Track if already on a tracked page if (router.asPath.includes('/docs/experiments')) { - trackExperimentView(); - } - - router.events.on('routeChangeComplete', handleRouteChange); - return () => router.events.off('routeChangeComplete', handleRouteChange); - }, [router, sprigEnvironmentId]); - - // Track feature flags page visits - useEffect(() => { - if (!sprigEnvironmentId || typeof window === 'undefined') return; - - const trackFeatureFlagView = () => { - const now = Date.now(); - - // Prevent duplicate events within debounce period - if (now - lastEventTime < EVENT_DEBOUNCE_MS) { - return; - } - - if (!window.Sprig) { - return; - } - - try { - lastEventTime = now; - window.Sprig('track', 'viewed_featureflags_docs'); - } catch (error) { - console.error('Sprig track failed:', error); - } - }; - - const handleRouteChange = (url: string) => { - if (url.includes('/docs/featureflags')) { - trackFeatureFlagView(); - } - }; - - // Track if already on feature flags page - if (router.asPath.includes('/docs/featureflags')) { - trackFeatureFlagView(); + trackPageView('viewed_experimentation_docs'); + } else if (router.asPath.includes('/docs/featureflags')) { + trackPageView('viewed_featureflags_docs'); } router.events.on('routeChangeComplete', handleRouteChange);