From 568a8e4d62d21d4d99179745128a0f7b0c0a715f Mon Sep 17 00:00:00 2001 From: Marius Andra Date: Thu, 3 Dec 2020 11:03:33 +0100 Subject: [PATCH 1/2] featureFlagLogic spy --- frontend/src/lib/logic/featureFlagLogic.ts | 41 ++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/logic/featureFlagLogic.ts b/frontend/src/lib/logic/featureFlagLogic.ts index 87c471e05b9b..d093f4b9cf94 100644 --- a/frontend/src/lib/logic/featureFlagLogic.ts +++ b/frontend/src/lib/logic/featureFlagLogic.ts @@ -10,6 +10,43 @@ import posthog from 'posthog-js' type FeatureFlagsSet = { [flag: string]: boolean } +const eventsNotified: Record = {} +function notifyFlagIfNeeded(flag: string, flagState: boolean): void { + if (!eventsNotified[flag]) { + posthog.capture('$feature_flag_called', { + $feature_flag: flag, + $feature_flag_response: flagState, + }) + eventsNotified[flag] = true + } +} + +function spyOnFeatureFlags(featureFlags: FeatureFlagsSet): FeatureFlagsSet { + if (typeof window.Proxy !== 'undefined') { + return new Proxy( + {}, + { + get(_, flag) { + const flagString = flag.toString() + notifyFlagIfNeeded(flagString, !!featureFlags[flagString]) + return featureFlags[flagString] + }, + } + ) + } else { + const flags: FeatureFlagsSet = {} + for (const flag of Object.keys(featureFlags)) { + Object.defineProperty(flags, flag, { + get: function () { + notifyFlagIfNeeded(flag, true) + return true + }, + }) + } + return flags + } +} + export const featureFlagLogic = kea>({ actions: { setFeatureFlags: (featureFlags: string[]) => ({ featureFlags }), @@ -19,12 +56,12 @@ export const featureFlagLogic = kea { + setFeatureFlags: (_, { featureFlags }) => { const flags: FeatureFlagsSet = {} for (const flag of featureFlags) { flags[flag] = true } - return flags + return spyOnFeatureFlags(flags) }, }, ], From ce97a83160083d9ebc203aa85ee7756d648f94fa Mon Sep 17 00:00:00 2001 From: Marius Andra Date: Thu, 3 Dec 2020 11:35:27 +0100 Subject: [PATCH 2/2] add comment and simplify code --- frontend/src/lib/logic/featureFlagLogic.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/logic/featureFlagLogic.ts b/frontend/src/lib/logic/featureFlagLogic.ts index d093f4b9cf94..99fcb0e1dd5a 100644 --- a/frontend/src/lib/logic/featureFlagLogic.ts +++ b/frontend/src/lib/logic/featureFlagLogic.ts @@ -28,12 +28,14 @@ function spyOnFeatureFlags(featureFlags: FeatureFlagsSet): FeatureFlagsSet { { get(_, flag) { const flagString = flag.toString() - notifyFlagIfNeeded(flagString, !!featureFlags[flagString]) - return featureFlags[flagString] + const flagState = !!featureFlags[flagString] + notifyFlagIfNeeded(flagString, flagState) + return flagState }, } ) } else { + // Fallback for IE11. Won't track "false" results. ¯\_(ツ)_/¯ const flags: FeatureFlagsSet = {} for (const flag of Object.keys(featureFlags)) { Object.defineProperty(flags, flag, {