import { useParams } from 'common' import { UseFormReturn } 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, calculateIOPSPrice, mapAddOnVariantIdToComputeSize, } from '../DiskManagement.utils' import { BillingChangeBadge } from '../ui/BillingChangeBadge' 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, watch } = form const watchedStorageType = watch('storageType') const watchedComputeSize = watch('computeSize') const watchedIOPS = watch('provisionedIOPS') ?? 0 const { isError } = useDiskAttributesQuery({ projectRef }) const iopsPrice = calculateIOPSPrice({ oldStorageType: formState.defaultValues?.storageType as DiskType, oldProvisionedIOPS: formState.defaultValues?.provisionedIOPS || 0, newStorageType: getValues('storageType') as DiskType, newProvisionedIOPS: getValues('provisionedIOPS'), }) 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
) }} /> ) }