From 4fa92d7a49e8a1e6118053de4d5d4174b894b528 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 21 May 2024 00:17:57 +0100 Subject: [PATCH] [Statsig] Fix exposure logging for reduced onboarding (#4131) * Add dangerouslyDisableExposureLogging option * Rename onboarding gate to v2 * Disable exposure logging for onboarding in PostFeed query --- src/lib/statsig/gates.ts | 2 +- src/lib/statsig/statsig.tsx | 19 ++++++++++++++----- src/screens/Onboarding/StepFinished.tsx | 4 ++-- .../Onboarding/StepInterests/index.tsx | 2 +- src/screens/Onboarding/StepProfile/index.tsx | 2 +- src/screens/Onboarding/index.tsx | 2 +- src/state/queries/post-feed.ts | 8 +++++++- src/view/com/testing/TestCtrls.e2e.tsx | 4 ++-- 8 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index 315706ad..42f86c81 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -4,7 +4,7 @@ export type Gate = | 'disable_min_shell_on_foregrounding_v3' | 'disable_poll_on_discover_v2' | 'dms' - | 'reduced_onboarding_and_home_algo' + | 'reduced_onboarding_and_home_algo_v2' | 'request_notifications_permission_after_onboarding' | 'show_follow_back_label_v2' | 'start_session_with_following_v2' diff --git a/src/lib/statsig/statsig.tsx b/src/lib/statsig/statsig.tsx index 3b649f88..00502782 100644 --- a/src/lib/statsig/statsig.tsx +++ b/src/lib/statsig/statsig.tsx @@ -108,20 +108,29 @@ export function logEvent( // Our own cache ensures consistent evaluation within a single session. const GateCache = React.createContext | null>(null) -export function useGate(): (gateName: Gate) => boolean { +type GateOptions = { + dangerouslyDisableExposureLogging?: boolean +} + +export function useGate(): (gateName: Gate, options?: GateOptions) => boolean { const cache = React.useContext(GateCache) if (!cache) { throw Error('useGate() cannot be called outside StatsigProvider.') } const gate = React.useCallback( - (gateName: Gate): boolean => { + (gateName: Gate, options: GateOptions = {}): boolean => { const cachedValue = cache.get(gateName) if (cachedValue !== undefined) { return cachedValue } - const value = Statsig.initializeCalled() - ? Statsig.checkGate(gateName) - : false + let value = false + if (Statsig.initializeCalled()) { + if (options.dangerouslyDisableExposureLogging) { + value = Statsig.checkGateWithExposureLoggingDisabled(gateName) + } else { + value = Statsig.checkGate(gateName) + } + } cache.set(gateName, value) return value }, diff --git a/src/screens/Onboarding/StepFinished.tsx b/src/screens/Onboarding/StepFinished.tsx index 3db0cbd2..855e12ed 100644 --- a/src/screens/Onboarding/StepFinished.tsx +++ b/src/screens/Onboarding/StepFinished.tsx @@ -83,7 +83,7 @@ export function StepFinished() { * selected in onboarding and therefore we don't need to run this * code (which would overwrite the other feeds already set). */ - if (!gate('reduced_onboarding_and_home_algo')) { + if (!gate('reduced_onboarding_and_home_algo_v2')) { const otherFeeds = selectedFeeds.length ? selectedFeeds.map(f => ({ type: 'feed', @@ -120,7 +120,7 @@ export function StepFinished() { })(), (async () => { - if (!gate('reduced_onboarding_and_home_algo')) return + if (!gate('reduced_onboarding_and_home_algo_v2')) return const {imageUri, imageMime} = profileStepResults if (imageUri && imageMime) { diff --git a/src/screens/Onboarding/StepInterests/index.tsx b/src/screens/Onboarding/StepInterests/index.tsx index 2711f677..d95445d7 100644 --- a/src/screens/Onboarding/StepInterests/index.tsx +++ b/src/screens/Onboarding/StepInterests/index.tsx @@ -134,7 +134,7 @@ export function StepInterests() { }, [track]) React.useEffect(() => { - if (!gate('reduced_onboarding_and_home_algo')) { + if (!gate('reduced_onboarding_and_home_algo_v2')) { requestNotificationsPermission('StartOnboarding') } }, [gate, requestNotificationsPermission]) diff --git a/src/screens/Onboarding/StepProfile/index.tsx b/src/screens/Onboarding/StepProfile/index.tsx index 93d8a402..fc19d5bb 100644 --- a/src/screens/Onboarding/StepProfile/index.tsx +++ b/src/screens/Onboarding/StepProfile/index.tsx @@ -94,7 +94,7 @@ export function StepProfile() { React.useEffect(() => { // We have an experiment running for redueced onboarding, where this screen shows up as the first in onboarding. // We only want to request permissions when that gate is actually active to prevent pollution - if (gate('reduced_onboarding_and_home_algo')) { + if (gate('reduced_onboarding_and_home_algo_v2')) { requestNotificationsPermission('StartOnboarding') } }, [gate, requestNotificationsPermission]) diff --git a/src/screens/Onboarding/index.tsx b/src/screens/Onboarding/index.tsx index 5af7a12d..20271a46 100644 --- a/src/screens/Onboarding/index.tsx +++ b/src/screens/Onboarding/index.tsx @@ -24,7 +24,7 @@ import {Portal} from '#/components/Portal' export function Onboarding() { const {_} = useLingui() const gate = useGate() - const isReducedOnboardingEnabled = gate('reduced_onboarding_and_home_algo') + const isReducedOnboardingEnabled = gate('reduced_onboarding_and_home_algo_v2') const [state, dispatch] = React.useReducer( isReducedOnboardingEnabled ? reducerReduced : reducer, isReducedOnboardingEnabled ? {...initialStateReduced} : {...initialState}, diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts index b9e0628f..b763f28a 100644 --- a/src/state/queries/post-feed.ts +++ b/src/state/queries/post-feed.ts @@ -152,7 +152,13 @@ export function usePostFeedQuery( feedTuners, userInterests, // Not in the query key because they don't change. getAgent, - useBaseFollowingFeed: gate('reduced_onboarding_and_home_algo'), + useBaseFollowingFeed: gate( + 'reduced_onboarding_and_home_algo_v2', + { + // If you're not already in this experiment, we don't want to expose you to it now. + dangerouslyDisableExposureLogging: true, + }, + ), }), cursor: undefined, } diff --git a/src/view/com/testing/TestCtrls.e2e.tsx b/src/view/com/testing/TestCtrls.e2e.tsx index fbad86f6..c01856c5 100644 --- a/src/view/com/testing/TestCtrls.e2e.tsx +++ b/src/view/com/testing/TestCtrls.e2e.tsx @@ -112,7 +112,7 @@ export function TestCtrls() { testID="e2eStartOnboarding" onPress={() => { // TODO remove when experiment is over - setGate('reduced_onboarding_and_home_algo', true) + setGate('reduced_onboarding_and_home_algo_v2', true) onboardingDispatch({type: 'start'}) }} accessibilityRole="button" @@ -123,7 +123,7 @@ export function TestCtrls() { testID="e2eStartLongboarding" onPress={() => { // TODO remove when experiment is over - setGate('reduced_onboarding_and_home_algo', false) + setGate('reduced_onboarding_and_home_algo_v2', false) onboardingDispatch({type: 'start'}) }} accessibilityRole="button"