diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.tsx index 44b4841fbb4..f56ec5c6820 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.tsx @@ -26,6 +26,7 @@ import { RetrieveTableResult } from 'data/tables/table-retrieve-query' import { getTables } from 'data/tables/tables-query' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { isValidExperimentVariant } from 'hooks/misc/useTableCreateGeneratePolicies' import { useConfirmOnClose, type ConfirmOnCloseModalProps } from 'hooks/ui/useConfirmOnClose' import { usePHFlag } from 'hooks/ui/useFlag' import { useUrlState } from 'hooks/ui/useUrlState' @@ -140,7 +141,7 @@ export const SidePanelEditor = ({ const { data: project } = useSelectedProjectQuery() const { data: org } = useSelectedOrganizationQuery() const getImpersonatedRoleState = useGetImpersonatedRoleState() - const generatePoliciesFlag = usePHFlag('tableCreateGeneratePolicies') + const generatePoliciesFlag = usePHFlag('tableCreateGeneratePolicies') const [isEdited, setIsEdited] = useState(false) @@ -551,10 +552,10 @@ export const SidePanelEditor = ({ } // Track experiment conversion if user is in the experiment - if (generatePoliciesFlag !== undefined) { + if (isValidExperimentVariant(generatePoliciesFlag)) { track('table_create_generate_policies_experiment_converted', { experiment_id: 'tableCreateGeneratePolicies', - variant: generatePoliciesFlag ? 'treatment' : 'control', + variant: generatePoliciesFlag, has_rls_enabled: isRLSEnabled, has_rls_policies: generatedPolicies.length > 0, has_generated_policies: generatedPolicies.length > 0, diff --git a/apps/studio/hooks/misc/useTableCreateGeneratePolicies.ts b/apps/studio/hooks/misc/useTableCreateGeneratePolicies.ts index 92cf14dee2d..ca217aff132 100644 --- a/apps/studio/hooks/misc/useTableCreateGeneratePolicies.ts +++ b/apps/studio/hooks/misc/useTableCreateGeneratePolicies.ts @@ -8,6 +8,19 @@ import { useTrack } from 'lib/telemetry/track' dayjs.extend(utc) +export type TableCreateGeneratePoliciesVariant = 'control' | 'variation' + +const VALID_VARIANTS: TableCreateGeneratePoliciesVariant[] = ['control', 'variation'] + +export function isValidExperimentVariant( + value: unknown +): value is TableCreateGeneratePoliciesVariant { + return ( + typeof value === 'string' && + VALID_VARIANTS.includes(value as TableCreateGeneratePoliciesVariant) + ) +} + interface UseTableCreateGeneratePoliciesOptions { /** * Whether this is a new table being created @@ -38,12 +51,12 @@ export function useTableCreateGeneratePolicies({ projectInsertedAt, }: UseTableCreateGeneratePoliciesOptions): UseTableCreateGeneratePoliciesResult { const track = useTrack() - const tableCreateGeneratePoliciesFlag = usePHFlag('tableCreateGeneratePolicies') + const tableCreateGeneratePoliciesFlag = usePHFlag('tableCreateGeneratePolicies') const hasTrackedExposure = useRef(false) const enabled = useMemo(() => { if (!IS_PLATFORM) return false - if (!tableCreateGeneratePoliciesFlag) return false + if (tableCreateGeneratePoliciesFlag !== 'variation') return false return true }, [tableCreateGeneratePoliciesFlag]) @@ -51,7 +64,7 @@ export function useTableCreateGeneratePolicies({ if (!IS_PLATFORM) return if (hasTrackedExposure.current) return if (!isNewRecord) return - if (tableCreateGeneratePoliciesFlag === undefined) return + if (!isValidExperimentVariant(tableCreateGeneratePoliciesFlag)) return if (!projectInsertedAt) return try { @@ -61,7 +74,7 @@ export function useTableCreateGeneratePolicies({ const daysSinceCreation = dayjs.utc().diff(insertedDate, 'day') track('table_create_generate_policies_experiment_exposed', { experiment_id: 'tableCreateGeneratePolicies', - variant: tableCreateGeneratePoliciesFlag ? 'treatment' : 'control', + variant: tableCreateGeneratePoliciesFlag, days_since_project_creation: daysSinceCreation, }) hasTrackedExposure.current = true diff --git a/packages/common/telemetry-constants.ts b/packages/common/telemetry-constants.ts index 7b6d573fd19..3d8be8c9a00 100644 --- a/packages/common/telemetry-constants.ts +++ b/packages/common/telemetry-constants.ts @@ -2046,9 +2046,9 @@ export interface TableCreateGeneratePoliciesExperimentConvertedEvent { */ experiment_id: 'tableCreateGeneratePolicies' /** - * Experiment variant: 'control' (feature disabled) or 'treatment' (feature enabled) + * Experiment variant: 'control' (feature disabled) or 'variation' (feature enabled) */ - variant: 'control' | 'treatment' + variant: 'control' | 'variation' /** * Whether RLS was enabled on the table */ @@ -2058,7 +2058,7 @@ export interface TableCreateGeneratePoliciesExperimentConvertedEvent { */ has_rls_policies: boolean /** - * Whether AI-generated policies were used (only possible in treatment) + * Whether AI-generated policies were used (only possible in variation) */ has_generated_policies: boolean } @@ -2080,9 +2080,9 @@ export interface TableCreateGeneratePoliciesExperimentExposedEvent { */ experiment_id: 'tableCreateGeneratePolicies' /** - * Experiment variant: 'control' (feature disabled) or 'treatment' (feature enabled) + * Experiment variant: 'control' (feature disabled) or 'variation' (feature enabled) */ - variant: 'control' | 'treatment' + variant: 'control' | 'variation' /** * Days since project creation (to segment by new user cohorts) */