diff --git a/frontend/src/scenes/experiments/ExperimentForm.tsx b/frontend/src/scenes/experiments/ExperimentForm.tsx
index c0d58cfc5626b..ebf717865a68e 100644
--- a/frontend/src/scenes/experiments/ExperimentForm.tsx
+++ b/frontend/src/scenes/experiments/ExperimentForm.tsx
@@ -18,9 +18,8 @@ const ExperimentFormFields = (): JSX.Element => {
const { experiment, groupTypes, aggregationLabel } = useValues(experimentLogic)
const { addVariant, removeExperimentGroup, setExperiment, createExperiment, setExperimentType } =
useActions(experimentLogic)
- const { webExperimentsAvailable } = useValues(experimentsLogic)
+ const { webExperimentsAvailable, unavailableFeatureFlagKeys } = useValues(experimentsLogic)
const { groupsAccessStatus } = useValues(groupsAccessLogic)
- const { takenKeys } = useValues(experimentsLogic)
return (
@@ -40,14 +39,14 @@ const ExperimentFormFields = (): JSX.Element => {
{
setExperiment({
- feature_flag_key: generateFeatureFlagKey(experiment.name, takenKeys),
+ feature_flag_key: generateFeatureFlagKey(
+ experiment.name,
+ unavailableFeatureFlagKeys
+ ),
})
}}
>
@@ -294,7 +293,7 @@ export function ExperimentForm(): JSX.Element {
)
}
-const generateFeatureFlagKey = (name: string, takenKeys: string[]): string => {
+const generateFeatureFlagKey = (name: string, unavailableFeatureFlagKeys: Set): string => {
const baseKey = name
.toLowerCase()
.replace(/[^A-Za-z0-9-_]+/g, '-')
@@ -303,7 +302,8 @@ const generateFeatureFlagKey = (name: string, takenKeys: string[]): string => {
let key = baseKey
let counter = 1
- while (takenKeys.includes(key)) {
+
+ while (unavailableFeatureFlagKeys.has(key)) {
key = `${baseKey}-${counter}`
counter++
}
diff --git a/frontend/src/scenes/experiments/experimentsLogic.ts b/frontend/src/scenes/experiments/experimentsLogic.ts
index 361414fb2bf64..ff79c0936bf32 100644
--- a/frontend/src/scenes/experiments/experimentsLogic.ts
+++ b/frontend/src/scenes/experiments/experimentsLogic.ts
@@ -7,6 +7,7 @@ import api from 'lib/api'
import { FEATURE_FLAGS } from 'lib/constants'
import { lemonToast } from 'lib/lemon-ui/LemonToast/LemonToast'
import { featureFlagLogic, FeatureFlagsSet } from 'lib/logic/featureFlagLogic'
+import { featureFlagsLogic, type FeatureFlagsResult } from 'scenes/feature-flags/featureFlagsLogic'
import { projectLogic } from 'scenes/projectLogic'
import { userLogic } from 'scenes/userLogic'
@@ -44,6 +45,8 @@ export const experimentsLogic = kea([
['user', 'hasAvailableFeature'],
featureFlagLogic,
['featureFlags'],
+ featureFlagsLogic,
+ ['featureFlags'],
router,
['location'],
],
@@ -161,10 +164,15 @@ export const experimentsLogic = kea([
() => [featureFlagLogic.selectors.featureFlags],
(featureFlags: FeatureFlagsSet) => featureFlags[FEATURE_FLAGS.WEB_EXPERIMENTS],
],
- // This only checks the first page, which is very large so it's not a big deal
- takenKeys: [
- (s) => [s.experiments],
- (experiments: Experiment[]) => experiments.map((experiment) => experiment.feature_flag_key),
+ // TRICKY: we do not load all feature flags here, just the latest ones.
+ unavailableFeatureFlagKeys: [
+ (s) => [featureFlagsLogic.selectors.featureFlags, s.experiments],
+ (featureFlags: FeatureFlagsResult, experiments: Experiment[]) => {
+ return new Set([
+ ...featureFlags.results.map((flag) => flag.key),
+ ...experiments.map((experiment) => experiment.feature_flag_key),
+ ])
+ },
],
})),
events(({ actions }) => ({