From caff879a713256a4546a515475d0e1c9744487ef Mon Sep 17 00:00:00 2001 From: Dylan Martin Date: Thu, 17 Oct 2024 18:38:19 +0200 Subject: [PATCH] fix(flags): update payloads object when removing variants (#25580) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../src/scenes/feature-flags/FeatureFlag.tsx | 2 +- .../scenes/feature-flags/featureFlagLogic.ts | 35 ++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/frontend/src/scenes/feature-flags/FeatureFlag.tsx b/frontend/src/scenes/feature-flags/FeatureFlag.tsx index 4e219519fd837..21bd124d956c9 100644 --- a/frontend/src/scenes/feature-flags/FeatureFlag.tsx +++ b/frontend/src/scenes/feature-flags/FeatureFlag.tsx @@ -638,7 +638,7 @@ function UsageTab({ featureFlag }: { id: string; featureFlag: FeatureFlagType }) ) { enrichUsageDashboard() } - }, [dashboard]) + }, [dashboard, hasEnrichedAnalytics, enrichUsageDashboard]) const propertyFilter: AnyPropertyFilter[] = [ { diff --git a/frontend/src/scenes/feature-flags/featureFlagLogic.ts b/frontend/src/scenes/feature-flags/featureFlagLogic.ts index db2811ef1f44b..65026ccfd3453 100644 --- a/frontend/src/scenes/feature-flags/featureFlagLogic.ts +++ b/frontend/src/scenes/feature-flags/featureFlagLogic.ts @@ -38,6 +38,7 @@ import { FilterType, InsightModel, InsightType, + JsonType, MultivariateFlagOptions, MultivariateFlagVariant, NewEarlyAccessFeatureType, @@ -133,9 +134,11 @@ export const variantKeyToIndexFeatureFlagPayloads = (flag: FeatureFlagType): Fea return flag } - const newPayloads = {} + const newPayloads: Record = {} flag.filters.multivariate?.variants.forEach((variant, index) => { - newPayloads[index] = flag.filters.payloads?.[variant.key] + if (flag.filters.payloads?.[variant.key] !== undefined) { + newPayloads[index] = flag.filters.payloads[variant.key] + } }) return { ...flag, @@ -148,11 +151,10 @@ export const variantKeyToIndexFeatureFlagPayloads = (flag: FeatureFlagType): Fea const indexToVariantKeyFeatureFlagPayloads = (flag: Partial): Partial => { if (flag.filters?.multivariate) { - const newPayloads = {} - flag.filters?.multivariate?.variants.forEach(({ key }, index) => { - const payload = flag.filters?.payloads?.[index] - if (payload) { - newPayloads[key] = payload + const newPayloads: Record = {} + flag.filters.multivariate.variants.forEach(({ key }, index) => { + if (flag.filters?.payloads?.[index] !== undefined) { + newPayloads[key] = flag.filters.payloads[index] } }) return { @@ -319,6 +321,22 @@ export const featureFlagLogic = kea([ } const variants = [...(state.filters.multivariate?.variants || [])] variants.splice(index, 1) + + const currentPayloads = { ...state.filters.payloads } + const newPayloads: Record = {} + + // TRICKY: In addition to modifying the variant array, we also need to shift the payload indices + // because the variant array is being modified and we need to make sure that the payloads object + // stays in sync with the variant array. + Object.keys(currentPayloads).forEach((key) => { + const payloadIndex = parseInt(key) + if (payloadIndex > index) { + newPayloads[payloadIndex - 1] = currentPayloads[payloadIndex] + } else if (payloadIndex < index) { + newPayloads[payloadIndex] = currentPayloads[payloadIndex] + } + }) + return { ...state, filters: { @@ -327,6 +345,7 @@ export const featureFlagLogic = kea([ ...state.filters.multivariate, variants, }, + payloads: newPayloads, }, } }, @@ -642,7 +661,7 @@ export const featureFlagLogic = kea([ createScheduledChange: async () => { const { scheduledChangeOperation, scheduleDateMarker, currentTeamId, schedulePayload } = values - const fields = { + const fields: Record = { [ScheduledChangeOperationType.UpdateStatus]: 'active', [ScheduledChangeOperationType.AddReleaseCondition]: 'filters', }