Files
supabase/apps/studio/hooks/misc/useTableCreateGeneratePolicies.ts
9f3af6e502 Generate policies experiment (#40881)
* policy generation

* add ai

* refactor

* table create performance

* policy list

* style

* simplify

* refactor

* flag

* tracking

* track

* ts

* fixes

* connection string

* re-add rls and realtime toggle

* restore old logic

* base path

* badge

* false rls

* copy

* add permissions button

* Refactor based on comments

* Fix TS

* More nudge

* Update tests

* Fix test

* Fixx

* Fix

* Address feedback

* Address issues

* Improve experiment telemetry for generate policies A/B test (#41172)

* Address code rabbit catch

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
Co-authored-by: Sean Oliver <882952+seanoliver@users.noreply.github.com>
2025-12-12 12:44:11 +08:00

77 lines
2.2 KiB
TypeScript

import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import { useEffect, useMemo, useRef } from 'react'
import { usePHFlag } from 'hooks/ui/useFlag'
import { IS_PLATFORM } from 'lib/constants'
import { useTrack } from 'lib/telemetry/track'
dayjs.extend(utc)
interface UseTableCreateGeneratePoliciesOptions {
/**
* Whether this is a new table being created
*/
isNewRecord?: boolean
/**
* Project creation timestamp
*/
projectInsertedAt?: string
}
interface UseTableCreateGeneratePoliciesResult {
/**
* Whether the generate policies feature is enabled
*/
enabled: boolean
}
/**
* Hook to manage the table create generate policies feature flag.
* Handles feature flag determination and exposure tracking.
*
* @param options Configuration for feature targeting
* @returns Feature state including whether it's enabled
*/
export function useTableCreateGeneratePolicies({
isNewRecord = false,
projectInsertedAt,
}: UseTableCreateGeneratePoliciesOptions): UseTableCreateGeneratePoliciesResult {
const track = useTrack()
const tableCreateGeneratePoliciesFlag = usePHFlag<boolean>('tableCreateGeneratePolicies')
const hasTrackedExposure = useRef(false)
const enabled = useMemo(() => {
if (!IS_PLATFORM) return false
if (!tableCreateGeneratePoliciesFlag) return false
return true
}, [tableCreateGeneratePoliciesFlag])
useEffect(() => {
if (!IS_PLATFORM) return
if (hasTrackedExposure.current) return
if (!isNewRecord) return
if (tableCreateGeneratePoliciesFlag === undefined) return
if (!projectInsertedAt) return
try {
const insertedDate = dayjs.utc(projectInsertedAt)
if (!insertedDate.isValid()) return
const daysSinceCreation = dayjs.utc().diff(insertedDate, 'day')
track('table_create_generate_policies_experiment_exposed', {
experiment_id: 'tableCreateGeneratePolicies',
variant: tableCreateGeneratePoliciesFlag ? 'treatment' : 'control',
days_since_project_creation: daysSinceCreation,
})
hasTrackedExposure.current = true
} catch {
hasTrackedExposure.current = false
}
}, [isNewRecord, tableCreateGeneratePoliciesFlag, projectInsertedAt, track])
return {
enabled,
}
}