Files
supabase/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx
T
d633ced97d Feat/new project creation experiment (#31237)
* some early ideas

* better approach

* fix globe stuff

* add initial step

* reset and submit button for chat

* cleanup

* remove www

* more clean up

* mobile and more cleanup

* fixes

* update advanced and security

* fix project checks

* connect form

* fix reset and tidied up other things

* add layout options

* a/b test

* add offset

* add ab test

* remove www packages

* remove www

* package

* update coordinates

* feat: create ProjectCreationInitialStepSubmittedEvent

* feat: add event for capturing intention of prompting

* fix: bring pnpm-lock up to date

* fix ts errors

* fix globe

* fix globe animation

* fix ts

* remove imports and tools

* update module resolution

* global redirect

* delay rendering

* Update apps/studio/pages/new/[slug].tsx

Co-authored-by: Alaister Young <alaister@users.noreply.github.com>

* take directly to v2 via project create dropdown

* move redirect to useEffect

* feat: distinguish events between initial and second step

* feat: emit an event when create project is clicked on new/v2

* fix: correct event type defs

* remove unused imports

* Various clean ups

* improvements

* Minor refactors

* clean up

* ts fixes

---------

Co-authored-by: Long Hoang <1732217+loong@users.noreply.github.com>
Co-authored-by: Alaister Young <alaister@users.noreply.github.com>
Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2025-01-17 09:59:21 +10:00

123 lines
4.0 KiB
TypeScript

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<any, 'postgresVersionSelection'>
form: UseFormReturn<any>
layout?: 'vertical' | 'horizontal'
}
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,
layout = 'horizontal',
}: 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 (
<FormItemLayout label="Postgres Version" layout={layout}>
<Select_Shadcn_
value={field.value}
onValueChange={field.onChange}
disabled={availableVersions.length <= 1 || isLoadingProjectVersions}
>
<SelectTrigger_Shadcn_ className="[&>:nth-child(1)]:w-full [&>:nth-child(1)]:flex [&>:nth-child(1)]:items-start">
<SelectValue_Shadcn_ placeholder="Select a Postgres version for your project" />
</SelectTrigger_Shadcn_>
<SelectContent_Shadcn_>
<SelectGroup_Shadcn_>
{availableVersions.map((value) => {
const postgresVersion = value.version
.split('supabase-postgres-')[1]
.replace('-orioledb', '')
return (
<SelectItem_Shadcn_
key={formatValue(value)}
value={formatValue(value)}
className="w-full [&>:nth-child(2)]:w-full"
>
<div className="flex flex-row items-center justify-between w-full">
<span className="text-foreground">{postgresVersion}</span>
<div>
{value.release_channel !== 'ga' && (
<Badge variant="warning" className="mr-1 capitalize">
{value.release_channel}
</Badge>
)}
{value.postgres_engine.includes('oriole') && (
<Badge variant="default" className="mr-1">
OrioleDB
</Badge>
)}
</div>
</div>
</SelectItem_Shadcn_>
)
})}
</SelectGroup_Shadcn_>
</SelectContent_Shadcn_>
</Select_Shadcn_>
</FormItemLayout>
)
}