From 1235031e364098688d809badf67dec0f17e82049 Mon Sep 17 00:00:00 2001 From: Dylan Jeffers Date: Thu, 7 May 2026 12:01:06 -0700 Subject: [PATCH] feat: tag queue new-feature-badge variation as Amplitude user property Dispatches an IDENTIFY action once when the queue_new_feature_badge feature flag has loaded, with the variation ('on'/'off') as a user property. Lets us slice Amplitude charts by variation for the A/B test. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/hooks/useQueueNewFeatureBadge.ts | 19 ++++++++++++++++++- packages/common/src/models/Analytics.ts | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/common/src/hooks/useQueueNewFeatureBadge.ts b/packages/common/src/hooks/useQueueNewFeatureBadge.ts index bc1c68b91af..0a4a1e76047 100644 --- a/packages/common/src/hooks/useQueueNewFeatureBadge.ts +++ b/packages/common/src/hooks/useQueueNewFeatureBadge.ts @@ -1,4 +1,6 @@ -import { useCallback, useEffect, useState } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' + +import { useDispatch } from 'react-redux' import { useAppContext } from '~/context/appContext' import { FeatureFlags } from '~/services/remote-config/feature-flags' @@ -6,6 +8,10 @@ import { FeatureFlags } from '~/services/remote-config/feature-flags' import { useFeatureFlag } from './useFeatureFlag' const QUEUE_NEW_BADGE_DISMISSED_KEY = '@queue-new-feature-badge-dismissed' +// Mirrors the IDENTIFY action type in common/store/analytics/actions. +// Dispatching this triggers the analytics saga to forward traits to Amplitude +// as user properties, so the A/B variation can be sliced in Amplitude charts. +const ANALYTICS_IDENTIFY = 'ANALYTICS/IDENTIFY' /** * Drives the "New" indicator on the play queue button. @@ -22,6 +28,17 @@ export const useQueueNewFeatureBadge = () => { FeatureFlags.QUEUE_NEW_FEATURE_BADGE ) const [hasDismissed, setHasDismissed] = useState(null) + const dispatch = useDispatch() + const hasIdentifiedRef = useRef(false) + + useEffect(() => { + if (!isLoaded || hasIdentifiedRef.current) return + hasIdentifiedRef.current = true + dispatch({ + type: ANALYTICS_IDENTIFY, + traits: { queue_new_feature_badge: isEnabled ? 'on' : 'off' } + }) + }, [isLoaded, isEnabled, dispatch]) useEffect(() => { let cancelled = false diff --git a/packages/common/src/models/Analytics.ts b/packages/common/src/models/Analytics.ts index 3cdf1506e70..358e09a0ad0 100644 --- a/packages/common/src/models/Analytics.ts +++ b/packages/common/src/models/Analytics.ts @@ -21,6 +21,7 @@ export type IdentifyTraits = { name?: string email?: string userId?: ID + queue_new_feature_badge?: 'on' | 'off' } export type AnalyticsEvent = {