import { useParams } from 'common' import { UseFormReturn, useWatch } from 'react-hook-form' import { Button, FormControl, FormField, FormInputGroupInput, InputGroup, InputGroupAddon, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { DiskStorageSchemaType } from '../DiskManagement.schema' import { calculateComputeSizeRequiredForIops, mapAddOnVariantIdToComputeSize, } from '../DiskManagement.utils' import { ComputeSizeRecommendationSection } from '../ui/ComputeSizeRecommendationSection' import { DiskType, RESTRICTED_COMPUTE_FOR_IOPS_ON_GP3 } from '../ui/DiskManagement.constants' import { DiskManagementIOPSReadReplicas } from '../ui/DiskManagementReadReplicas' import { useDiskAttributesQuery } from '@/data/config/disk-attributes-query' type IOPSFieldProps = { form: UseFormReturn disableInput: boolean } export function IOPSField({ form, disableInput }: IOPSFieldProps) { const { ref: projectRef } = useParams() const { control, formState, setValue, trigger, getValues } = form const watchedStorageType = useWatch({ control, name: 'storageType' }) const watchedComputeSize = useWatch({ control, name: 'computeSize' }) const watchedIOPS = useWatch({ control, name: 'provisionedIOPS' }) ?? 0 const { isError } = useDiskAttributesQuery({ projectRef }) const disableIopsInput = RESTRICTED_COMPUTE_FOR_IOPS_ON_GP3.includes(watchedComputeSize) && watchedStorageType === 'gp3' return ( { const reccomendedComputeSize = calculateComputeSizeRequiredForIops(watchedIOPS) return (

Use higher IOPS for high-throughput apps.

{ setValue('computeSize', reccomendedComputeSize ?? 'ci_nano') trigger('provisionedIOPS') }} > Update to {mapAddOnVariantIdToComputeSize(reccomendedComputeSize)} } /> {!formState.errors.provisionedIOPS && ( )} } labelOptional={

Input/output operations per second.

} > { setValue('provisionedIOPS', e.target.valueAsNumber, { shouldDirty: true, shouldValidate: true, }) }} /> IOPS
) }} /> ) }