import { useEffect } from 'react' import { ControllerRenderProps, UseFormReturn } from 'react-hook-form' import { components } from 'api-types' import { ProjectCreationPostgresVersion, useProjectCreationPostgresVersionsQuery, } from 'data/config/project-creation-postgres-versions-query' import type { CloudProvider } from 'shared-data' import { Badge, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, Select_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' type ReleaseChannel = components['schemas']['ReleaseChannel'] type PostgresEngine = components['schemas']['PostgresEngine'] interface PostgresVersionDetails { postgresEngine: PostgresEngine | undefined releaseChannel: ReleaseChannel | undefined } interface PostgresVersionSelectorProps { cloudProvider: CloudProvider dbRegion: string organizationSlug: string | undefined field: ControllerRenderProps form: UseFormReturn } const formatValue = ({ postgres_engine, release_channel }: ProjectCreationPostgresVersion) => { return `${postgres_engine}|${release_channel}` } export const extractPostgresVersionDetails = (value: string): PostgresVersionDetails => { if (!value) { return { postgresEngine: undefined, releaseChannel: undefined } } const [postgresEngine, releaseChannel] = value.split('|') return { postgresEngine, releaseChannel } as PostgresVersionDetails } export const PostgresVersionSelector = ({ cloudProvider, dbRegion, organizationSlug, field, form, }: PostgresVersionSelectorProps) => { const { data, isLoading: isLoadingProjectVersions, isSuccess, } = useProjectCreationPostgresVersionsQuery({ cloudProvider, dbRegion, organizationSlug, }) const availableVersions = (data?.available_versions ?? []).sort((a, b) => a.version.localeCompare(b.version) ) useEffect(() => { const defaultValue = availableVersions[0] ? formatValue(availableVersions[0]) : undefined form.setValue('postgresVersionSelection', defaultValue) }, [isSuccess, form]) return ( {availableVersions.map((value) => { const postgresVersion = value.version .split('supabase-postgres-')[1] .replace('-orioledb', '') return (
{postgresVersion}
{value.release_channel !== 'ga' && ( {value.release_channel} )} {value.postgres_engine.includes('oriole') && ( OrioleDB )}
) })}
) }