import { ControllerRenderProps, UseFormReturn } from 'react-hook-form' import { useFlag, useParams } from 'common' import { useDefaultRegionQuery } from 'data/misc/get-default-region-query' import { useOrganizationAvailableRegionsQuery } from 'data/organizations/organization-available-regions-query' import { BASE_PATH, PROVIDERS } from 'lib/constants' import type { CloudProvider } from 'shared-data' import { Badge, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectLabel_Shadcn_, SelectSeparator_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, Select_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { getAvailableRegions } from './ProjectCreation.utils' interface RegionSelectorProps { cloudProvider: CloudProvider field: ControllerRenderProps form: UseFormReturn layout?: 'vertical' | 'horizontal' } // [Joshen] Let's use a library to maintain the flag SVGs in the future // I tried using https://flagpack.xyz/docs/development/react/ but couldn't get it to render // ^ can try again next time export const RegionSelector = ({ cloudProvider, field, layout = 'horizontal', }: RegionSelectorProps) => { const { slug } = useParams() const smartRegionEnabled = useFlag('enableSmartRegion') const { isLoading: isLoadingDefaultRegion } = useDefaultRegionQuery( { cloudProvider }, { enabled: !smartRegionEnabled } ) const { data: availableRegionsData, isLoading: isLoadingAvailableRegions } = useOrganizationAvailableRegionsQuery( { slug, cloudProvider, }, { enabled: smartRegionEnabled } ) const smartRegions = availableRegionsData?.all.smartGroup ?? [] const allRegions = availableRegionsData?.all.specific ?? [] const recommendedSmartRegions = new Set( [availableRegionsData?.recommendations.smartGroup.code].filter(Boolean) ) const recommendedSpecificRegions = new Set( availableRegionsData?.recommendations.specific.map((region) => region.code) ) const availableRegions = getAvailableRegions(PROVIDERS[cloudProvider].id) const regionsArray = Object.entries(availableRegions).map(([key, value]) => { return { code: value.code, name: value.displayName, provider: cloudProvider, } }) const regionOptions = smartRegionEnabled ? allRegions : regionsArray const isLoading = smartRegionEnabled ? isLoadingAvailableRegions : isLoadingDefaultRegion const showNonProdFields = process.env.NEXT_PUBLIC_ENVIRONMENT === 'local' || process.env.NEXT_PUBLIC_ENVIRONMENT === 'staging' return (

Select the region closest to your users for the best performance.

{showNonProdFields && (

Note: Only US (NV), Frankfurt and SG are supported for local/staging projects

)} } > {smartRegionEnabled && ( <> Smart Region Selection {smartRegions.map((value) => { return (
region icon {value.name}
{recommendedSmartRegions.has(value.code) && ( Recommended )}
) })}
)} All Regions {regionOptions.map((value) => { return (
region icon {value.name}
{recommendedSpecificRegions.has(value.code) && ( Recommended )}
) })}
) }